13.1 httpd簡介
httpd是Apache超文本傳輸協議(HTTP)服務器的主程序。被設計爲一個獨立運行的後臺進程,它會建立一個處理請求的子進程或線程的池。
通常,httpd不應該被直接調用,而應該在類Unix系統中由apachectl調用,在Windows中作爲服務運行。
13.2 httpd版本
本文主要介紹httpd的兩大版本,httpd-2.2和httpd-2.4。
CentOS6系列的版本默認提供的是httpd-2.2版本的rpm包,而CentOS7默認提供的是httpd-2.4版本的rpm包
13.2.1 httpd的特性
httpd有很多特性,下面就分別來說說httpd-2.2版本和httpd-2.4版本各自的特性。
httpd-2.2的特性:
a) 事先創建進程
b) 按需維持適當的進程
c) 模塊化設計,核心比較小,各種功能通過模塊添加(包括PHP),支持運行時配置,支持單獨編譯模塊
d) 支持多種方式的虛擬主機配置,如基於ip的虛擬主機,基於端口的虛擬主機,基於域名的虛擬主機等
e) 支持https協議(通過mod_ssl模塊實現)
f) 支持用戶認證
g) 支持基於IP或域名的ACL訪問控制機制
h) 支持每目錄的訪問控制(用戶訪問默認主頁時不需要提供用戶名和密碼,但是用戶訪問某特定目錄時需要提供用戶名和密碼)
i) 支持URL重寫
j) 支持MPM(Multi Path Modules,多處理模塊)。用於定義httpd的工作模型(單進程、單進程多線程、多進程、多進程單線程、多進程多線程)
prefork:多進程模型,預先生成進程,一個請求用一個進程響應
一個主進程負責生成n個子進程,子進程也稱爲工作進程;
每個子進程處理一個用戶請求,即使沒有用戶請求,也會預先生成多個空閒進程,隨時等待請求到達,最大不會超過1024個
worker:基於線程工作,一個請求用一個線程響應(啓動多個進程,每個進程生成多個線程)
event:基於事件的驅動,一個進程處理多個請求
httpd-2.4的新特性:
a) MPM支持運行DSO機制(Dynamic Share Object,模塊的動態裝/卸載機制),以模塊形式按需加載
b) 支持event MPM,eventMPM模塊生產環境可用
c) 支持異步讀寫
d) 支持每個模塊及每個目錄分別使用各自的日誌級別
e) 每個請求相關的專業配置,使用<If>來配置
f) 增強版的表達式分析器
g) 支持毫秒級的keepalive timeout
h) 基於FQDN的虛擬主機不再需要NameVirtualHost指令
i) 支持用戶自定義變量
j) 支持新的指令(AllowOverrideList)
k) 降低對內存的消耗
13.2.2 httpd-2.4新增的模塊
httpd-2.4在之前的版本基礎上新增了幾大模塊,下面就幾個常用的來介紹一下。
mod_proxy_fcgi:反向代理時支持apache服務器後端協議的模塊
mod_ratelimit:提供速率限制功能的模塊
mod_remoteip:基於ip的訪問控制機制被改變,不再支持使用Order,Deny,Allow來做基於IP的訪問控制
13.3 httpd基礎
13.3.1 httpd自帶的工具程序
htpasswd:basic認證基於文件實現時,用到的帳號密碼生成工具
apachectl:httpd自帶的服務控制腳本,支持start,stop,restart
apxs:由httpd-devel包提供的,擴展httpd使用第三方模塊的工具
rotatelogs:日誌滾動工具
access.log -->
access.log,access.1.log
access.log,access.1.log,access.2.log
suexec:訪問某些有特殊權限配置的資源時,臨時切換至指定用戶運行的工具
ab:apache benchmark,httpd的壓力測試工具
13.3.2 rpm包安裝的httpd程序環境
httpd-2.2版本程序環境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
配置文件的組成:grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment ### Section 2: 'Main' server configuration ### Section 3: Virtual Hosts
配置格式:directive value
directive:指令,不區分字符大小寫
value:爲路徑時,取決於文件系統
服務腳本:
/etc/rc.d/init.d/httpd
服務腳本的配置文件:
/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
日誌文件目錄:
/var/log/httpd/
access.log:訪問日誌
error_log:錯誤日誌
站點文檔目錄:
/var/www/html/
模塊文件路徑:
/usr/lib64/httpd/modules/
httpd-2.4版本程序環境:
主配置文件:/etc/httpd/conf/httpd.conf
模塊配置文件:/etc/httpd/conf.modules.d/*.conf
輔助配置文件:/etc/httpd/conf.d/*.conf
mpm:以DSO機制提供,配置文件爲/etc/httpd/conf.modules.d/00-mpm.conf
13.3.3 web相關的命令
curl命令:
curl是基於URL語法在命令行方式下工作的文件傳輸工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等協議。
curl支持:
https認證
http的POST/PUT等方法
ftp上傳
kerberos認證
http上傳
代理服務器
cookies
用戶名/密碼認證
下載文件斷點續傳
socks5代理服務器
通過http代理服務器上傳文件到ftp服務器
語法:curl [options] [URL ...]
常用的options:
-A/--user-agent <string>:設置用戶代理髮送給服務器
-basic:使用Http基本認證
--tcp-nodelay:使用TCP_NODELAY選項
-e/--referer <URL>:來源網址
--cacert <file>:CA證書(SSL)
--compressed:要求返回時壓縮的格式
-H/--header <line>:自定義請求首部信息傳遞給服務器
-I/--head:只顯示響應報文首部信息
--limit-rate <rate>:設置傳輸速度
-u/--user <user[:password]>:設置服務器的用戶和密碼
-0/--http1:使用http 1.0版本,默認使用1.1版本。這個選項是數字0而不是字母o
elinks命令:
語法:elinks [options] [URL ...]
常用的options:
-dump:不進入交互式模式,而直接將URL的內容輸出至標準輸出
httpd命令:
語法:httpd [options]
常用的options:
-l:查看靜態編譯的模塊,列出核心中編譯了哪些模塊。它不會列出使用LoadModule指令動態加載的模塊
-M:輸出一個已經啓用的模塊列表,包括靜態編譯在服務器中的模塊和作爲DSO動態加載的模塊
-v:顯示httpd的版本,然後退出
-V:顯示httpd和apr/apr-util的版本和編譯參數,然後退出
-X:以調試模式運行httpd。僅啓動一個工作進程,並且服務器不與控制檯脫離
13.4 編譯安裝httpd-2.4
httpd依賴於apr-1.4+,apr-util-1.4+,[apr-icon]
apr:apache portable runtime
CentOS6提供的apr是1.3.9版本,而apr-util也是1.3.9版本,所以想在CentOS6上安裝httpd-2.4版本時需要先安裝apr-1.4+和apr-util-1.4+,而在CentOS7中則不用另行安裝
httpd-2.4編譯安裝步驟:
a) 安裝開發環境(yum groupinstall)
b) 下載並安裝apr-1.4+和apr-util-1.4+。此步驟僅需在CentOS6系列上執行,CentOS7無需執行此步
cd /usr/src/ wget http://mirrors.hust.edu.cn/apache//apr/apr-1.5.2.tar.bz2 wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.5.4.tar.bz2 tar xvf apr-1.5.2.tar.bz2 tar xvf apr-util-1.5.4.tar.bz2 cd apr-1.5.2 ./configure --prefix=/usr/local/apr make && make install cd ../apr-util-1.5.4 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr make && make install
c) 編譯安裝httpd
groupadd -r apache useradd -r -g apache apache yum -y install openssl-devel pcre-devel ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork make && make install
13.5 httpd常用配置
httpd-2.2常用配置:
修改監聽的IP和端口:
Listen [IP:]PORT
省略IP表示監聽所有地址。Listen可重複出現多次
持久連接:即長連接
Persistent Connection:連接建立,每個資源獲取完成後不會立即斷開連接,而是繼續等待其它的請求完成
如何斷開?
數量限制:默認獲取100個資源後會自動斷開連接
時間限制:可配置,對於併發很大的服務器來說,此值不能設定太大
副作用:對於併發訪問量較大的服務器,持久連接功能會使有些請求得不到響應
折衷:使用較短的持久連接時間。httpd-2.4支持毫秒級持久時間
KeepAlive {On | Off}:設定是否啓用持久連接 MaxKeepAliveRequests 100:設定最大允許獲取的資源數,當達到些設定值時將自動斷開連接 KeepAliveTimeout 15:設定時間限制,當達到些時間限制時將自動斷開連接
測試持久連接:
telnet HOST PORT # telnet 192.168.1.1 80 GET /URL HTTP/1.1 # GET /index.html HTTP/1.1 Host: HOSTNAME or IP # Host: 192.168.1.1
MPM:Multi Path Modules,多處理模塊。用於定義httpd的工作模型(單進程、單進程多線程、多進程、多進程單線程、多進程多線程)
httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個
rpm安裝的包提供了三個二進制程序文件,分別用於實現對不同MPM機制的支持。確認方法:
ps aux |grep httpd
默認爲/usr/sbin/httpd,其使用prefork
更換使用的httpd程序:編輯/etc/sysconfig/httpd文件,並重啓服務使之生效
HTTPD={httpd | httpd.worker | httpd.event}
配置MPM:編輯主配置文件/etc/httpd/conf/httpd.conf
prefork的配置:
StartServers:服務啓動時啓動的服務器進程數(提供服務的子進程數,不包含主進程) MinSpareServers:最少空閒進程數 MaxSpareServers:最大空閒進程數 ServerLimit:爲MaxClients所準備的在其服務生命週期內所允許的進程數量最大值 MaxClients:最大併發請求數 MaxRequestsPerChild:一個服務器進程最多能夠響應多少次的請求
worker的配置:
StartServers:服務啓動時啓動的服務器進程數(提供服務的子進程數,不包含主進程) MaxClients:服務端最多啓動的線程數量 MinSpareThreads:最少空閒線程數 MaxSpareThreads:最多空閒線程數 ThreadsPerChild:每個進程所能夠啓動的線程數 MaxRequestsPerChild:每個線程所能夠響應的最大請求數量,0表示無限制
DSO:Dynamic Share Object,模塊的動態裝/卸載機制
配置指令實現模塊加載:
LoadModule <mod_name> <mod_path>
模塊路徑(mod_path)可使用相對路徑:
相對於ServerRoot(/etc/httpd)指向的路徑而言
/etc/httpd/modules --> /usr/lib64/httpd/modules
定義“Main”server的文檔頁面路徑,DocumentRoot
文檔路徑映射:
DocumentRoot指向的路徑爲URL路徑的起始位置
DocumentRoot "/var/www/html"
test/index.html --> http://HOST:PORT/test/index.html
站點訪問控制:
可基於兩種類型的路徑指明對哪些資源進行訪問控制:
針對文件系統路徑:
<Directory ""> </Directory> <File ""> </File> <FileMatch ""> </FileMatch>
針對URL路徑:
<Location ""> </Location> <LocationMatch ""> </LocationMatch>
訪問控制機制:
基於來源地址
基於帳號
Directory中“基於來源地址”實現訪問控制:httpd-2.2版本
a) Options
所有可用特性:
Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
Indexes:索引,當不指定要訪問的頁面具體路徑而又沒有默認主頁(index.html)時,以鏈接形式列出根(默認爲/var/www/html)下的所有內容
FollowSymLinks:允許跟蹤符號鏈接文件
b) 基於來源地址的訪問控制機制
Order:檢查次序 Order allow,deny 先允許後拒絕。默認所有都拒絕,只有明確允許的才允許訪問 Order deny,allow 先拒絕後允許。默認所有都允許,只有明確拒絕的才拒絕訪問 Allow from 來源地址 Deny from 來源地址
來源地址可以爲:
IP:如192.168.1.1
NetAddr:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
FQDN:可以是完整的主機名,也可以是一個域名,如*.idfsoft.com
All
基於用戶的訪問控制:
認證質詢:此處是一個響應報文
WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並說明要求客戶提供帳號和密碼
認證:此處是一個請求報文
Authorization:客戶端用戶填入帳號和密碼後再次發送請求報文,認證通過,則服務器發送響應的資源
認證類型:
basic:明文
digest:消息摘要,經過MD5加密
安全域:需要用戶認證後才能訪問的路徑稱之爲安全域
應該通過名稱對其進行標識,並用於告知用戶認證的原因
用戶的帳號和密碼存儲於何處:
虛擬帳號:僅用於訪問某服務時用到的認證標識
存儲機制:
文本文件
SQL數據庫
ldap
nis
basic認證:基於文本文件的存儲機制
a) 定義安全域
<Directory ""> Options None AllowOverride None AuthType Basic AuthName "String" AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" Require user username1 username2 ... #只允許帳號文件中指定的用戶登錄訪問 </Directory> 允許帳號文件中的所有用戶登錄訪問: 在<Directory> </Directory>之間添加Require valid-user
b) 提供帳號和密碼存儲(使用htpasswd命令)
htpasswd [options] passwordfile username
常用的options:
-c:自動創建passwordfile,因此,僅應該在添加第一個用戶時使用
-m /path/to/passwordfile:md5加密用戶密碼
-s:sha1加密用戶密碼
-D:刪除指定用戶
c) 實現基於組進行認證
<Directory ""> Options None AllowOverride None AuthType Basic AuthName "String" AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" Require group GROUP1 GROUP2 ... </Directory>
要提供用戶帳號文件和組文件:
組文件:只能手動定義,每一行定義一組。格式如下:
GROUP_NAME:user1 user2 user3 ...
在組文件中的user必須在帳號文件中存在。
定義默認主頁面:
DirectoryIndex index.html index.html.var
日誌設定:
定義日誌格式:LogFormat
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent
常用的日誌格式定義宏:詳情請看 官方文檔
%h:客戶端IP地址 %l:小寫的L,遠程登錄的用戶名,Remote logname (from identd,if supplied). -表示爲空 %u:遠程用戶。Remote user, (from auth; may be bogus if return status (%s) is 401) %t:服務器收到請求的時間 %r:請求報文的首行信息(請求的方法,URL,協議版本) %>s:響應狀態碼 %b:響應報文的大小,不包含響應報文首部,單位是字節 %{Referer}i:請求報文當中"referer"首部的值。當前資源的訪問入口,即從哪個頁面中的超鏈接跳轉而來 %{User-Agent}i:請求報文當中"User-Agent"首部的值。即發出請求用到的應用程序
錯誤日誌:
Errorlog logs/error_log LogLevel <日誌級別> #默認是warn級別
日誌級別有以下這些:從低到高,日誌級別越低,記錄越詳細
debug
info
notice
warn
error
crit
alert
emerg
訪問日誌:
CustomLog logs/access_log combined
路徑別名:把一個URL映射至別的路徑上
Alias /URL/ "/PATH/TO/SOMEDIR/" 如:Alias /bbs/ "/bbs/htdocs"
設定默認字符集:
AddDefaultCharset UTF-8
虛擬主機:
有三種實現方案:
基於ip:爲每個虛擬主機準備至少一個ip地址
基於port:爲每個虛擬主機準備至少一個專用port,實踐中很少使用
基於域名:爲每個虛擬主機準備至少一個專用域名
需要將NameVirtualHost的註釋去掉
可混合使用上述三種方式中任意方式
注意:一般虛擬主機莫與中心主機混用,所以,要使用虛擬主機,必須先禁用中心主機
禁用中心主機:註釋DocumentRoot
每個虛擬主機都有專用配置:還可以在虛擬主機中通過Directory進行訪問控制
<VirtualHost *:80> #此處的*可以換成指定的IP地址 ServerAdmin [email protected] DocumentRoot /www/docs/dummy-host.example.com ServerName dummy-host.example.com ErrorLog logs/dummy-host.example.com-error_log CustomLog logs/dummy-host.example.com-access_log common </VirtualHost>
內置的status頁面:可以查看服務器的狀態
<Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from .example.com </Location>
使用mod_deflate模塊壓縮頁面優化傳輸速度:適用於httpd-2.2版本
適用場景:
a) 節約帶寬,額外消耗CPU,同時,可能有些較老瀏覽器不支持
b) 壓縮適於壓縮的資源,例如文本文件
方法:
a) 編輯主配置文件/etc/httpd/conf/httpd.conf,查找mod_deflate.so,將其前面的註釋去掉,啓用mod_deflate模塊
b) 將以下內容添加至主配置文件:
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. 根據首部的User-Agent基於正則模式匹配瀏覽器類型和版本 BrowserMatch ^Mozilla/4 gzip-only-text/html #瀏覽器是Mozilla/4時,用gzip壓縮,但只壓縮text/html格式的文檔 # Netscape 4.06-4.08 have some more problems 根據首部的User-Agent基於正則模式匹配瀏覽器類型和版本 BrowserMatch ^Mozilla/4\.0[678] no-gzip #瀏覽器是Mozilla的4.0、4.6、4.7或4.8版本時不壓縮 # MSIE masquerades as Netscape, but it is fine 根據首部的User-Agent基於正則模式匹配瀏覽器類型和版本 BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html #瀏覽器是IE6.0之前的版本時,不壓縮,若要壓縮則只用gzip壓縮text/html格式的文檔
配置httpd支持https:
a) 爲服務器申請數字證書
測試:通過私建CA發證書
創建私有CA
在服務器創建證書籤署請求
CA簽證
b) 配置httpd支持使用ssl,及使用的證書
yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot = ?? ServerName = ?? SSLCertificateFile = ?? SSLCertificateKeyFile = ??
c) 測試基於https訪問相應的主機
openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
httpd-2.4常用配置:
切換使用MPM(編輯/etc/httpd/conf.modules.d/00-mpm.conf文件):
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so # NAME:有三種,分別爲prefork,event,worker
修改“Main" Server的DocumentRoot
基於IP的訪問控制法則:
允許所有主機訪問: Require all granted
拒絕所有主機訪問: Require all deny
控制特定IP訪問:
Require ip IPADDR:授權指定來源地址的主機訪問 Require not ip IPADDR:拒絕指定來源地址的主機訪問 IPADDR的類型: IP:192.168.1.1 Network/mask:192.168.1.0/255.255.255.0 Network/Length:192.168.1.0/24 Net:192.168
控制特定主機(HOSTNAME)訪問:
Require host HOSTNAME Require not host HOSTNAME HOSTNAME的類型: FQDN:特定主機的全名 DOMAIN:指定域內的所有主機
注意:httpd-2.4版本默認是拒絕所有主機訪問的,所以安裝以後必須做顯示授權訪問
示例:
<RequireAll> Require not ip 192.168.1.20 Require all granted </RequireAll>
虛擬主機:
基於IP、PORT和域名都支持
基於域名的不再需要NameVirtualHost指令
ssl:
啓用模塊:編輯/etc/httpd/conf.modules.d/00-base.conf文件,添加下面這行,如果已經有了但是註釋了,則取消註釋即可
LoadModule ssl_module modules/mod_ssl.so
服務腳本:
CentOS6編譯安裝的服務腳本:apachectl {start | stop | restart}
CentOS7的服務腳本:httpd.service,使用systemctl控制