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
示例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 #端口改变,重启服务
示例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