apache工作模式及虚拟主机的配置

apache的工作模式

MPM

名词解释MPM   Multipath Process Module 多道处理模块。Linux中常使用prefork

worker event三种MPM 即apache常用的三种工作模式。

prefork

prefork为多进程模型,每个进程响应一个请求。其工作过程简单说来就是一个主进程:负责生成n个
子进程(子进程也称为工作进程),每个子进程处理一个用户请求;即使没有用户请求,也会预先生成
多个空闲进程,随时等待请求到达;子进程最大不会超过1024个;
prefork有以下几个特点:
主进程只负责接收,不负责处理和响应
主进程为监听套接字;子进程为连接套接字
主进程使用80端口,子进程使用非80端口
prefork模式极为稳定,任何一个进程崩溃了都不会影响其他进程

worker

worker为多线程模型,每个线程响应一个请求;其工作过程简单说来就是一个主进程,生成多个子进
程,每个子进程负责生成多个线程,每个线程响应一个请求;因此如果有m个进程,n个线程:则最大并
发响应数为m*n
worker有以下的特点:
无论有没有请求到达,子进程都会预先生成几个空闲线程。当用户请求到达时,它会用预先生成的线程
去响应,而不是临时生成进程,以便达到快速响应的目的。
注:线程不比进程轻量级,内部调度进程和线程是一样的,worker比起prefork并没有显著的提升,
只是可以作为另一种方案

event

event为事件驱动模型,每个线程响应n个请求;一个主进程:生成m个子进程,每个进程直接响应n个
请求;
需要注意的是在httpd-2.2中, event为测试使用;而在httpd-2.4中,event可直接用于生产环境

httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制

1.查看当前的工作模式

root 15000 0.0 0.3 177804 3924 ? Ss 00:48 0:00 /usr/sbin/htt
pd
apache 15002 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15003 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15004 0.0 0.2 177804 2528 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15005 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15006 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15007 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15008 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15009 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
名词解释MPM MultipathP rocessModule 多道处理模块。Linux中常使用prefork
worker event三种MPM 即apache常用的三种工作模式。
pd
root 15033 0.0 0.0 103244 872 pts/0 S+ 00:51 0:00 grep httpd
[root@local ~]# httpd -l
#查看核心中编译的静态模块,默认为prefork模块
compiled in modules:
core.c #httpd的核心模块
prefork.c #prefork模块
http_core.c #http功能的核心模块
mod_so.c #支持模块动态装卸
[root@local ~]# httpd.event –l
#如果当前加载的是event模块,需要这样查
Compiled in modules:
core.c
event.c
http_core.c
mod_so.c
[root@local ~]# httpd -M #查看静态编译及动态装载的所有模块
#因这些模块不是本次博文的重点,因此这里不做赘述

2.更改当前的工作模式为worker模式

[root@local ~]# vim /etc/sysconfig/httpd #编辑配置文件
HTTPD=/usr/sbin/httpd.worker #将前面的注释去掉,保存退出
[root@local ~]# service httpd restart #重启服务
[root@local ~]# ps aux | grep httpd
root 15090 0.0 0.4 178012 4104 ? Ss 01:01 0:00 /usr/sbin/htt
pd.worker
apache 15093 0.0 0.5 522272 5368 ? Sl 01:01 0:00 /usr/sbin/htt
pd.worker
apache 15094 0.0 0.5 587808 5384 ? Sl 01:01 0:00 /usr/sbin/htt
pd.worker
apache 15095 0.0 0.5 522272 5372 ? Sl 01:01 0:00 /usr/sbin/htt
pd.worker
root 15205 0.0 0.0 103244 876 pts/0 S+ 01:01 0:00 grep httpd
此时工作模式已更改为worker模式

3.工作模式的配置

prefork的配置:
<IfModule prefork.c>
StartServers 8 #服务启动时启动的进程数
MinSpareServers 5 #最小空闲进程数
MaxSpareServers 20 #最大空闲进程数
ServerLimit 256
#服务器端进程数上限,通常与下面的值相等
MaxClients 256
#服务器端所允许启动的最多进程数(最多允许多少个客户端同时请求响应)
MaxRequestsPerChild 4000
#服务器的一个子进程最多响应多少次请求
</IfModule>
worker的配置:
<IfModule worker.c>
StartServers 4
MaxClients 300 #服务器最大启动的线程数
MinSpareThreads 25 #最小空闲线程数
MaxSpareThreads 75 #最大空闲线程数
ThreadsPerChild 25 #每个进程启动的线程数
MaxRequestsPerChild 0 #0表示不做限制
</IfModule>

虚拟主机

有三种实现方案:
基于ip:
为每个虚拟主机准备至少一个ip地址;
基于port:
为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:
为每个虚拟主机准备至少一个专用hostname;最有用
可混合使用上述三种方式中任意方式;

注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;禁用中心主机:注释DocumentRoot

每个虚拟主机都有专用配置:

<VirtualHost "IP:PORT">
SeverName
DocumentRoot ""
</VirtualHost>
#大多数用在中心主机的配置都可在虚拟主机中使用
ServerAlias #虚拟主机的别名
ErrorLog
CustomLog
<Directory "">
</Directory>

下面由三个示例来说明虚拟主机的配置

[root@root ~]# mkdir -pv /vhosts/{web1,web2,web3,web4}/htdocs
mkdir: created directory `/vhosts'
mkdir: created directory `/vhosts/web1'
mkdir: created directory `/vhosts/web1/htdocs'
mkdir: created directory `/vhosts/web2'
mkdir: created directory `/vhosts/web2/htdocs'
mkdir: created directory `/vhosts/web3'
mkdir: created directory `/vhosts/web3/htdocs'
mkdir: created directory `/vhosts/web4'
mkdir: created directory `/vhosts/web4/htdocs'
[root@root ~]# vim /vhosts/web1/htdocs/index.html
page at web1
[root@root ~]# vim /vhosts/web2/htdocs/index.html
page at web2
[root@root ~]# ip addr add 192.168.1.4/24 dev eth0
[root@root ~]# ip addr list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP q
len 1000
link/ether 00:0c:29:01:9c:d0 brd ff:ff:ff:ff:ff:ff
inet `192.168.1.3/24` brd 192.168.1.255 scope global eth0
inet `192.168.1.4/24`scope global secondary eth0
# `` 仅表示强调
inet6 fe80::20c:29ff:fe01:9cd0/64 scope link
valid_lft forever preferred_lft forever

示例1:基于ip

<VirtualHost 192.168.1.3:80> 
ServerName web1.willie.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 192.168.1.4:80> 
ServerName web2.willie.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
[root@root ~]# httpd -t #测试语法是否正确
[root@root ~]# service httpd reload

b2dd95013570a85ebad22a76c4bfb17b.png

726d5b9cc6c807be22706b26fb44f55e.png

示例2:基于port

<VirtualHost 192.168.1.4:80> 
ServerName web2.willie.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
<VirtualHost 192.168.1.4:8080> 
ServerName web3.willie.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
Listen 8080 #确保监听8080端口
[root@root ~]# service httpd restart #端口改变,重启服务

7f5f8e4336b720ac80935c9f012df5ee.png

16fa1e6c8328c14f2dc149a9e54944e5.png

示例3:基于hostname

<VirtualHost 192.168.1.3:80>
ServerName web1.willie.com 
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 192.168.1.3:80>
ServerName web2.willie.com 
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
<VirtualHost 192.168.1.3:80>
ServerName web3.willie.com 
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
[root@root ~]# service httpd reload

因为没有配DNS,我们用另外一台虚拟机修改hosts文件做访问

[root@localhost ~]# curl http://web1.willie.com
page at web1
[root@localhost ~]# curl http://web2.willie.com
page at web2
[root@localhost ~]# curl http://web3.willie.com
page at web3

原创文章,作者:Net17_得得,如若转载,请注明出处:http://www.178linux.com/21446

(0)
Net17_得得Net17_得得
上一篇 2016-07-02 19:23
下一篇 2016-07-03 14:58

相关推荐

  • linux中权限管理

    权限的描述:           权限的意思就是用户拥有的对系统支配能力的大小在linux中是严格控制用户权限的,不同的用户给予不同的权限,权限应遵循能少给就尽量少给的原则从而增加系统的安全性。 进程安全上下文:    进程对问件访问权限的应用模型:进程的属主与文件的属主是否相同,如果相同…

    系统运维 2016-08-05
  • 高级变量-有类型变量

    一.高级变量用法– 有类型变量   Shell 变量一般是无类型的,但是bash Shell 提供了declare和 typeset 两个命令用于指定变量的类型,两个命令是等价的 declare [ 选项]  变量名 -r  将变量设置为只读属性 -i  将变量定义为整型数 -a  将变量定义为数…

    Linux干货 2016-11-24
  • LInux基本常识和几个基本命令的用法

    1.默认系统管理员root 1)在Linux中,创建系统的同时,会创建一个超级用户,对系统拥有绝对权限。 2)每个账户的文件都被放在各自的家目录中,管理员家目录:/root 3)每个帐号会有一个uid号对应,管理员uid=0   cengOS7之前的版本一般用户uid从500开始   centOS7之后的版本一般用户uid从1000开始 …

    Linux干货 2016-07-23
  • 无痛之ext3升ext4[原创]

    一台文件存储服务器单目录下子目录已经突破31998数限制,造成无法继续创建子目录,服务器系统环境为CentOS5.4 内核版本为2.6.18。解决方案只能是升级到ext4文件系统,首先到https://ext4.wiki.kernel.org/index.php/Ext4_Howto查了一下资料,文中的第一句便是“Ext4 was released as a…

    Linux干货 2015-03-27
  • 正则

    Edit 正则 概述: 正则表达式,Regular Expression,缩写regex、regexp、RE 正则表达式是文本处理极为重要的技术,用它可以对字符串按照某种规则进行检索、替换 1970年,Unix之父ken Thompson将正则表达式引入到Unix中文本编辑器ed和grep命令中,由此正则表达式普及开来 1980年后,perl语言对Henry…

    Linux干货 2017-11-06
  • Week 1 Linux Intro

    I.  Linux的各种发行版 All Kinds of Linux     在Linux诞生的20多年里,Linux衍变出了许许多多的版本,每个都有自己的名字,但它们的本质和它们的哲学观还是一样的。下面是从外网上扒下来的一张Linux进化图,跨度一直到了2016年。    &n…

    Linux干货 2016-06-26