思維導圖
1. httpd服務
1.1 httpd概述
ASF(Apache Software Foundation)
1)伺服器的型別
- http伺服器(httpd,nginx,Lighttpd)
- 應用程式伺服器(IIS:.NET ,tomcat:.JSP)
2)httpd的特性
高度模組化(Core+modules)
DSO機制(Dynamic Shared Object ,動態共享物件)
MPM(Multipath Procession Modules,多路處理模組)
- 可以通過修改MPM來修改併發響應模型
- 2.4支援MPM模組動態切換,2.2不支援
3)httpd的併發響應模型
- prefork:兩級程式模型,父程式管理子程式,每個程式響應一個請求
# 工作模型 一個主程式: 負責生成子程式及回收子程式 負責建立套接字、接受請求,並將其派發給某子程式進行處理 n個子程式: 每個子程式處理一個請求 # 注意: 會預先生成幾個空閒程式,隨時等待用於響應使用者請求 最大空閒和最小空閒
- worker:三級程式模型,父程式管理子程式,子程式通過執行緒響應使用者請求,每個執行緒處理一個使用者請求
# 工作模型 一個主程式: 負責生成子程式、建立套接字、接受請求,並將其派發給某子程式進行處理 多個子程式: 每個子程式負責生成多個執行緒 每個執行緒: 負責響應使用者請求 # 併發響應數量: 子程式數 * 每個子程式能建立的最大執行緒數
- event:兩級模型,父程式管理子程式,子程式通過事件驅動event-driven機制直接響應n個請求
# 工作模型: 一個主程式: 負責生成子程式、建立套接字、接受請求,並將其派發給某子程式進行處理 子程式: 基於事件驅動機制直接響應多個請求 # httpd-2.4中的event機制可以在生產環境中使用
2.2 httpd的程式結構
- httpd2.2(CentOS6中)
- httpd2.4(CentOS7及以上)
3. httpd的主配置檔案
3.1 配置檔案結構和格式
1)整體結構
全域性環境配置(Global Environment):對程式自己的工作特點,對所有虛擬主機都通用的設定
主伺服器配置段(“Main” server configuration):在2.2上如果要使用主伺服器,則要將虛擬主機關掉
虛擬主機(Virtual Hosts)
2)配置格式:directive value
- directive,不區分字元大小寫
- value,為路徑時,是否區分字元大小寫,取決於檔案系統
3.2 監聽的IP和PORT
# 格式: Listen [IP:]Port [protocol] # 若省略IP則表示0.0.0.0 # Listen指令可以重複出現多次 Listen 80 Listen 8080 # 注意: 修改監聽的套接字,重啟服務程式才能生效 限制其必須通過ssl通訊時,protocol需要定義為https
3.3 使用者和使用者組
# 作用: 指定以哪個使用者的身份執行httpd伺服器程式 # 格式: User apache Group apache # 對主控程式是root使用者的說明: 主控程式是root,因為80埠是特權埠(小於1024的埠),只有管理員才能使用 所以主控程式是root,而其他的程式使用普通使用者許可權 SUexec在某些指令執行時可以切換到另外一個使用者(預設沒有裝載)
3.4 預設字符集
# 設定預設字符集 # 格式 AddDefaultCharset UTF-8 # 中文字符集: GBK、GB2312、GB18030
3.5 站點主頁面
# 格式: DirectoryIndex index.html index.html.var
3.6 持久連線
# 持久連線 Persistent Connection 保持連線,長連線 tcp連線建立後,每個資源獲取完成後不斷開連線,而是繼續等待其他資源請求的進行 # 斷開條件 1. 數量限制 2. 時間限制 # 副作用 對併發訪問量較大的伺服器,長連線機制會使得後續某些請求無法得到正常響應 # 折中方案 1. 使用較短的持久連線時長 2. 限制較少的請求數量 # 配置 KeepAlive On | Off # 是否啟用長連線 KeepAliveTimeout 15 # 超時時長,單位為秒 MaxKeepAliveRequests 100 #保持連線上面所能獲取的最大請求數量(每個連線上面的最大請求數量) # 注意 httpd2.4的KeepAliveTimeout可以是毫秒級,如果要設定毫秒級,可以直接在數值後面加上ms表示毫秒
- 可以用telnet命令來對持久連線進行測試
telnet 10.0.0.110 80
GET / HTTP/1.1
Host: 10.0.0.110
3.7 配置MPM
1)說明
在2.2中(CentOS6的rpm包)專門提供了三個應用程式檔案;因為httpd2.2不支援通過編譯多個MPM模組,所以只能編譯選定要使用的那個;
這三個應用程式檔案分別用於實現對不同的MPM機制的支援,預設是使用prefork機制
- httpd(prefork)預設就是使用prefork機制
- httpd.worker
- httpd.event
2)檢視httpd程式的模組列表
# 檢視httpd程式的模組列表 # 檢視靜態編譯的模組 httpd -l # 檢視靜態編譯及動態編譯的模組,檢視所有模組 httpd -M
3)切換MPM機制
### 2.2中 # 1.更換使用的httpd程式,以支援其他MPM機制 vim /etc/sysconfig/httpd HTTPD=/usr/sbin/httpd.{worker,event} # 2.然後啟用的時候要使用/usr/sbin/httpd.worker /usr/sbin/httpd.worker -k start ### 2.4中 # 直接在這個檔案中將對應的模組取消註釋就ok vim /etc/httpd/conf.modules.d/00-mpm.conf # 檢視當前的工作模式 httpd -V # 注意:重啟服務方可生效
4)MPM的配置
# prefork的配置: <IfModule prefork.c> StartServers 8 # httpd服務程式啟用以後自動建立出空閒的子程式數量 MinSpareServers 5 # 最少空閒程式數,無論如何都需要有5個空閒程式來對待新請求 MaxSpareServers 20 # 最大空閒程式數,要大於StartServers的數量 ServerLimit 256 # 同時在生命週期內處於活躍狀態的伺服器程式數(跟MaxClients應該是相同的) MaxClients 256 # 最大允許啟動的伺服器子程式的數量 MaxRequestsPerChild 4000 # 一個子程式最多能處理的請求,若超過這個值,就將這個程式kill掉而建立新的程式 # 設定為0則表示永不過期 </IfModule> # worker的配置: <IfModule worker.c> StartServers 4 # httpd服務程式啟動以後自動建立出空閒的子程式數量 MinSpareThreads 25 # 最少空閒的執行緒數 MaxSpareThreads 75 # 最大空閒的執行緒數 MaxClients 300 # 最大的允許線上的執行緒數 ThreadsPerChild 25 # 每個子程式生成多少個執行緒 MaxRequestsPerChild 0 # 單個程式最大允許響應多少個請求 <IfModule>
3.8 模組載入
# DSO動態共享物件 # 模組位置 /etc/httpd/conf.modules.d/ 在這個目錄下的模組對應的配置檔案中修改 # 載入模組 LoadModule <mod_name> <mod_path> 模組檔案路徑可使用相對路徑,相對於ServerRoot,預設是 /etc/httpd
3.9 定義Main Server
# 定義Main Server ServerName FQDN # 語法格式 ServerName [scheme://]fully-qualified-domain-name[:port] # 此處的名字是用來表示當前主機認為主機主要是服務於誰的 # 如果這條指令沒有定義,那麼httpd啟動時會試圖反解本地的IP地址(把IP解析為主機名),如果解析不成功,則會警告 DocumentRoot "/var/www/html" # 作用:指明網站的站點的url對映到本地的哪個檔案系統路徑下 # 文件路徑對映: # DocumentRoot指向的路徑為URL路徑的起始位置,其相當於站點URL的根路徑 # URL PATH與FileSystem PATH不是等同的,而是存在一種對映關係
3.10 路徑別名
# 格式: Alias /URL/ "/PATH/TO/SOMEDIR" # 把URL跟另外的其他的目錄建立對映關係 # 注意:在httpd2.4中要對那個目錄進行顯示授權(在Directory中定義那個目錄的許可權)
- Alias和DocumentRoot的區別:
DocumentRoot "/www/htdocs"
http://www.hgzero.com/download/xxx.txt
/www/htdocs/download/xxx.txt
Alias /download/ "/doc/pub/"
http://www.hgzero.com/download/xxx.txt
/doc/pub/xxx.txt
3.11 站點訪問控制
# 檔案系統路徑: <Directory ""> # 對目錄下的所有資源進行控制 ... </Directory> <File ""> # 針對某個檔案進行控制 ... </File> <FileMatch "PATTERN"> # 針對符合正則匹配的所有檔案進行控制 ... </FileMatch> # URL路徑: <Location ""> # 針對URL路徑進行控制 ... </Location> <LocationMatch ""> ... </LocationMatch>
3.12 status頁面
在2.4上面要裝載的模組:LoadModule status_module modules/mod_status.so
# 在httpd2.2中: <Location /server-status> SetHandler server-status Order allow,deny Allow from 172.16 </Location> # 在httpd2.4中: <Location /server-status> SetHandler server-status <RequireAll> Require ip 172.16 </RequireAll> </Location>
3.13 頁面壓縮deflate
1)作用
- 使用mod_deflate模組壓縮頁面優化傳輸速度(壓縮文字檔案,圖片檔案不需要壓縮)
2)適用場景
- 節約頻寬,額外消耗CPU;同時,可能有些較老瀏覽器不支援
- 壓縮適於壓縮的資源,例如檔案檔案
3)設定示例
SetOutputFilter DEFLATE # 設定一個叫DEFLATE的過濾器 # mod_deflate configuration # Restrict compression to these MIME types # 指定對哪些內容做壓縮 AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/css # Level of compression (Highest 9 - Lowest 1) # 指定壓縮比 DeflateCompressionLevel 9 # Netscape 4.x has some problems. # 匹配特定的瀏覽器,再對其做特定的壓縮,因為可能有些瀏覽器的特性不一樣,如IE BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
4. 虛擬主機
4.1 虛擬主機概述
1)站點標識(IP、PORT、FQDN)
- IP相同,埠不同
- IP不同,埠均為預設埠
- FQDN不同:http請求報文首部中 Host:www.hgzero.com
2)虛擬主機種類
- 基於IP地址:為每個虛擬主機準備至少一個ip地址,預設是匹配自上而下的第一個符合條件的
- 基於埠PORT:為每個虛擬主機使用至少一個獨立的port
- 基於FQDN:為每個虛擬主機使用至少一個FQDN
- 基於FQDN時,要將所有的FQDN都解析到同一個IP地址上
- 可以在本地hosts檔案中定義或者在DNS伺服器上指定
- 基於FQDN時,是根據http請求報文中的host值來判斷的,這個host值是不會被解析的
4.2 匹配規則&匹配格式
1)匹配規則
- 通配的越少的虛擬主機,匹配優先順序越高
- 如果基於名稱的虛擬主機無法匹配上,則採用虛擬主機列表中的第一個虛擬主機作為響應主機
- 如果所有的虛擬主機都無法匹配上,則採用主配置段中的主機,如果主配置段中註釋了DocumentRoot,則返回對應的錯誤
注意:
- 一般虛擬主機不要與中心主機混用,如果要使用虛擬主機,得先禁用main主機;2.4則可以不禁Main Server
- 禁用中心主機:註釋DocumentRoot即可
2)虛擬主機配置格式
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot ""
...
ServerAlias:虛擬主機的別名,可多次使用
</VirtualHost>
4.3 虛擬主機配置示例
1)基於IP的虛擬主機(基於埠)
# 基於IP的虛擬主機(基於埠的虛擬主機無非就是IP地址相同,而埠不同而已): <VirtualHost 10.0.0.201:81> ServerName www.hgzero.com DocumentRoot "/data/html/www" <Directory "/data/html/www"> Options None AllowOverride None Require all granted </Directory> CustomLog "/data/html/www/log/access_log" combined </VirtualHost> <VirtualHost *:82> # 這裡的*表示監聽本地所有地址 ServerName bbs.hgzero.com DocumentRoot "/data/html/bbs" <Directory "/data/html/bbs"> Options None AllowOverride None Require all granted </Directory> CustomLog "/data/html/bbs/log/access_log" combined </VirtualHost>
2)基於FQDN的虛擬主機
# 基於主機名(FQDN) <VirtualHost *:80> ServerName web.hgzero.com DocumentRoot "/data/html/www" <Directory "/data/html/www"> Options None AllowOverride None Require all granted </Directory> CustomLog "/data/html/www/log/access_log" combined </VirtualHost> <VirtualHost *:80> ServerName bbs.hgzero.com DocumentRoot "/data/html/bbs" <Directory "/data/html/bbs"> Options None AllowOverride None Require all granted </Directory> CustomLog "/data/html/bbs/log/access_log" combined </VirtualHost> # 注意:如果是在http2.2上,則使用基於FQDN的虛擬主機時,要事先使用如下指令 NameVirtualHost 172.16.100.6:80 # 意為在這個IP和埠上,開放基於主機名的虛擬主機
3)注意
基於名稱的虛擬主機必須指定ServerName指令,否則它將會繼承作業系統的FQDN
對於基於名稱的虛擬主機,如果使用IP地址請求無法匹配到任何虛擬主機時,將採用第一個虛擬主機作為預設虛擬主機
5. 訪問控制
5.1 基於源地址的訪問控制
1)httpd2.2和httpd2.4中的訪問控制
### httpd-2.2 ### AllowOverride # 表示是否允許覆蓋這裡的配置;與訪問控制相關的指令可以放在.htaccess檔案中 All None order # 定義生效次序,寫在後面的表示預設法則 allow deny Allow from # 允許哪些地址的訪問 Deny from #拒絕哪些地址的訪問
### httpd-2.4 ### # 基於IP控制 Require ip IP_ADDR Require not ip IP_ADDR # 基於主機名控制 Require host 主機名或域名 Require not host 主機名或域名 ### 注意: # 以上的這些控制資訊需要定義在<RequireAll>...</RequireAll>中或<RequireAny>配置塊中 # 2.4中的源地址的訪問控制需要顯示指定
2)Options選項
Indexes # 指明的URL路徑下不存在與定義的主頁面資源相等的資原始檔時,返回索引列表給使用者 FollowSymLinks # 允許跟蹤符號連結檔案所指向的原始檔(在配置別名時很有用) None All
3)httpd2.4中的配置示例
### 配置示例 <Directory "/var/www/html/bbs"> Options None AllowOverride None <RequireAll> # 這裡定義了基於IP的訪問控制(這裡也可以快取域名或主機名) Require ip 192.168.0.0/16 Require not ip 192.168.1.102 </RequireAll> </Directory> ### 來源地址的格式:如果是基於主機名的話,要寫成Requrie host node1.com IP NetAddr: 172.16 172.16.0.0/16 172.16.0.0/255.255.0.0
5.2 控制頁面允許or不允許所有主機訪問
# 控制頁面資源允許所有來源的主機可訪問: # http-2.2 <Directory ""> ... Order allow,deny Allow from all </Directory> # http-2.4 <Directory ""> ... Require all granted </Directory> # 控制頁面資源拒絕所有來源的主機可訪問: # http-2.2 <Directory ""> ... Order allow,deny Deny from all </Directory> # http-2.4 <Directory ""> ... Require all denied </Directory>
5.3 htpasswd
5.4 基於使用者的訪問控制
1)認證概述
# 認證質詢 WWW-Authenticate,響應碼為401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼 客戶端使用者填入賬號和密碼後再次傳送請求報文,若認證通過,則伺服器傳送響應的資源 # 認證方式 basic:明文 digest:訊息摘要認證 表單認證 # 安全域 需要使用者認證後方能訪問的路徑 應該通過名稱對其特性標識,以便告知使用者認證的原因 # 使用者的賬號和密碼存放的位置 虛擬賬號:僅用於訪問某服務時用到的認證標識 儲存: 文字檔案 SQL資料庫 ldap目錄儲存
2)basic認證配置示例
- 基於使用者的認證:
# 定義安全域: <Directory ""> Options None AllowOverride None # 是否允許覆蓋這裡的配置,一般都是設定為None AuthType Basic # 也可以指明digest認證方式 AuthName "String" # 指明提示資訊 AuthUserFile "/etc/httpd/conf.d/.htpasswd" # 密碼檔案,最好將其設定為隱藏檔案 Require user username1 username2 ... # 允許登入的使用者 Require valid-user # 允許賬號檔案中的所有使用者登入訪問 </Directory>
- 基於組賬號進行認證:
# 定義安全域: <Directory ""> Options None AllowOverride None AuthType Basic AuthName "String" AuthUserFile "PATH/TO/HTTPD_USER_PASSWD_FILE" AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" # 這裡引用的是組賬號的檔案 Require group groupname1 grpname2 ... # 允許登入的組 </Directory> # 建立使用者賬號和組賬號檔案: # 組賬號定義格式: 組檔案:每一行定義一個組(建立組賬號檔案) GRP_NAME:username1 username2 ...
6. https的配置
6.1 https的工作流程
1)SSL會話過程
2)SSL會話快取
- SSL會話的時長
- 若每次通訊都經過ssl handshake,那將是非常浪費資源的,所以Server端可以吧ssl會話給快取下來
- 在一段時間內同一客戶端訪問時這個ssl handshake過程就不必再做了,直接利用此前已經建立的會話資源就可以了
- 但是此會話不能儲存太長時間,一般是五分鐘之內都是有效的
- SSL會話是基於IP地址建立的,所以單IP的主機上,僅可以使用一個https的虛擬主機
6.2 配置httpd支援https
7. 日誌相關
7.1 日誌的記錄
7.2 日誌輪替
- cronolog
- rotatelog
8. 壓測工具
9. httpd自帶的工具程式
- apachectl
- apxs
- suexec
10. LAMP基本架構