在互聯網中瀏覽網頁都須要使用HTTP(超文本傳輸協議),而Apache只是HTTP協議的一個實現程序 , HTTPD做爲其主程序運行,目前經常使用有兩個版本CentOS6(httpd 2.2)、CentOS7 (httpd 2.4)。 javascript
一次完整的HTTP請求(事務):php
1)Client請求網頁資源、與Server創建鏈接(三次握手)、Server處理請求(容許或拒絕)。css
2) 若是Server接受來自Client的請求,則根據Apache的多進程處理模型(MPM),挑選一個子進程或線程根據http Request 報文中的Headers 進行分析處理。html
3)Server根據Request headers中定義的方法(method)去訪問並獲取資源。java
4)構建響應報文(Http Response),使用MIME編碼方式將不一樣的資源類型編碼,也多是重定向資源。ios
5)發送響應報文, 到此步驟若是是短鏈接方式,一次http請求的過程就完成了,若是是長鏈接方式則繼續請求資源。web
6)記錄日誌。算法
Http Request報文:vim
<Method> <Request-URL> <Http_Version>瀏覽器 <Headers>
<entity-body>
|
Method 表示Client對資源的請求方法,常見的有:
Get 下載資源
Put 將請求報文中的」entity-body」 上傳到服務器上
Head 從服務器獲取請求資源的響應頭部
Delete 在服務器上刪除資源
Options 請求資源可以使用的Method
Trace 追蹤請求到達中間通過的代理服務器
Request-URL 表示資源在網絡中的位置
格式:
協議://用戶名:密碼@域名:端口號/目錄/文件名.文件後綴?參數=值#標誌
Http_Version 表示HTTP協議使用的版本號,一般爲:
http/1.0
http/1.1
Headers 包含請求或響應資源時須要協商的信息
通用首部:
Data 建立時間
Connection 鏈接狀態是否爲長鏈接
Via 顯示報文通過的中間節點,是否存在代理
Cache-control 控制緩存
請求首部:
Accept-charset Client表示本身能接受的字符編碼
Accept-Encoding Client表示本身能接收的編碼格式
Accept-Language Client表示本身能接受的語言
信息類請求:
Client-IP 客戶端IP地址
Host 表示請求服務器的名稱和端口
Referer 告訴服務器Client是從哪一個鏈接跳轉過來的
User-Agent 表示客戶端代理程序
Http Response 報文:
<Version> <Status> <reason-phrase> <headers>
<entity-body> |
Version 爲http協議的版本
Status 爲本次響應結果的狀態碼
1XX: 100-101 信息類的響應碼
2XX: 200-206 成功類的響應碼
200 成功,OK
3XX: 300-305 重定向類的響應碼
301 請求的資源已被刪除,永久重定向
302 請求的資源已被刪除,臨時重定向
4XX: 400-415 錯誤類信息,客戶端錯誤
401 須要認證,提供用戶名、密碼
404 請求的網頁不存在
403 請求被禁止,Forbiden
5XX:500-505 錯誤類信息,服務端錯誤
500 服務器內部錯誤
Reason-phrase 爲本次響應碼的簡要短語
Headers 響應頭部
信息類:
Age 資源的有效時間
Server 服務器的軟件名稱
協商首部:
Accept-ranges: 服務器可接受的請求範圍
Vary:服務器查看其它首部列表
安全響應首部:
Set-Cookie 向客戶端設置Cookie
Set-Cookie2 向客戶端設置Cookie2
長、短鏈接
一般一個網頁包含多個資源,若是每一個資源都須要一次創建鏈接、HTTP Request、Response 、拆除鏈接,這就叫短鏈接,這種方式比較浪費資源。
長鏈接,此方式創建鏈接後能夠進行屢次請求、響應資源。 但若是在高併發模式下,使用長鏈接,而用戶又不請求資源因長鏈接方式佔用着進程,別人也請求不了資源。
KeepAlive Off|ON ON表示開啓長鏈接、OFF表示關閉
MaxKeepAliveRequests 100 限制進程當請求量到100時,須要從新創建鏈接
KeepAliveTimeout 15 限制進程當超時15秒後,須要從新創建鏈接
修改Apahce 服務器爲長鏈接方式: [root@7-1 ]# vim /etc/httpd/conf/httpd.conf KeepAlive on MaxKeepaliveRequests 100 KeepAliveTimeOut 10 長鏈接測試,能夠對資源進行屢次請求,鏈接不會斷: [root@7-1 conf]# telnet 172.16.1.50 80 Trying 172.16.1.50... Connected to 172.16.1.50. Escape character is '^]'. GET / HTTP/1.1 HOST:172.16.1.50
HTTP/1.1 200 OK Date: Tue, 22 May 2018 11:50:49 GMT Server: Apache/2.4.33 (Unix) Last-Modified: Tue, 22 May 2018 01:25:57 GMT ETag: "11-56cc14cd527d5" Accept-Ranges: bytes Content-Length: 17 Content-Type: text/html
hello httpd 2.4
GET / HTTP/1.1 HOST:172.16.1.50
HTTP/1.1 200 OK Date: Tue, 22 May 2018 11:51:02 GMT Server: Apache/2.4.33 (Unix) Last-Modified: Tue, 22 May 2018 01:25:57 GMT ETag: "11-56cc14cd527d5" Accept-Ranges: bytes Content-Length: 17 Content-Type: text/html
hello httpd 2.4 Connection closed by foreign host.
[root@7-1 ]# vim /etc/httpd/conf/httpd.conf KeepAlive OFF
[root@7-1 conf]# !sys systemctl restart httpd
短鏈接測試,一次鏈接只能有一個請求: [root@7-1 conf]# telnet 172.16.1.50 80 Trying 172.16.1.50... Connected to 172.16.1.50. Escape character is '^]'. GET / HTTP/1.1 HOST:172.16.1.50
HTTP/1.1 200 OK Date: Tue, 22 May 2018 11:54:26 GMT Server: Apache/2.4.33 (Unix) Last-Modified: Tue, 22 May 2018 01:25:57 GMT ETag: "11-56cc14cd527d5" Accept-Ranges: bytes Content-Length: 17 Connection: close Content-Type: text/html
hello httpd 2.4 Connection closed by foreign host. |
MPM (Multi-Processing Module) 多進程模型
1. perfork MPM
Perfork模型經過預先啓動進程,由一個單獨的控制進程(父進程)負責產生子進程,這些子進程用於監聽請求並做出應答。而且Apache老是試圖保持一些備用的(spare)或者是空閒的子進程用於迎接即將到來的請求。這樣客戶端就不須要在獲得服務前等候子進程的產生,減小頻繁建立、銷燬進程的開銷。
優勢:響應速度快、穩定
缺點:進程佔用系統資源過多、不適合高併發環境。
Apache中的配置方式:
[root@el6 ]# vim /etc/httpd/conf/httpd.conf <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule> |
StartServers 表示預先啓動的進程數,不包含主進程
MinSpareServers 表示最少空閒進程數
MaxSpareServers 表示最多空閒進程數
ServerLimit 用於限制MaxClient
MaxClient 表示能處理最大併發請求數
MaxRequestsPerChild 限制進程處理多少個請求以後自動銷燬,值爲0 表示永不銷燬
2. woker MPM
woker模型使用多進程和多線程的混合方式,也須要由主進程事先fork建立子進程(數量少),每一個子進程能夠創建ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。
之因此不徹底使用多線程是由於線程之間內存共享,若是一個線程掛了,整個進程都掛了,因此還須要使用多進程,這樣一個進程奔潰也隻影響一部份內容。
優勢:使用線程方式佔用資源少,線程之間共享內存,支持更高的併發。
缺點:線程共享,穩定性差; 在長鏈接模式下
Apache中的配置方式:
[root@el6 ]# vim /etc/httpd/conf/httpd.conf <IfModule worker.c> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> |
StartServers 表示啓動的進程數
MaxClient 表示能處理最大併發請求數
MiniSpareThreads 表示最少空閒的線程數
MaxSpareThreads 表示最大空閒的線程數
ThreadsPerChild 表示每一個進程擁有對最大線程數
MaxRequestsPerChild 表示限制進程處理多少個請求以後自動銷燬,值爲0 表示永不銷燬
3. event MPM
這個是Apache中最新的模式,在如今版本里的已是穩定可用的模式。它和worker模式很像,最大的區別在於,它解決了keep-alive場景下,長期被佔用的線程的資源浪費問題(某些線程由於被keep-alive,空掛在哪裏等待,中間幾乎沒有請求過來,甚至等到超時)。event MPM中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又容許它釋放。這樣加強了高併發場景下的請求處理能力。
event MPM在遇到某些不兼容的模塊時,會失效,將會回退到worker模式,一個工做線程處理一個請求。官方自帶的模塊,所有是支持event MPM的。
Apache中的配置方式:
[root@el6 ]# vim /etc/httpd/conf/httpd.conf <IfModule mpm_event_module> StartServers 3 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 0 </IfModule> |
想知道當前HTTPD工做在什麼MPM模型下,使用如下命令查看
Httpd –M | grep mpm
Gzip 、 DEFLATE
DEFLATE是一個無專利的壓縮算法,它能夠實現無損數據壓縮,有衆多開源的實現算法。該標準的實施庫大多數人用的是zlib的。zlib庫提供用於壓縮和解壓縮使用DEFLATE/INFLATE的數據。zlib庫還提供了一種數據格式,混淆的命名ZLIB,它包裝DEFLATE壓縮數據,具備報頭和校驗和。
GZIP是使用DEFLATE進行壓縮數據的另外一個壓縮庫。事實上,GZIP的大多數實現實際使用zlib庫的內部進行DEFLATE/ INFLATE壓縮操做。GZIP產生其本身的數據格式,混淆的命名GZIP,它包裝DEFLATE壓縮數據,具備報頭和校驗和。
客戶端與服務器使用Accept-Encoding和Content-Encoding標頭完成協商壓縮方式。有兩種經常使用的HTTP壓縮:DEFLATE和GZIP。
Apache2.2加載模塊 Vim /etc/httpd/conf/httpd.conf LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so Apache2.4 加載模塊 Vim /etc/httpd/conf.modules.d/00-base.conf LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so |
DEFLATE 配置方式: [root@7-1 ]# vim /etc/httpd/conf/httpd.conf <IfModule mod_deflate.c> SetOutPutFilter DEFLATE SetEnvIfNoCase Request_URL .(?:gif|jpe?g|png)$ no-gzip dont-vary SetEnvIfNocase Request_URL .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:pdf|doc|avi|mov|mp3|rm)$ no-gzip dont-vary AddOutPutFilterByType DEFLATE text/* AddOutPutFilterByType DEFLATE application/x-javascript application/xml application/x-javascript DeflateCompressionLevel 9 </IfModule>
[root@7-1 conf]# !sys systemctl restart httpd
按F12打開Google瀏覽器的調試功能:
關閉壓縮功能: #<IfModule mod_deflate.c> # SetOutPutFilter DEFLATE # SetEnvIfNoCase Request_URL .(?:gif|jpe?g|png)$ no-gzip dont-vary # SetEnvIfNocase Request_URL .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary # SetEnvIfNoCase Request_URI .(?:pdf|doc|avi|mov|mp3|rm)$ no-gzip dont-vary # AddOutPutFilterByType DEFLATE text/* # AddOutPutFilterByType DEFLATE application/x-javascript application/xml application/x-javascript # DeflateCompressionLevel 9 # #</IfModule>
systemctl restart httpd
關閉Deflate功能後,發現響應頭部已經沒有gzip字樣,而且響應大小也從276變爲465了 |
裝載模塊 mod_gzip 可能須要本身編譯,另外編譯過程依賴httpd-devel包 ,由於須要APSX |
Gzip配置方式: # mod_gzip mod_gzip_on Yes mod_gzip_dechunk Yes mod_gzip_item_include file .(html?|txt|css|js|php|pl)$ mod_gzip_item_include handler ^cgi-script$ mod_gzip_item_include mime ^text/.* mod_gzip_item_include mime ^application/x-javascript.* mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* |
Httpd配置文件組成:
/etc/httpd/conf/httpd.conf #主配置文件
/etc/httpd/conf.d/*.conf #額外提供的配置文件
[root@el6 ~]# grep 'Section' /etc/httpd/conf/httpd.conf
### Section 1: Global Environment 定義全局環境變量
### Section 2: 'Main' server configuration 定義Main Server站點
### Section 3: Virtual Hosts 定義虛擬主機,與Main Server衝突
站點訪問控制:
在httpd中可基於兩種類型的路徑指明對哪些資源進行訪問控制。
基於文件系統中的路徑控制:
<Directory 「DIRECTORY_NAME」>
…
</Directory>
基於URL路徑控制:
<Location 「URL_NAME」>
…
</Location>
在<Directory>、<Location>中可以使用指令:
Options用於設定在定義的資源中,可以使用選項
Options None ALL Indexes FollowSymLinks SymLinksIfOwnerMatch … None 表示不使用任何選項 ALL 表示使用全部選項 Indexes 表示使用」索引」,當目錄中沒有」DirectoryIndex」定義的主頁時,是否列出文件索引,在建立文件下載站點時有用。若是不生效,則將welcome頁面刪除。 FollowSymLinks 表示若是在網站目錄中有符號連接文件,是否跟蹤 SymLinksIfOwnerMatch 表示符號連接的屬主是本人時纔跟蹤
|
基於源IP對資源作訪問控制:
Httpd2.2:
白名單,只容許被Allow from 匹配的地址訪問
Oder allow,deny
Allow from ip/net
黑名單,被Deny from匹配的地址都無權訪問資源
Oder deny,allow
Deny from IPADDR
IPADDR:
172.16.1.1 定義單個IP
172.16.0.0 根據地址主類自動判斷網段掩碼
172.16.0.0/16
172.16.0.0/255.255.0.0
Httpd2.4:
Require all granted 容許全部人訪問
Require all deny 拒絕全部人訪問
Require ip IPADDR 容許制定IP地址能訪問
IPADDR:
172.16.1.1 定義單個IP
172.16.0.0 根據地址主類自動判斷網段掩碼
172.16.0.0/16
172.16.0.0/255.255.0.0
注意:在Httpd2.4中,每一個目錄都須要明確受權,不然是沒法訪問的
基於帳號、密碼作訪問控制:
Basic——帳號、密碼明文傳輸方式認證:
AuthType Basic AuthName 「 DOMAIN_NAME」 #提示用戶,此資源爲何須要認證 AuthUserFile 「/PATH/TO/USER_FILE 」 #用戶、密碼文件存放位置 Require user USERNAME1 USERNAME2 #容許那個用戶訪問 Require valid-user #容許AuthUserFile中全部有效用戶訪問
|
另外還能夠基於組對用戶控制:
AuthType Basic AuthNmae 「DOMAIN_NAME」 AuthUserFile 「/PATH/TO/GROUP_FILE」 AuthGrupFile 「/PATH/TO/GROUP_FILE」 Require group group_name1 group_name2
|
GroupFile 定義格式:
組名:用戶名1 用戶名2
UserFile須要使用htpasswd 命令生成:
htpasswd -c -m /etc/httpd/conf/.htaccess USER_NAME
-c 表示首次須要建立該文件,添加用戶則不須要此選項
-m 表示存放的密碼使用md5加密存放
-s 表示存放的密碼使用sha1加密存放
-D 表示刪除指定用戶
Degist——帳號、密碼密文方式傳輸認證:
AuthType Degist AuthName 「DOMAIN_NAME」 AuthUserFile 「/PATH/TO/USER_FILE」 Require user USER_NAME1 USER_NAME2 |
USER_FILE須要使用htdigst命令生成:
Usage: htdigest [-c] passwordfile DOMAIN_NAME username
注意:DOMAIN_NAME要與配置文件中定義的AuthName匹配,不然驗證沒法經過
路徑別名
Alias 用於在Apache 定義URL與本地文件系統中資源的映射關係。
Usage : Alias /URL /PATH/TO/SOMEDIR/
/URL 表示以根爲起始位置的訪問入口
/PATH/TO/SOMEDIR/ 本地資源的路徑,路徑結尾有/ ,最後URL後也接/
例如:
Alias /doc /usr/share/doc
Alias /doc/ /usr/share/doc/
<Directory ‘/usr/share/doc’>
Optiosn indexes FollowSymlinks
Require all granted
</Directory>
設置默認字符集
AddDefaultCharset UTF-8
Server-status
Apache 內置的狀態頁。
<Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from localhost </Location> |
日誌:
錯誤日誌: /var/log/httpd/error_log
訪問日誌:/var/log/httpd/access_log
日誌中的內容都由一下配置定義:
ErrorLog "logs/error_log" LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common CustomLog "logs/access_log" combined |
ErrorLog 用於設定訪問日誌的存放路徑
LogForat 用於自定義日誌格式,在Apache2.4中還支持在模塊定義日誌功能
%h ClientIP %l Client 遠程登陸名字 來自Identd %u 認證時Client使用的認證名字 %t Client訪問的時間 %r Request報文的第一行 %>s 記錄最終請求的狀態碼(若是有重定向) %b 傳送資源的大小 %{Referer}i 表示訪問的來源,上一個連接 %{User-Agent}i 表示用戶使用的Agent信息(瀏覽器) |
CustomLog 用於設定訪問日誌的存放路徑與日誌格式
虛擬主機:
注意:使用虛擬主機時,最好把Main Server停用,不然會衝突.
#DocumentRoot /var/www/html
定義虛擬主機的三種方式:
基於IP(前提是主機有多個IP地址):
Httpd2.4中定義虛擬主機: Httpd2.2中不須要Require all grantd <VirtualHost 192.168.1.1:80> DocumentRoot /www/vhdocs1/ DirectoryIndex index.html index.php Require all grantd </VirutalHost> <VirtualHost 192.168.1.2:80> DocumentRoot /www/vhdocs2/ DirectoryIndex index.html index.php Require all grantd </VirutalHost> |
基於端口:
Httpd2.4中定義虛擬主機: Httpd2.2中不須要Require all grantd Listen 80 Listen 8080 <VirtualHost *:80> DocumentRoot /www/vhdocs1/ DirectoryIndex index.html index.php Require all grantd </VirutalHost>
<VirtualHost *:8080> DocumentRoot /www/vhdocs2/ DirectoryIndex index.html index.php Require all grantd </VirutalHost>
|
基於域名:
Httpd2.2中還須要啓用一條命令: NameVirtualHost *:80 不須要Require all grantd Httpd2.4定義方式: <VirtualHost *:80> DocumentRoot /www/vhdocs1/ ServerName www.jying.com DirectoryIndex index.html index.php Require all grantd </VirutalHost>
<VirtualHost *:80> DocumentRoot /www/vhdocs2/ ServerName web.jying.com DirectoryIndex index.html index.php Require all grantd </VirutalHost> |