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

(0)
Net17_得得Net17_得得
上一篇 2016-07-02
下一篇 2016-07-03

相關推薦

  • vim編輯器

    一、vim簡介    vi: Visual Interface,文本編輯器     文本: ASCII, Unicode     文本編輯種類:         行編輯器: sed…

    Linux干貨 2016-08-10
  • 進程管理

    linux維護工作中,常常需要對系統上運行的程序進行管理,那么進程管理就顯得相當重要。 進程初識 什么是進程?   進程是并發執行的程序在執行過程中分配和管理資源的基本單位,是一個動態概念。它代表CPU所能處理的單個任務。 什么是線程?   線程是程序流執行的最小單元,可以理解為進程中執行的一段程序片段。 進程與線程聯…

    Linux干貨 2016-09-07
  • 磁盤管理

    linux的哲學思想:一切皆文件; 設備類型: 塊(block):隨機訪問,交換數據單位是“塊”; 字符(character):線性訪問,數據交換單位是“字符”; 設備文件:FHS /dev     設備文件:關聯至設備驅動程序;設備的訪問入口;       &nbsp…

    Linux干貨 2016-08-30
  • 高級變量-有類型變量

    一.高級變量用法– 有類型變量   Shell 變量一般是無類型的,但是bash Shell 提供了declare和 typeset 兩個命令用于指定變量的類型,兩個命令是等價的 declare [ 選項]  變量名 -r  將變量設置為只讀屬性 -i  將變量定義為整型數 -a  將變量定義為數…

    Linux干貨 2016-11-24
  • 馬哥教育網絡班20期+第2周課程練習

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 cp復制, mv剪切, rm移除 語法格式: cp復制  cp [OPTION]… [-T] SOURCE DEST  常用選項: -i:交互式 -r: 遞歸復制目錄及內部的所有內容 -a: 歸檔   演示: …

    Linux干貨 2016-07-12
  • Linux終端類型

            終端是一種字符型設備,它有多種類型,通常使用tty來簡稱各種類型的終端設備。 [root@localhost ~]# ll /dev|egrep 'tty|pts' crw-rw-rw-. 1&nb…

    Linux干貨 2016-10-14
欧美性久久久久