一颤难、httpd的運(yùn)行模式
httpd具有以下特性:
- 高度模塊化;
- DSO:dynamic shared object提岔,模塊動(dòng)態(tài)裝卸匪傍;
- MPM:Multipath processing Modules ,多路處理模塊观挎,與接受請(qǐng)求相對(duì)應(yīng)琴儿。
其中并行處理模式MPM(多路處理模塊)包含了三種運(yùn)行模式。分別為prefork嘁捷、worker和event造成。
1、prefork模式
profork是一個(gè)兩級(jí)進(jìn)程模型雄嚣,父進(jìn)程管理子進(jìn)程晒屎,每個(gè)進(jìn)程響應(yīng)一個(gè)請(qǐng)求。由一個(gè)主進(jìn)程負(fù)責(zé)生成多個(gè)子進(jìn)程以及回收子進(jìn)程缓升、創(chuàng)建套接字鼓鲁、接收請(qǐng)求,并將請(qǐng)求派發(fā)給某個(gè)子進(jìn)程進(jìn)行處理港谊。每個(gè)子進(jìn)程只負(fù)責(zé)處理一個(gè)請(qǐng)求骇吭。其工作模型:預(yù)先生成幾個(gè)空閑進(jìn)程,等待用于響應(yīng)用戶請(qǐng)求歧寺,設(shè)定最大空閑和最小空閑燥狰;所有已建立的套接字由客戶端進(jìn)程和服務(wù)期端子進(jìn)程進(jìn)行通信,一旦出現(xiàn)空閑斜筐,會(huì)回收子進(jìn)程龙致。
特點(diǎn):進(jìn)城之間完全獨(dú)立,無需擔(dān)心線程安全問題顷链。但進(jìn)程占用的系統(tǒng)資源較多净当,在處理高并發(fā)請(qǐng)求時(shí)無法快速處理。
其在httpd2.2為的配置:
<IfModule prefork.c>
StartServers 8 #進(jìn)程啟動(dòng)時(shí)創(chuàng)建多個(gè)子進(jìn)程
MinSpareServers 5 #最少空閑進(jìn)程數(shù)
MaxSpareServers 20 #最大空閑進(jìn)程數(shù)
ServerLimit 256 #服務(wù)器支持的最大進(jìn)程數(shù)
MaxClients 256 #允許的最大并發(fā)請(qǐng)求數(shù)量蕴潦,對(duì)于prefork即為最大并發(fā)的子進(jìn)程數(shù)量
MaxRequestsPerChild 4000 #設(shè)置的是每個(gè)子進(jìn)程可處理的請(qǐng)求數(shù)。每個(gè)子進(jìn)程在處理了指定個(gè)請(qǐng)求后將自動(dòng)銷毀俘闯。0意味著無限潭苞,即子進(jìn)程永不銷毀。
</IfModule>
2真朗、worker模式
worker是一個(gè)三級(jí)結(jié)構(gòu)此疹、多進(jìn)程多線程的模式,其在啟動(dòng)時(shí)也預(yù)先fork了幾個(gè)子進(jìn)程,每個(gè)子進(jìn)程能夠生產(chǎn)若干個(gè)服務(wù)線程和若干個(gè)監(jiān)聽線程蝗碎,每個(gè)服務(wù)線程處理一個(gè)請(qǐng)求,監(jiān)聽線程負(fù)責(zé)接入請(qǐng)求并將其傳遞給服務(wù)線程處理和應(yīng)答。線程比起進(jìn)程會(huì)更輕量诫尽,因?yàn)榫€程通常會(huì)共享父進(jìn)程的內(nèi)存空間区岗,因此內(nèi)存的占用會(huì)減少些,在高并發(fā)的場(chǎng)景下表現(xiàn)比prefork模式更好眠菇。其工作模型:
一個(gè)主進(jìn)程:負(fù)責(zé)生成多個(gè)子進(jìn)程边败;負(fù)責(zé)創(chuàng)建套接字;負(fù)責(zé)接收請(qǐng)求捎废,并將其派發(fā)給某子進(jìn)程進(jìn)行處理笑窜; > 多個(gè)子進(jìn)程:每個(gè)子進(jìn)程負(fù)責(zé)生成多個(gè)線程;
每個(gè)線程:負(fù)責(zé)響應(yīng)用戶請(qǐng)求登疗;
并發(fā)響應(yīng)數(shù)量:m*n
m:子進(jìn)程數(shù)量
n:每個(gè)子進(jìn)程所能創(chuàng)建的最大線程數(shù)量排截;
worker模式的特點(diǎn):線程比起進(jìn)程會(huì)更輕量級(jí),因此占用用內(nèi)存少辐益,處理高并發(fā)請(qǐng)求時(shí)性能更好断傲。但是當(dāng)一個(gè)線程出現(xiàn)問題的時(shí)候會(huì)導(dǎo)致同一進(jìn)程下的線程也會(huì)出現(xiàn)問題。在keep-alive長(zhǎng)連接的方式下荷腊,某個(gè)線程會(huì)被一直占用艳悔,即使中間沒有請(qǐng)求,也需要等待到超時(shí)才會(huì)被釋放女仰。
在httpd2.2中的配置
<IfModule worker.c>
StartServers 4 #服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù)量
MaxClients 300 #限制同一時(shí)間并發(fā)請(qǐng)求的數(shù)量
MinSpareThreads 25 #設(shè)置空閑線程的最小數(shù)量
MaxSpareThreads 75 #設(shè)置空閑線程的最大數(shù)量
ThreadsPerChild 25 #設(shè)置每個(gè)子進(jìn)程產(chǎn)生的最大線程數(shù)量
MaxRequestsPerChild 0 #設(shè)置的是每個(gè)子進(jìn)程可處理的請(qǐng)求數(shù)猜年。每個(gè)子進(jìn)程在處理了指定個(gè)請(qǐng)求后將自動(dòng)銷毀。0意味著無限疾忍,即子進(jìn)程永不銷毀乔外。
</IfModule>
3、event模式
event是一個(gè)事件驅(qū)動(dòng)模型一罩,是一個(gè)兩級(jí)結(jié)構(gòu)的多進(jìn)程模型杨幼,父進(jìn)程管理子進(jìn)程,子進(jìn)程通過event-driven機(jī)制直接響應(yīng)多個(gè)請(qǐng)求聂渊。event模式解決了在keep-alive模式下差购,線程被長(zhǎng)期占用直到超時(shí),從而導(dǎo)致資源浪費(fèi)的問題汉嗽。
在event模塊中欲逃,有一個(gè)專門的線程來管理這些keep-alive類型的線程,當(dāng)接收到真實(shí)的請(qǐng)求時(shí)饼暑,會(huì)將請(qǐng)求傳遞給服務(wù)線程稳析,執(zhí)行完畢后洗做,會(huì)將對(duì)應(yīng)的服務(wù)線程釋放,這樣就能實(shí)現(xiàn)線程的異步非阻塞彰居。
在httpd2.2中的配置:
<IfModule mpm_event_module>
StartServers 3 #服務(wù)啟動(dòng)時(shí)建立的子進(jìn)程的數(shù)量
MinSpareThreads 75 #空閑線程的最少數(shù)量
MaxSpareThreads 250 #空閑線程的最大數(shù)量
ThreadsPerChild 25 #每個(gè)子進(jìn)程產(chǎn)生的線程數(shù)量
Maxclients 400 #最大的并發(fā)的線程數(shù)
MaxRequestsPerChild 0 #每個(gè)子進(jìn)程處理的最大連接數(shù)诚纸,0表示不限制。
</IfModule>
示例:
Centos6系統(tǒng)下實(shí)現(xiàn)httpd-2.2的安裝陈惰,并分別實(shí)現(xiàn)prefork畦徘、worker、event等幾種工作方式.
1奴潘、centos6上安裝裝httpd-2.2
yum install -y httpd
prefork模式
實(shí)現(xiàn)prefork模式旧烧。httpd的默認(rèn)運(yùn)行模式為prefork,查看其運(yùn)行模式為:
[root@localhost httpd]# httpd -M | grep mpm
httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
mpm_prefork_module (static)
Syntax OK
在/etc/httpd/conf/httpd.conf文件中查看prefork的設(shè)置
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
啟動(dòng)httpd服務(wù)并查看相關(guān)進(jìn)程狀態(tài):
[root@localhost httpd]# service httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
[ OK ]
[root@localhost httpd]# service httpd status
httpd (pid 2848) is running...
[root@localhost httpd]# ps -aux | grep httpd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2848 0.0 0.0 184328 3860 ? Ss 12:56 0:00 /usr/sbin/httpd
apache 2851 0.0 0.0 184460 2484 ? S 12:56 0:00 /usr/sbin/httpd
apache 2852 0.0 0.0 184460 2484 ? S 12:56 0:00 /usr/sbin/httpd
apache 2853 0.0 0.0 184460 2512 ? S 12:56 0:00 /usr/sbin/httpd
apache 2854 0.0 0.0 184460 2484 ? S 12:56 0:00 /usr/sbin/httpd
apache 2855 0.0 0.0 184460 2484 ? S 12:56 0:00 /usr/sbin/httpd
apache 2856 0.0 0.0 184460 2484 ? S 12:56 0:00 /usr/sbin/httpd
apache 2857 0.0 0.0 184460 2484 ? S 12:56 0:00 /usr/sbin/httpd
apache 2858 0.0 0.0 184460 2484 ? S 12:56 0:00 /usr/sbin/httpd
root 2881 0.0 0.0 103252 832 pts/0 S+ 12:56 0:00 grep httpd
修改/etc/httpd/conf/httpd.conf中的prefork配置
<IfModule prefork.c>
StartServers 5 #修改啟動(dòng)時(shí)創(chuàng)建的進(jìn)程數(shù)為5
MinSpareServers 5
MaxSpareServers 10 #設(shè)置空閑進(jìn)程為10
ServerLimit 25
MaxClients 25 #修改最大并發(fā)請(qǐng)求的數(shù)量為25
MaxRequestsPerChild 4000
</IfModule>
重啟httpd服務(wù)并郴瑁看進(jìn)程狀態(tài):
[root@localhost httpd]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
[ OK ]
[root@localhost httpd]# ps -aux | grep httpd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 3056 0.0 0.0 184264 3800 ? Ss 13:02 0:00 /usr/sbin/httpd
apache 3059 0.0 0.0 184264 2472 ? S 13:02 0:00 /usr/sbin/httpd
apache 3060 0.0 0.0 184264 2472 ? S 13:02 0:00 /usr/sbin/httpd
apache 3061 0.0 0.0 184264 2500 ? S 13:02 0:00 /usr/sbin/httpd
apache 3062 0.0 0.0 184264 2472 ? S 13:02 0:00 /usr/sbin/httpd
apache 3063 0.0 0.0 184264 2472 ? S 13:02 0:00 /usr/sbin/httpd
root 3065 0.0 0.0 103252 828 pts/0 S+ 13:02 0:00 grep httpd
#說明配置生效
worker模式
修改配置文件/etc/sysconfig/httpd配置文件掘剪,將文件中HTTPD=/usr/sbin/httpd.worker這一句取消注釋。然后重啟服務(wù)查看進(jìn)程狀態(tài)奈虾。
[root@localhost httpd]# vim /etc/sysconfig/httpd
# Configuration file for the httpd service.
#
# The default processing model (MPM) is the process-based
# 'prefork' model. A thread-based model, 'worker', is also
# available, but does not work with some modules (such as PHP).
# The service must be stopped before changing this variable.
#
HTTPD=/usr/sbin/httpd.worker
#
# To pass additional options (for instance, -D definitions) to the
# httpd binary at startup, set OPTIONS here.
#
#OPTIONS=
[root@localhost httpd]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: httpd.worker: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
[ OK ]
[root@localhost httpd]# ps -aux | grep httpd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 3540 0.0 0.1 184536 4052 ? Ss 13:30 0:00 /usr/sbin/httpd.worker
apache 3655 0.0 0.1 528796 5372 ? Sl 13:30 0:00 /usr/sbin/httpd.worker
root 3696 0.0 0.0 103252 832 pts/0 S+ 13:30 0:00 grep httpd
然后修改/etc/httpd/conf/httpd.conf文件中的worker配置
<IfModule worker.c>
StartServers 2
MaxClients 100 #更改最大并發(fā)請(qǐng)求的數(shù)量為100
MinSpareThreads 25
MaxSpareThreads 100 #修改最大空閑線程的數(shù)量為100
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
event模式
修改配置文件/etc/sysconfig/httpd配置文件夺谁,將文件中HTTPD=/usr/sbin/httpd.worker這一句修改為HTTPD=/usr/sbin/httpd.event。然后重啟服務(wù)查看進(jìn)程狀態(tài)肉微。
[root@localhost httpd]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: httpd.event: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
[ OK ]
[root@localhost httpd]# ps -aux | grep httpd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 6124 0.0 0.1 184540 4040 ? Ss 13:42 0:00 /usr/sbin/httpd.event
apache 6127 0.0 0.1 528800 5340 ? Sl 13:42 0:00 /usr/sbin/httpd.event
apache 6128 0.0 0.1 528800 5344 ? Sl 13:42 0:00 /usr/sbin/httpd.event
apache 6129 0.0 0.1 528800 5356 ? Sl 13:42 0:00 /usr/sbin/httpd.event
root 6218 0.0 0.0 103252 832 pts/0 S+ 13:42 0:00 grep httpd
修改配置文件/etc/httpd/conf/httpd.conf匾鸥,添加evnet配置
#event MPM
<IfModule event_module>
StartServers 4
MaxClients 200
MinSpareThreads 20
MaxSpareThreads 200
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
查看進(jìn)程狀態(tài)
[root@localhost httpd]# ps -aux | grep httpd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 6309 0.0 0.1 184540 4048 ? Ss 13:46 0:00 /usr/sbin/httpd.event
apache 6312 0.0 0.1 528800 5344 ? Sl 13:46 0:00 /usr/sbin/httpd.event
apache 6313 0.0 0.1 528800 5360 ? Sl 13:46 0:00 /usr/sbin/httpd.event
apache 6314 0.0 0.1 528800 5352 ? Sl 13:46 0:00 /usr/sbin/httpd.event
root 6409 0.0 0.0 103252 828 pts/0 S+ 13:47 0:00 grep httpd
二、http的request報(bào)文請(qǐng)求方法和狀態(tài)響應(yīng)碼
一次完整的http請(qǐng)求處理過程:
- 建立或處理鏈接:接受請(qǐng)求或拒絕請(qǐng)求
- 接收請(qǐng)求:接收來自網(wǎng)絡(luò)上的主機(jī)請(qǐng)求報(bào)文中對(duì)特定資源的一次請(qǐng)求過程
- 處理請(qǐng)求:對(duì)請(qǐng)求報(bào)文進(jìn)行解析碉纳,獲取客戶端請(qǐng)求的資源及請(qǐng)求方法等相關(guān)信息
- 訪問資源:獲取請(qǐng)求報(bào)文中請(qǐng)求的資源
- 構(gòu)建響應(yīng)報(bào)文:
- 發(fā)送響應(yīng)報(bào)文:
- 記錄日志:
在一次完整的http請(qǐng)求過程中勿负,會(huì)出現(xiàn)兩種報(bào)文,分別是http的請(qǐng)求報(bào)文request和http的響應(yīng)報(bào)文response劳曹。
1奴愉、報(bào)文格式
request請(qǐng)求報(bào)文的格式為:
<method> <URL> <VERSION>
<headers>
<blank-line>
<request body>
response響應(yīng)報(bào)文的格式為:
<version> <status> <reason-phrase>
<headers>
<blank-line>
<entity-body>
以上各字段的含義:
- method:請(qǐng)求方法,標(biāo)明客戶端希望服務(wù)器對(duì)資源執(zhí)行的動(dòng)作铁孵,如GET锭硼、POST、HEAD等蜕劝;
- version:http服務(wù)的版本檀头,格式通常為:
HTTP/<major>.<minor>
;- status:狀態(tài)響應(yīng)碼岖沛,其格式通常為三位數(shù)字暑始,如200,301婴削,302蒋荚,404等,每一個(gè)狀態(tài)響應(yīng)碼標(biāo)記請(qǐng)求處理過程中發(fā)生的情況馆蠕;
- reason-phrase:狀態(tài)響應(yīng)碼所標(biāo)記的狀態(tài)的簡(jiǎn)要描述期升;
- headers:由每個(gè)請(qǐng)求或響應(yīng)報(bào)文包含的任意首部組成的,其首部格式類似于:Connection: Keep-Alive互躬;
- blank-line:在編寫完最后一個(gè)請(qǐng)求頭之后是一個(gè)空行播赁,發(fā)送回車符和換行符,通知服務(wù)器以下不再有請(qǐng)求頭吼渡。
- entity-body:請(qǐng)求報(bào)文中附加的數(shù)據(jù)或響應(yīng)時(shí)附加的數(shù)據(jù)容为;
2、報(bào)文的請(qǐng)求方法
http協(xié)議的請(qǐng)求方法共有以下7中
- GET:向服務(wù)器請(qǐng)求訪問獲取特定的資源寺酪;
- HEAD:只從服務(wù)器獲取文檔的響應(yīng)首部坎背;
- POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求,如提交表單或上傳文件等寄雀;數(shù)據(jù)包含在請(qǐng)求體中得滤,POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的創(chuàng)建或已有資源的修改;
- PUT:向指定資源位置上傳數(shù)據(jù)盒犹;
- DELETE:請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源內(nèi)容懂更;
- TRACE:回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷急膀;
- OPTIONS:請(qǐng)求服務(wù)器返回對(duì)指定資源支持使用的請(qǐng)求方法沮协;
3、狀態(tài)響應(yīng)碼status
狀態(tài)響應(yīng)碼是http請(qǐng)求處理返回的結(jié)果狀態(tài)標(biāo)識(shí)卓嫂,屬于響應(yīng)報(bào)文中的內(nèi)容慷暂,熟知常見的狀態(tài)響應(yīng)碼能幫助我們快速定位故障及進(jìn)行相應(yīng)的排錯(cuò),狀態(tài)碼的類型大體可分為下面幾類:
- 1xx:100-101, (額外)信息提示類的狀態(tài)碼晨雳;
- 2xx:200-206, 成功類的狀態(tài)碼行瑞;
- 3xx:300-305, 重定向類的狀態(tài)碼;沒有把請(qǐng)求的頁面響應(yīng)給客戶端悍募,而是重定向到其它地方蘑辑,或是無需獲取此資源;
- 4xx:400-415, 錯(cuò)誤類信息坠宴,客戶端的錯(cuò)誤類的狀態(tài)碼洋魂;例如請(qǐng)求不存在的資源;
- 5xx:500-505, 錯(cuò)誤類信息喜鼓,服務(wù)器端錯(cuò)誤類的狀態(tài)碼副砍;例如服務(wù)器內(nèi)部的問題,因?yàn)橘Y源有語法錯(cuò)誤運(yùn)行部成功庄岖,無法響應(yīng)豁翎,不是資源不存在;
常用的狀態(tài)碼:
200: 成功隅忿,請(qǐng)求的所有數(shù)據(jù)通過響應(yīng)報(bào)文的entity-body部分發(fā)送心剥;原因短語為OK
301: 請(qǐng)求的URL指向的資源已經(jīng)被刪除(移動(dòng)到其它位置)是永久重定向邦尊,資源被永久刪除;但在響應(yīng)報(bào)文中通過首部Location指明了資源現(xiàn)在所處的新位置优烧;原因短語為Moved Permanently
302: 與301相似蝉揍,但在響應(yīng)報(bào)文中通過Location指明資源現(xiàn)在所處臨時(shí)新位置,資源不是永久刪除畦娄,是臨時(shí)重定向; 原因短語為Found
304: 客戶端發(fā)出了條件式請(qǐng)求又沾,但服務(wù)器上的資源未曾發(fā)生改變,則通過響應(yīng)此響應(yīng)狀態(tài)碼通知客戶端熙卡,客戶端可繼續(xù)使用本地網(wǎng)頁緩存杖刷;原因短語為Not Modified
401: 需要輸入賬號(hào)和密碼認(rèn)證方能訪問資源,只有服務(wù)器要求時(shí)才輸入賬號(hào)密碼驳癌,基于basic認(rèn)證時(shí)就是401滑燃;原因短語為Unauthorized
403: 請(qǐng)求被禁止,資源禁止客戶端訪問喂柒;原因短語為Forbidden
404: 服務(wù)器無法找到客戶端請(qǐng)求的資源不瓶;原因短語為Not Found
500: 服務(wù)器內(nèi)部錯(cuò)誤;原因短語為Internal Server Error
502: 代理服務(wù)器從后端服務(wù)器收到了一條偽響應(yīng)灾杰;原因短語為Bad Gateway
503:Service Unavailable蚊丐,由于臨時(shí)的服務(wù)器維護(hù)或者過載,服務(wù)器當(dāng)前無法處理請(qǐng)求艳吠;
504:Gateway Time-out麦备,504錯(cuò)誤是(網(wǎng)關(guān)超時(shí)) 服務(wù)器作為網(wǎng)關(guān)或代理,但是沒有及時(shí)從上游服務(wù)器收到請(qǐng)求昭娩。
三凛篙、httpd服務(wù)的配置
httpd服務(wù)的主配置文件/etc/httpd/conf/httpd.conf。此文件內(nèi)容通常以下三大部分組成:
Section 1: Global Environment
Section 2: 'Main' server configuration
Section 3: Virtual Hosts
除主配置穩(wěn)健以外栏渺,其余的相關(guān)配置文件包括:
/etc/httpd/conf.d/.conf
/etc/httpd/conf.modules.d/.conf模塊配置文件
這些配置文件在httpd2.4中通常在主配置文件中通過IncludeOptional conf.d/*.conf
呛梆、Include conf.modules.d/*.conf
進(jìn)行調(diào)用響應(yīng)目錄下的配置文件。路徑為相對(duì)路徑磕诊,其根目錄由主配置文件中的Serverroot進(jìn)行設(shè)定填物。
1、修改監(jiān)聽I(yíng)P和端口
在主配置文件中霎终,修改httpd服務(wù)監(jiān)聽I(yíng)P和接口的格式為:
Listen [IP-address]port[protocol]
注意:
- IP-address可省略滞磺,省略表示可匹配全部IP,相當(dāng)于表示為0.0.0.0
- Listen指令可重復(fù)出現(xiàn)多次莱褒,用于監(jiān)聽多個(gè)端口
- 修改監(jiān)聽的socket后击困,要重啟服務(wù)才能生效
- 若限制其必須通過ssl通信時(shí),protocol必須定義為https
示例:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Listen 80
Listen 192.168.0.109:8080
[root@localhost httpd]# ss -tln
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 192.168.2.102:8188 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 5 192.168.122.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 127.0.0.1:6010 *:*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 :::8080 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 ::1:631 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 128 ::1:6010 :::*
2广凸、持久鏈接
持久鏈接是指tcp連續(xù)建立后阅茶,每個(gè)資源獲取完成后不全斷開連接蛛枚,而是繼續(xù)等待其它資源請(qǐng)求的進(jìn)行。對(duì)并發(fā)訪問量較大的服務(wù)器脸哀,長(zhǎng)連接機(jī)制會(huì)使得后續(xù)某些請(qǐng)求無法得到正常響應(yīng)坤候;此時(shí),設(shè)置較短的持久連接時(shí)長(zhǎng)企蹭,以及較少的請(qǐng)求數(shù)量來緩解。具體設(shè)置如下:
KeepAlive On|Off #是否啟用持久鏈接
KeepAliveTimeout 15 #單位是秒鐘智末;
MaxKeepAliveRequests 100 #鏈接請(qǐng)求最大數(shù)量谅摄;
示例:
[root@localhost httpd]# vim /etc/httpd/conf.d/keepalive.conf
KeepAlive on
KeepAliveTimeout 15
MaxKeepAliveRequests 100
[D:\~]$ telnet 192.168.2.102 8188
Connecting to 192.168.2.102:8188...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
GET /index.html HTTP/1.1
Host:192.168.2.102
HTTP/1.1 200 OK
Date: Wed, 31 Oct 2018 14:09:03 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Wed, 31 Oct 2018 10:03:23 GMT
ETag: "67-5798369a7b9b8"
Accept-Ranges: bytes
Content-Length: 103
Content-Type: text/html; charset=UTF-8
<html>
<head>
<title>testhtml</title>
</head>
<body>
<h1>testhtml,hello</h1>
</body>
</html>
GET /index1.html HTTP/1.1
Host:192.168.2.102
HTTP/1.1 200 OK
Date: Wed, 31 Oct 2018 14:09:30 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Wed, 31 Oct 2018 14:05:51 GMT
ETag: "d-57986ccc1c9f2"
Accept-Ranges: bytes
Content-Length: 13
Content-Type: text/html; charset=UTF-8
hello world
Connection closing...Socket close.
Connection closed by foreign host.
Disconnected from remote host(192.168.2.102:8188) at 22:10:24.
Type `help' to learn how to use Xshell prompt.
3、定義web文件路徑
在httpd服務(wù)的主配置文件中系馆,“'Main' server”部分送漠,定義web文檔路徑映射。
- 使用
DocumentRoot "/PATH/TO/FILE"
語句定義URL路徑的起始位置由蘑,用于基于文件系統(tǒng)路徑或URL路徑的訪問控制闽寡。- 使用
DirectoryIndex index.html
定義站點(diǎn)默認(rèn)首頁。- 使用
AddDefaultCharset UTF-8
定義默認(rèn)字符集尼酿,常用中文字符集有:GBK爷狈、Gb2312、GB18030等裳擎。
站點(diǎn)訪問控制機(jī)制:
常用的站點(diǎn)訪問控制即只有兩種:一種是基于文件系統(tǒng)路徑的訪問控制機(jī)制涎永;另一種是基于URL的站點(diǎn)訪問控制機(jī)制。兩者可同時(shí)設(shè)置
基于文件系統(tǒng)路徑:
1鹿响、基于源地址實(shí)現(xiàn)訪問控制羡微,在此設(shè)置的目錄下所有文件都遵循此處的指令設(shè)置。格式為:
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>
2惶我、針對(duì)單個(gè)文件實(shí)現(xiàn)訪問控制妈倔。其格式為:
<File "/PATH/TO/FILE">
....
<File>
3、DSO動(dòng)態(tài)共享對(duì)象機(jī)制
在/etc/httpd/conf/httpd.conf主配置文件中使用配置指令實(shí)現(xiàn)模塊加載:
LoadModule <mod_name> <mod_path>
模塊文件路徑可使用相對(duì)路徑:相對(duì)于ServerRoot(默認(rèn)為/etc/httpd)
例如:
ServerRoot "/etc/httpd"
# LoadModule foo_module modules/mod_foo.so
#
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
4绸贡、根據(jù)模式匹配到的文件實(shí)現(xiàn)訪問控制盯蝴。正則表達(dá)式要啟用引擎,因此建議不使用恃轩;其格式為:
<FileMatch "PATTERN">
...
</FileMatch>
基于URL路徑:
定義URL的目錄结洼,表示在此設(shè)置的目錄下所有文件都遵循此處的指令設(shè)置;
<Location "/PATH/TO/FILE">
...
</Location>
<LocationMatch "/PATH/TO/FILE">
...
</LocationMatch>
"Directory"中各選項(xiàng)的參數(shù)
- Options的參數(shù):
- Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時(shí)叉跛,返回索引列表給用戶松忍;作為下載站點(diǎn)時(shí)才使用;否則筷厘,不使用此選項(xiàng)鸣峭;
- FollowSymLinks:允許跟蹤符號(hào)鏈接文件所指向的源文件宏所;
- None:都禁止;
- All:都允許摊溶;
- Includes:允許啟用服務(wù)器包含功能爬骤;
- SymLinksifOwnerMatch:比FollowSymLinks在限制上更為嚴(yán)格的機(jī)制;表示只有原文件的屬主和鏈接文件的屬主相同時(shí)莫换,才允許跟蹤霞玄;
- ExecCGI:允許執(zhí)行cgi腳本;
- MultiViews:允許執(zhí)行內(nèi)容協(xié)商拉岁;非常消耗資源且不太安全坷剧;
- AllowOverride
AllowOverride用于定義與訪問控制相關(guān)的哪些指令可以放在.htaccess文件中,會(huì)使網(wǎng)站資源解析時(shí)性能影響非常大喊暖,因此通常設(shè)置為None惫企。- All: 所有指令都可放在這個(gè)隱藏文件中;
- None:這個(gè)隱藏文件中什么指令都不放陵叽;
- Order allow狞尔,deny:基于源地址做訪問控制的機(jī)制
- Order:定義生效次序;寫在后面的表示默認(rèn)法則巩掺;
- Order allow,deny 表示白名單偏序;
- Order deny,allow 表示黑名單;
- Order:定義生效次序;寫在后面的表示默認(rèn)法則巩掺;
- Allow/Deny from(在httpd2.2中使用)
Allow和Deny語句可以針對(duì)客戶機(jī)的域名或IP地址進(jìn)行設(shè)置锌半,以決定哪些客戶機(jī)能夠訪問服務(wù)器禽车。- Allow from IP:表示允許某些地址訪問。
- Deny from IP:顯式定義拒絕那些地址訪問刊殉。
- Require all granted:允許所有人訪問
在httpd2.4中使用Require限制源地址訪問控制殉摔,Require all granted是允許所有人訪問,Require all granted禁止所有人訪問记焊,還可以禁止某個(gè)IP或域名的訪問:- 基于IP的控制
- Require ip IP地址或者網(wǎng)絡(luò)地址 :允許訪問
- Require not ip IP地址或者網(wǎng)絡(luò)地址:拒絕訪問
- 基于主機(jī)名控制:
- Require host 主機(jī)名或域名:允許訪問
- Require not host 主機(jī)名或域名:拒絕訪問
- 注意:這些訪問控制要放置于
<Requireall>...</Requireall>
配置塊或<RequireAny>...</RequireAny>
配置塊中
- 基于IP的控制
示例
新建/web/html目錄逸月,編輯修改httpd服務(wù),使其能夠web訪問/web/html目錄下的index.html目錄文件:
[root@localhost /]# mkdir -pv /web/html
mkdir: created directory `/web'
mkdir: created directory `/web/html'
[root@localhost /]# vim /web/html/index.html
hello!
this is a test page
[root@localhost /]# chcon -R --reference /var/www/html/ /web/html/
[root@localhost /]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/web/html"
<Directory "/web/html">
Options none
AllowOverride None
Order allow,deny
Allow from all
</Directory>
[root@localhost /]# service httpd start
5遍膜、httpd的虛擬主機(jī)
httpd的虛擬主機(jī)是利用httpd自帶的VirtualHost功能來實(shí)現(xiàn)的碗硬。一個(gè)httpd服務(wù)器上配置多個(gè)虛擬主機(jī),實(shí)現(xiàn)一個(gè)服務(wù)器提供多站點(diǎn)服務(wù)瓢颅,其實(shí)就是訪問同一個(gè)服務(wù)器上的不同目錄恩尾。虛擬主機(jī)的配置方式為:
在/etc/httpd/conf/httpd.conf主配置文件中修改,或者在//etc/httpd/conf.d/*.conf目錄下新建配置文件挽懦。
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot "/PATH/TO/FILE" #設(shè)置此虛擬主機(jī)的web根目錄
</VirtualHost>
httpd虛擬主機(jī)有三種實(shí)現(xiàn)方式:
1翰意、基于IP方式的實(shí)現(xiàn):需要給每個(gè)虛擬主機(jī)設(shè)置至少一個(gè)IP地址。
示例:
利用virtualhost基于IP的方式實(shí)現(xiàn)/var/www/html目錄和/web/html目錄下的網(wǎng)頁文件的同時(shí)訪問
[root@localhost ~]# mkdir -pv /web/html
mkdir: 已創(chuàng)建目錄 "/web"
mkdir: 已創(chuàng)建目錄 "/web/html"
[root@localhost ~]# chcon -R --reference /var/www/html/ /web/html/
[root@localhost ~]# ip addr add 192.168.2.159 dev ens33
[root@localhost ~]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:a4:84:0e brd ff:ff:ff:ff:ff:ff
inet 192.168.2.104/24 brd 192.168.2.255 scope global noprefixroute dynamic ens33
valid_lft 4761sec preferred_lft 4761sec
inet 192.168.2.159/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::74ad:6110:89fe:b8b2/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost ~]# vim /web/html/index.html
test page
[root@localhost ~]# vim /etc/httpd/conf.d/webtest.conf
<VirtualHost 192.168.2.159:8080>
DocumentRoot "/web/html"
<Directory "/web/html">
AllowOverride none
Options none
Require all granted
</Directory>
</VirtualHost>
[root@localhost ~]# systemctl restart httpd
2、基于port的方式實(shí)現(xiàn):需要為每個(gè)虛擬主機(jī)使用至少一個(gè)獨(dú)立的port冀偶。
示例:
基于port的方式實(shí)現(xiàn)/var/www/html目錄和/web/html目錄下的網(wǎng)頁文件的同時(shí)訪問醒第。
[root@localhost ~]# vim /etc/httpd/conf.d/webporttest.conf
Listen 8188 #監(jiān)聽8188端口,
<virtualhost *:8188>
Documentroot /web/html
<Directory "/web/html">
AllowOverride none
Options none
Require all granted
</Directory>
</virtualhost>
[root@localhost ~]# systemctl restart httpd
3进鸠、基于FQDN的方式實(shí)現(xiàn):為每個(gè)虛擬主機(jī)使用至少一個(gè)FQDN稠曼。其配置方式為:如果是httpd-2.2,需要在配置文件中添加NameVirtualHost IP:PORT
NameVirtualHost 172.16.100.6:80 #如果是httpd-2.2客年,需要在配置文件中添加此句
<VirtualHost 172.16.100.6:80>
ServerName www.a.com #指定FQDN
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName www.b.net #指定FQDN
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
示例:
[root@localhost ~]# mkdir /web/html1
[root@localhost ~]# chcon -R --reference /var/www/html/
[root@localhost ~]# vim /web/html1/index.html
wawawawaw
qqwrw
test
[root@localhost ~]# vim /etc/httpd/conf.d/webstest.conf
<virtualhost *:8080>
Servername www.a.com
Documentroot /web/html
<Directory "/web/html">
AllowOverride none
Options none
Require all granted
</Directory>
</virtualhost>
<virtualhost *:8080>
Servername www.b.com
Documentroot /web/html1
<Directory "/web/html1">
AllowOverride none
Options none
Require all granted
</Directory>
</virtualhost>
[root@localhost ~]# systemctl restart httpd
修改window系統(tǒng)的hosts文件霞幅,并測(cè)試
6、基于用戶的訪問控制
基于用戶的訪問控制是通過http協(xié)議自身的認(rèn)證來實(shí)現(xiàn)的量瓜。http協(xié)議的認(rèn)證有兩種方式:
- basic:基本認(rèn)證蝗岖,用戶名和密碼基于明文發(fā)送的
- digest:消息摘要認(rèn)證。認(rèn)證時(shí)客戶端不會(huì)發(fā)送自己的密碼榔至,而是用自己的密碼加密一個(gè)數(shù)據(jù)串發(fā)送給服務(wù)器端,服務(wù)器端用此前存儲(chǔ)的密碼能解密就表示認(rèn)證通過欺劳。
由于并不是所有瀏覽器都支持摘要認(rèn)證唧取,所以一般使用較多的是basic認(rèn)證方式。其設(shè)置過程如下:
1划提、用htpasswd命令生成提供賬號(hào)和密碼存儲(chǔ)的文本文件
htpasswd
語法:
htpasswd [options] passwordfile username
選項(xiàng):
-c:創(chuàng)建文件枫弟;如果密碼文件則覆蓋;
-m:使用md5算法加密密碼鹏往;
-s:使用sha算法加密淡诗;
-d:使用對(duì)稱加密,不安全伊履,建議不使用韩容;
-b:在htpassswd命令行中一并輸入用戶名和密碼而不是根據(jù)提示輸入密碼
-D:刪除指定用戶;
設(shè)置過程:
[root@localhost ~]# htpasswd -cm /etc/httpd/conf/.webpasswd wxq
New password:
Re-type new password:
Adding password for user wxq
[root@localhost ~]# htpasswd -bm /etc/httpd/conf/.webpasswd root qwe123
Adding password for user root
[root@localhost ~]# htpasswd -bm /etc/httpd/conf/.webpasswd admin qweasd
Adding password for user admin
[root@localhost ~]# cat /etc/httpd/conf/.webpasswd
wxq:$apr1$p/JTxm/j$r6KzssyANlN5yCKHKaSkl/
root:$apr1$RoJP03bE$seDgbG2dRVPt05kh/Pfg/.
admin:$apr1$uAuj78ID$rzFH72mTYfiuw2L/0uvj40
2唐瀑、編輯配置文件群凶,設(shè)置用戶認(rèn)證,然后重啟httpd哄辣。配置文件既可以是修改主配置文件/etc/httpd/conf/httpd.conf请梢,也可以在/etc/httpd/conf.d/文件加下新建配置文件。
[root@localhost ~]# vim /etc/httpd/conf.d/webporttest.conf
<virtualhost *:8188>
Documentroot /web/html
<Directory "/web/html">
AllowOverride none
Options none
AuthType Basic
AuthName "welcome to my server.Please enter your account number and password"
AuthUserFile "/etc/httpd/conf/.webpasswd"
Require user wxq root admin
</Directory>
</virtualhost>
[root@localhost ~]# systemctl restart httpd
訪問服務(wù)器測(cè)試
基于域的用戶訪問控制
有大量用戶需要認(rèn)證時(shí)力穗,可使用基于域的認(rèn)證方式毅弧,把用戶加入到域中,將用戶劃分為相應(yīng)的域組当窗,并根據(jù)域組來做相應(yīng)的訪問控制够坐。
1、先創(chuàng)建域組文件:
[root@localhost ~]# vim /etc/httpd/conf/.htgroup
gptest:wxq
2、修改配置文件,然后重啟服務(wù)咆霜,登陸訪問測(cè)試:
[root@localhost ~]# vim /etc/httpd/conf.d/webporttest.conf
<virtualhost *:8188>
Documentroot /web/html
<Directory "/web/html">
AllowOverride none
Options none
AuthType Basic
AuthName "welcome to my server.Please enter your account number and password"
AuthUserFile "/etc/httpd/conf/.webpasswd"
AuthGroupFile "/etc/httpd/conf/.htgroup"
Require user wxq root admin
</Directory>
</virtualhost>
[root@localhost conf.d]# systemctl restart httpd