httpd簡(jiǎn)介

一颤难、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)求處理過程:

  1. 建立或處理鏈接:接受請(qǐng)求或拒絕請(qǐng)求
  2. 接收請(qǐng)求:接收來自網(wǎng)絡(luò)上的主機(jī)請(qǐng)求報(bào)文中對(duì)特定資源的一次請(qǐng)求過程
  3. 處理請(qǐng)求:對(duì)請(qǐng)求報(bào)文進(jìn)行解析碉纳,獲取客戶端請(qǐng)求的資源及請(qǐng)求方法等相關(guān)信息
  4. 訪問資源:獲取請(qǐng)求報(bào)文中請(qǐng)求的資源
  5. 構(gòu)建響應(yīng)報(bào)文:
  6. 發(fā)送響應(yīng)報(bào)文:
  7. 記錄日志:

在一次完整的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中

  1. GET:向服務(wù)器請(qǐng)求訪問獲取特定的資源寺酪;
  2. HEAD:只從服務(wù)器獲取文檔的響應(yīng)首部坎背;
  3. POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求,如提交表單或上傳文件等寄雀;數(shù)據(jù)包含在請(qǐng)求體中得滤,POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的創(chuàng)建或已有資源的修改;
  4. PUT:向指定資源位置上傳數(shù)據(jù)盒犹;
  5. DELETE:請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源內(nèi)容懂更;
  6. TRACE:回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷急膀;
  7. 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 表示黑名單;
  • 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>配置塊中

示例
新建/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
httpd.png

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                   
httpd基于IP虛擬機(jī).png

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
基于port虛擬機(jī).png

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è)試

基于FQDN的虛擬機(jī).png

6、基于用戶的訪問控制

基于用戶的訪問控制是通過http協(xié)議自身的認(rèn)證來實(shí)現(xiàn)的量瓜。http協(xié)議的認(rèn)證有兩種方式:

  1. basic:基本認(rèn)證蝗岖,用戶名和密碼基于明文發(fā)送的
  2. 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è)試


basic認(rèn)證.png
基于域的用戶訪問控制

有大量用戶需要認(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
用戶wxq成功登入.png

admin用戶登入失敗.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邓馒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛾坯,更是在濱河造成了極大的恐慌光酣,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脉课,死亡現(xiàn)場(chǎng)離奇詭異救军,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)倘零,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門唱遭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呈驶,你說我怎么就攤上這事拷泽。” “怎么了袖瞻?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵司致,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我聋迎,道長(zhǎng)脂矫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任霉晕,我火速辦了婚禮庭再,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牺堰。我一直安慰自己拄轻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布伟葫。 她就那樣靜靜地躺著哺眯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扒俯。 梳的紋絲不亂的頭發(fā)上奶卓,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音撼玄,去河邊找鬼夺姑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛掌猛,可吹牛的內(nèi)容都是我干的盏浙。 我是一名探鬼主播眉睹,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼废膘!你這毒婦竟也來了竹海?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤丐黄,失蹤者是張志新(化名)和其女友劉穎斋配,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灌闺,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艰争,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桂对。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甩卓。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蕉斜,靈堂內(nèi)的尸體忽然破棺而出逾柿,到底是詐尸還是另有隱情,我是刑警寧澤宅此,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布鹿寻,位于F島的核電站,受9級(jí)特大地震影響诽凌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坦敌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一侣诵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狱窘,春花似錦杜顺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至搭儒,卻和暖如春穷当,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淹禾。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工馁菜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铃岔。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓汪疮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子智嚷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容