1、Centos系統下實現httpd-2.2的安裝,并分別實現prefork、worker、event等幾種工作方式
(1)什么是MPM
Apache HTTP 服務器被設計為一個功能強大,并且靈活的 web 服務器, 可以在很多平臺與環境中工作。不同平臺和不同的環境往往需要不同 的特性,或可能以不同的方式實現相同的特性最有效率。Apache 通過模塊化的設計來適應各種環境。這種設計允許網站管理員通過在 編譯時或運行時,選擇哪些模塊將會加載在服務器中,來選擇服務器特性。
Apache 2.0 擴展此模塊化設計到最基本的 web 服務器功能。 它提供了可以選擇的多處理模塊(MPM),用來綁定到網絡端口上,接受請求, 以及調度子進程處理請求。
擴展到這一級別的服務器模塊化設計,帶來兩個重要的好處:
- Apache 能更優雅,更高效率的支持不同的平臺。尤其是 Apache 的 Windows 版本現在更有效率了,因為
mpm_winnt
能使用原生網絡特性取代在 Apache 1.3 中使用的 POSIX 層。它也可以擴展到其它平臺 來使用專用的 MPM。 - Apache 能更好的為有特殊要求的站點定制。例如,要求 更高伸縮性的站點可以選擇使用線程的 MPM,即
worker
或event
; 需要可靠性或者與舊軟件兼容的站點可以使用prefork
。
在用戶看來,MPM 很像其它 Apache 模塊。主要是區別是,在任何時間, 必須有一個,而且只有一個 MPM 加載到服務器中。
(2)MPM的三個模型:
prefork:多進程模型,一個進程響應一個請求;(兩級進程模型,父進程管理子進程,每一個子進程相應一個請求)。
優點:穩定可靠、執行效率高,任何一個進程的崩潰不會影響其它請求.
缺點:在大并發的時候對服務器資源消耗嚴重.
worker:多進程多線程模型,一個線程響應一個請求;(三級進程模型,父進程管理子進程,子進程通過線程響應用戶請求;每個線程處理一個用戶請求);
優點:在高并發的情況下,對服務器的資源消耗相對prefork模型要小很多.
缺點:執行效率、穩定性都不如prefork模型.linux不是個原生支持線程的操作系統,經測試發現worker模型在linux上面的綜合表現不如prefork模型.。
event:事件驅動模型,一個進程響應n個請求;(兩級線程模型,父進程管理子進程,子進程通過event-drivern機制直接響應n個請求)。
(3)httpd-2.2的安裝
[root@bogon ~]# yum install httpd -y ? ? #CentOS6 yum源安裝httpd-2.2.15
http://www.www58058.com/97967? ? ? ? ? ? ? #參見以前博客CentOS7 編譯安裝httpd-2.4.27
安裝后啟動:
[root@bogon ~]# service iptables stop ? ? ?# CentOS6關閉防火墻
[root@bogon ~]# vim /etc/selinux/config?? #?? CentOS6關閉SELINUX
SELINUX=disabled
[root@bogon ~]# service httpd ?start? ? ? ? #CentOS6啟動httpd服務
[root@localhost ~]# systemctl stop firewalld ? ? ?#CentOS7關閉防火墻 ?
[root@bogon ~]# vim /etc/selinux/config?? #?? CentOS7關閉SELINUX
SELINUX=disabled
[root@localhost ~]# systemctl start httpd ? ? ??? ? # CentOS7啟動httpd服務
(4)實現prefork工作方式
CentOS6 :配置方法
安裝完成后,httpd的默認運行模式為prefork,查看其運行模式為:
[root@bogon ~]#httpd -M | grep mpm
在查看或修改其對應prefork配置:
[root@bogon ~]# vim /etc/httpd/conf/httpd.conf
StartServers:?默認啟動的工作進程數;
MinSpareServers:?最少空閑進程數;
MaxSpareServers:?最大空閑進程數;
ServerLimit:?最大活動進程數;
MaxRequestWorkers:?并發請求的最大數;
MaxConnectionsPerChild:?每個子進程在生命周期內所能夠服務的最多請求個數,然后被殺死??0表示不限定
啟動httpd服務并查看相關的進程狀態:
[root@bogon ~]# ps aux | grep httpd
查看其中已經啟動了八個子進程
使用ab工具對相應的URL進行壓力測試并觀察進程的狀況:
[root@bogon ~]# ab -n 100000 -c 10 http://172.16.15.12/index.html
(5)實現worker工作方式
CentOS6 :配置方法
[root@bogon ~]# vim /etc/sysconfig/httpd ?#編輯配置文件
在查看或修改其對應worker配置:
[root@bogon ~]# vim /etc/httpd/conf/httpd.conf?
StartServers:?默認啟動的工作進程數; MaxClients:?最大連接數; MinSpareThreads:?最小線程數; MaxSpareThreads:?最大線程數; ThreadsPerChild:每個子進程可生成的線程數; MaxRequestsPerChild: 單個子進程累計最多處理到少個請求,默認0,不限制的意思,可能會導致內存泄露,超過該值則退出重啟apach
啟動httpd服務并查看相關的進程狀態:
[root@bogon ~]# service httpd restart
[root@bogon ~]# ps aux | grep httpd
查看其中已經啟動了3個進程
使用ab工具對相應的URL進行壓力測試并觀察進程的狀況:
[root@localhost ~]# ab -n 100000 -c 10 http://172.16.15.12/index.html
(6)實現event工作方式
http-2.2的event模式還處于測試階段,因此不建議在生產環境上運行,httpd-2.4的event模式為正式版可在生產環境上部署。
CentOS6 :配置方法
[root@bogon ~]# vim /etc/sysconfig/httpd ?#編輯配置文件
在查看添加其對應event配置:
[root@bogon ~]# vim /etc/httpd/conf/httpd.conf
StartServers:?默認啟動的工作進程數;
MinSpareThreads:最小線程數;
MaxSpareThreads:?最大線程數;
ThreadsPerChild:每個子進程可生成的線程數;
MaxRequestsPerChild: 單個子進程累計最多處理到少個請求,默認0,不限制的意思,可能會導致內存泄露,超過該值則退出重啟apach
啟動httpd服務并查看相關的進程狀態:
[root@bogon ~]# service httpd restart
[root@bogon ~]# ps aux | grep httpd
查看其中已經啟動了3個進程
使用ab工具對相應的URL進行壓力測試并觀察進程的狀況:
(7)在Centos 7上設置mpm三個模式:?
httpd-2.4?修改mpm?
[root@ns1 ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf
2、簡述request報文請求方法和狀態響應碼
(1)http事物
http事務有請求(request)和響應(response)
報文語法格式:
request報文?? :?<method><request-URL><version>
?????????????????????????????????????????????? <headers>
??????????????????????????????????????????????<entity-body>
response報文??:?<version><status><reason-phrase>?????#?版本信息?;??#??三位數字,如200,301, 302, 404, 502; 標記請求處理過程中發生的情況; #狀態碼所標記的狀態的簡要描述;
??????????????????????????? ????????????? < headers>????????????????????????????????????? ?#? 每個請求或響應報文可包含任意個首部;每個首部都有首部名稱,后面跟一個冒號,而后跟上一個可選空格,接著是一個值,即Name:Value;
????????????????????????????????????????? ?<entity-body>?????????????????????????????? ? #請求時附加的數據或響應時附加的數據;
(2)http請求步驟
2)、發送請求:web瀏覽器向web服務器發送http請求,如:GET/sample/hello.jsp HTTP/1.1。
3)、處理請求:用于對請求報文進行解析,獲取客戶端請求的資源及請求方法等相關信息;
4)、訪問資源,訪問獲取請求報文中請求的資源;
5)、構建響應報文;
6)、發送響應報文;
7)、記錄請求日志;
?(3)request報文請求方法
method(方法):
GET:從服務器獲取一個資源;
HEAD:只從服務器獲取文檔的響應首部;
POST:向服務器發送要處理的數據;
PUT:將請求的主體部分存儲在服務器上;
DELETE:請求刪除服務器上指定的文檔;
TRACE:追蹤請求到達服務器中間經過的代理服務器;
OPTIONS:請求服務器返回對指定資源支持使用的請求方法;
注意:DELETE非常危險
協議查看或分析的工具:
tcpdump, tshark, wireshark
(4)?狀態響應碼
status(狀態碼):
1xx:100-101, 信息提示;
2xx:200-206, 成功
3xx:300-305, 重定向
4xx:400-415, 錯誤類信息,客戶端錯誤
5xx:500-505, 錯誤類信息,服務器端錯誤
常用的狀態響應碼:
200:成功,請求的所有數據通過響應報文的entity-body部分發送;OK
301:請求的URL指向的資源已經被刪除;但在響應報文中通過首部Location指明了資源現在所處的新位置;Moved Permanently
302:與301相似,但在響應報文中通過Location指明資源現在所處臨時新位置; Found
304:客戶端發出了條件式請求,但服務器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端;Not Modified
401:需要輸入賬號和密碼認證方能訪問資源;Unauthorized
403:請求被禁止;Forbidden
404:服務器無法找到客戶端請求的資源;Not Found
500:服務器內部錯誤;Internal Server Error
502:代理服務器從后端服務器收到了一條偽響應;Bad Gateway
3、詳細描述httpd虛擬主機、站點訪問控制、基于用戶的訪問控制、持久鏈接等應用配置實例
(1)http服務器的配置文件
?? httpd服務的主配置文件通常為httpd根目錄下的conf/httpd.conf文件,通過yum安裝的httpd服務的主配置路徑通常如下:
http2.2和http2.4主配置文件路徑:/etc/httpd/conf/httpd.conf
?主配置文件的格式大體分為三部分:?????
??????????????????????????? ### Section 1: Global Environment??????????????? #全局配置段
??????????????????????????? ### Section 2: ‘Main’ server configuration???????????? #主服務器配置
??????????????????????????? ### Section 3: Virtual Hosts?????????? #虛擬主機配置
在httpd-2.4版本中刪除了相應的描述,不過大體與httpd-2.2相同。
另外除了主配置文件之外,也存在著其他的配置目錄路徑,通常在主配置文件中會使用Include conf.d/*.conf
、Include conf.modules.d/*.conf
(httpd-2.4)類似的語句去調用對應的目錄下的配置文件,其路徑格式為相對路徑,根目錄由主配置文件中的Serverroot決定。
(2)httpd服務的基礎配置
1、修改監聽的IP和PORT
格式:?Listen? [IP:]PORT
1)省略IP表示為0.0.0.0;
2) Listen指令可重復出現多次;例如:? Listen? 80??、? Listen? 8080
3) 修改監聽socket,重啟服務進程方可生效;
4)若限制其必須通過ssl通信時,protocol需定義為https;
編輯配置文件
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
添加監聽端口
重啟服務并查看端口:
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# ss -tnl
2、使用長連接
1)首先http是無狀態的,持久連接是tcp連續建立后,每個資源獲取完成后不全斷開連接,而是繼續等待其它資源請求的進行;
2)?使用數量限制和時間限制來斷開連接控制;
3)?當對并發訪問量較大的服務器,長連接機制會使得后續某些請求無法得到正常響應,較好的解決方案是設置使用較短的持久連接時長,以及較少的請求數量;
創建配置文件:
[root@localhost ~]# vim? /etc/httpd/conf/conf.d/keepalive.conf
??????????? KeepAlive?on??????????????????? #啟用長連接
??????? KeepAliveTimeout 15???????????# 持續時長15秒
??????? MaxKeepAliveRequests 100???????????? #最大請求數量100個資源
[root@localhost ~]#? httpd –t?????????????? #? 檢查語法錯誤
3、定義中心服務器’Main’ server的文檔頁面路徑
文檔路徑映射:? DoucmentRoot指向的路徑為URL路徑的起始位置,其相當于站點URL的根路徑;
???(服務器文件系統路徑) /web/host1/index.html? ——映射——>? (網頁)? /index.html???
在httpd服務的主配置文件中,默認情況下DocumentRoot "/var/www/html"
定義了默認web站點目錄的路徑。
如需自定義默認的目錄,需要找如下格式進行添加:
httpd-2.2配置:
<Directory “/PATH/TO/FILE”>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
httpd-2.4配置:
<Directory “/PATH/TO/FILE”>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
???????????????
創建主站數據目錄:[root@ns1 ~]# mkdir /data/web/www -pv
?????????????????????????????????????? mkdir: 已創建目錄 “/data”
?????????????????????????????????????? mkdir: 已創建目錄 “/data/web”
?????????????????????????????????????? mkdir: 已創建目錄 “/data/web/www”???????
?????????????????????????????????? [root@ns1 ~]# vim /data/web/www/test.html??? #編輯測試頁
?????????????????????????????????????????????????????? <html>
???????????????????????????????????????????????????????????????? <head>
?????????????????????????????????????????????????????????????????????????? test.page
???????????????????????????????????????????????????????????????? </head>
?????????????????????????????????????????????????????????? <body>
???????????????????????????????????????????????????????????????? <h1>test.page</h1>
????????????????????????????????????????????????????????? </body>
????????????????????????????????????????????????????? </html>
??????????????????????????? ? [root@ns1 ~]# vim /etc/httpd/conf/httpd.conf?????? #配置文件
[root@localhost ~]# httpd -t???????????????????????????????? ?#檢查語法
Syntax OK
[root@localhost ~]# systemctl restart httpd?????? ?#重啟服務
測試網頁:
(3)httpd的訪問控制
1) 可基于兩種機制指明對哪些資源進行何種訪問控制
基于系統路徑控制:
<Directory "/PATH/TO/SOMEDIR">系統路徑
...
</Directory>
基于文件使用控制:
<File "">針對某些文件使用
...
</File>
<FileMatch "PATTERN">
...
</FileMatch>
基于URL路徑控制: <location “”>…
<LocationMatch "">模式
...
</LocationMatch>
2)基于Directory中的訪問控制
- options 包括以下可選參數:
Indexes: 允許目錄瀏覽,當客戶僅指定要訪問的目錄,但沒有指定要訪問的文件,且目錄下不存在默認文檔時,顯示該目錄中的文件及子目錄列表索引
MultiViews:允許內容協商的多重視圖,允許返回指定的訪問目錄下的相關聯的文件
All:包含了除MultiViews之外的所有特性,如沒有指定options,默認為All
ExecCG:允許在該目錄下執行CGI腳本
FollowSymLink:允許跟蹤符號鏈接到源文件
Includes:允許服務器端包含功能
IncludesNoExec:允許服務器端包含功能,但禁止執行CGI腳本
None:不調用options參數
- AllowOverride選項用于定義每個目錄下.htaccess文件中的指令類型,但通常設置None。
基于來源地址的訪問控制
order和allow、deny
order:定義生效次序;寫在后面的表示默認法則;
order Allow Deny:Allow的來源地址允許訪問,其余都拒絕。
order Deny Allow:deny的來源地址拒絕訪問,其余都允許。
Allow from:允許訪問的來源地址(白名單)
Deny from:拒絕訪問的來源地址(黑名單)
來源地址格式: IP NetAddr:172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
Httpd-2.2控制頁面資源允許所有來源的主機可訪問
<Directory””> #配置地方
…
Oder allow,deny
Allow from all
<Directory””>
<Directory””> #配置地方
…
Requlre all granted
<Directory””>
只允許172.16.15網段的主機訪問
Httpd-2.4控制頁面資源拒絕所有來源的主機可訪問
<Directory””> #配置地方
…
Oder allow,deny
Deny from all
<Directory””>
<Directory””> #配置地方
…
Requlre all denied
<Directory””>
基于ip可控制:
Require Ip IP地址或網絡地址
Require not Ip IP地址或網絡地址
基于主機名控制
Require host 主機名或域名地址
Require not host 主機名或域名
(4)基于用戶的訪問控制
認證質詢:WWW-Authenticate:響應碼為401,拒絕客戶端請求,并說明要求客戶端提供賬號和密碼;
認證:Authorization:客戶端用戶填入賬號和密碼后再次發送請求報文;認證通過時,則服務器發送響應的資源;
認證方式有兩種:
basic:明文
digest:消息摘要認證
安全域:需要用戶認證后方能訪問的路徑;應該通過名稱對其進行標識,以便于告知用戶認證的原因;
用戶的賬號和密碼存放于何處?
虛擬賬號:僅用于訪問某服務時用到的認證標識
存儲:
文本文件;
SQL數據庫;
ldap目錄存儲;
basic認證配置示例:
<1> 定義安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String“
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...
</Directory>
允許賬號文件中的所有用戶登錄訪問:
Require valid-user
<2> 提供賬號和密碼存儲(文本文件)
使用專用命令完成此類文件的創建及用戶管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自動創建此處指定的文件,因此,僅應該在此文件不存在時使用;
-m:md5格式加密
-s: sha格式加密
-D:刪除指定用戶
-b 批模式添加用戶
另外:基于組賬號進行認證;
<1> 定義安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String“
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group grpname1 grpname2 ...
</Directory>
<2> 創建用戶賬號和組賬號文件;
組文件:每一行定義一個組
GRP_NAME: username1 username2
(5)虛擬主機
站點標識: socket
IP相同,但端口不同;
IP不同,但端口均為默認端口;
FQDN不同;請求報文中首部
Host: www.baidu.com
有三種實現方案:
基于ip:
為每個虛擬主機準備至少一個ip地址;
基于port:
為每個虛擬主機使用至少一個獨立的port;
基于FQDN:
為每個虛擬主機使用至少一個FQDN;
注意:一般虛擬機不要與中心主機混用;因此,要使用虛擬主機,得先禁用'main'主機;
禁用方法:注釋中心主機的DocumentRoot指令即可;
虛擬主機的配置方法:
基于IP的虛擬主機示例:
<VirtualHost 172.16.100.7:80>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.8:80>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
基于端口的虛擬主機:
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:808>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:8080>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
基于FQDN的虛擬主機:
NameVirtualHost 172.16.100.6:80
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
注意:如果是http-2.2 則使用基于FQDN的虛擬主機時,需要事先使用如下指令:NameVirtusalHost Ip:port
?
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99402