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.www58058.com/21446