本文旨在複習httpd2.2常用配置。複習http協議相關知識、httpd2.2配置文件相關配置介紹、配置httpd的身份驗證、配置httpd虛擬主機 等等。
知識儲備:
http協議知多少?
http協議:
HTTP:hyper text transfer protocol,超文本傳輸協議,是互聯網上應用最爲廣泛的一種網絡協議。HTTP是一個客戶端終端(用戶)和服務器端(網站)請求和應答的標準。通常,由HTTP客戶端發起一個請求,創建一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器則在那個端口監聽客戶端的請求。一旦收到 請求,服務器會向客戶端返回一個狀態,比如"HTTP/1.1 200 OK",以及返回的內容,如請求的文件、錯誤消息、或者其它信息。
http協議版本:
http/0.9:原型版本,功能簡陋
http/1.0: cache,MIME,method
MIME:Multipurpose Internet Mail Extension
method(請求方法):GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS
http/1.1: 增強了緩存功能
http/2.0:
http工作模式:
HTTP客戶端發起一個請求,創建一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器則 在那個端口監聽客戶端的請求。一旦收到 請求,服務器會向客戶端返回一個狀態
http請求報文:http request
http響應報文:http response
簡單來來說 一次http事務就是:請求<-->響應
web資源:web resource
靜態資源:無需服務端做出額外處理。如:.jpg, .png, .gif, .html, .txt, .js,.css, .mp3,.avi 等。
動態資源:服務端需要通過執行程序做出處理, 發送給客戶端的是程序的運行結果。
如 .php,.jsp
注意:一個頁面中展示的資源可能有多個,每個資源都需要單獨處理。
資源標識:URL 統一資源標識符
Uniform Resource Locator:用於描述服務器特定資源的位置
例如: http://www.sina.com.cn/index.html
Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]
一次完整的http請求處理過程:
(1)建立或者處理連接;接收或者拒絕請求
(2)接收請求;接收來自互聯網上的主機請求報文中對某特定資源的一次請求過程。
(3)處理請求;對請求資源進行解析,獲取客戶端的請求資源及請求方法。
(4)訪問資源:通過存儲IO獲取用戶的請求的資源。
(5)構建響應報文
(6)發送響應報文
(7)記錄日誌
併發訪問響應模型:
單進程I/O模型:啓動一個進程處理用戶請求;一次只能處理一個請求,多個請求被串行響應。
多進程I/O模型:並行啓動多個進程,每個進程響應一個請求。
複用I/O模型:一個進程響應n個請求。
多線程模式:一個進程生成n個線程,一個線程處理一個請求。
事件驅動(event-driven):一個進程直接處理n個請求。
複用的多進程I/O模型:啓動多個(m)進程,每個進程生成(n)個線程。
http協議實現:
靜態服務器技術:httpd(apache),nginx,lighttpd ...
應用程序服務器:動態服務器技術,IIS: .net 、tomcat:.jsp
httpd測程序版本:
httpd 1.3:官方已經停止維護
httpd 2.0:
httpd 2.2:MPM不支持DSO機制
httpd 2.4:目前最新穩定版:支持DSO
CentOS6.7中httpd-2.2配置詳解
1.httpd的相關功能
CGI:Common Gateway Interface
虛擬主機:IP,PORT, FQDN
反向代理
負載均衡:bytraffic,bybusiness,byrequest
路徑別名
豐富的用戶認證機制
basic
digest
支持第三方模塊
......
2.httpd的特性
高度模塊化:core+modules
DSO:dynamic shared object 動態共享對象
MPM:Multipath processing Modules (多路處理模塊)
prefork:多進程模型。一個主進程,多個子進程。每個進程響應一個請求;
主進程:負責生成子進程及回收子進程;負責創建套接字;負責接收請求,並將其派發給
某子進程進行處理;
n個子進程:每個子進程處理一個請求。
工作模型:會預先生成幾個空閒進程,隨時等待用於響應用戶請求;最大空閒和最小空閒.
worker:多進程多線程模型,一個線程響應一個用戶請求;
一個主進程:負責生成子進程;負責創建套接字;負責接收請求,並將其派發給某子進程
進行處理;
多個子進程:每個子進程負責生成多個線程;
每個線程:負責響應用戶請求;
併發數量:m*n
m:子進程數量
n:每個子進程所能創建的最大線程數量;
event:事件驅動模型,多進程模型,每個進程響應多個請求;
一個主進程:負責生成子進程;負責創建套接字;負責接收請求,並將其派發給某子進程進
行處理
子進程:基於事件驅動機制直接響應多個請求;
httpd-2.2: 仍爲測試使用模型;
httpd-2.4:event可生產環境中使用;
3.centos6:httpd-2.2程序環境
配置文件:/etc/httpd/conf/httpd.conf、 /etc/httpd/conf.d/*.conf
服務腳本:/etc/rc.d/init.d/httpd
腳本配置文件:/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.event
/ust/sbin/httpd.worker
日誌文件:
/var/log/httpd:
access_log:訪問日誌
error_log:錯誤日誌
站點目錄:
/var/www/html
模塊文件路徑:
/usr/lib64/httpd/modules
服務控制和啓動:
chkconfig httpd on|off
service httpd {start|stop|restart|status|configtest|reload}
4.httpd配置文件介紹
4.1 主配置文件:/etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
4.2 修改監聽的服務端口
Listen [IP:]PORT
(1) 省略IP表示爲0.0.0.0
(2)Listen指令可重複出現多次;
Listen 80 Listen 8080
(3)修改監聽socket,重啓服務進程方可生效;
4.3 持久連接(長連接)
Persistent Connection:tcp連接建立後,每個資源獲取完成後不全斷開連接,而是繼續等待
其它資源請求的進行;
如何斷開持久連接?
可以通過數量限制和時間限制
持久連接的副作用:
對併發訪問量較大的服務器,長連接機制會使得後續某些請求無法得到正常響應;
代碼段:
KeepAlive On|Off KeepAliveTimeout 15 持久連接的時間限制 MaxKeepAliveRequests 100 持久連接時最大請求資源數量
4.4 MPM-多路處理模塊
httpd-2.2不支持同時編譯多個MPM模塊,所以只能編譯時選定一個;CentOS 6的rpm包爲此專門
提供了三個應用程序文件,httpd(prefork), httpd.worker, httpd.event,分別用於實現對不
同的MPM機制的支持。默認使用prefork的MPM模塊
確認現在使用的那個程序文件的方法:
# ps aux|grep httpd
查看httpd程序的模塊文件列表:
# httpd -l
查看靜態編譯及動態編譯的模塊:
# httpd -M
更換使用的httpd程序,以支持其它MPM機制:
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}
注意:重啓服務進程才能生效
MPM配置:
prefork的配置
<IfModule prefork.c> StartServers 8 服務器啓動時建立的子進程數 MinSpareServers 5 最小空閒子進程數 MaxSpareServers 20 最大空閒子進程數 ServerLimit 256 服務器允許配置的進程數上限 MaxClients 256 允許同時伺服的最大接入請求數量(最大子進程數) MaxRequestsPerChild 4000 每個子進程在其生存期內允許伺服的最大請求數量 </IfModule>
worker的配置
<IfModule worker.c> StartServers 4 服務器啓動時建立的子進程數 MaxClients 300 允許同時伺服的最大接入請求數量(最大線程數) MinSpareThreads 25 最小空閒線程數 MaxSpareThreads 75 最大空閒線程數 ThreadsPerChild 25 每個子進程建立的線程數 MaxRequestsPerChild 0 每個子進程在其生存期內允許伺服的最大請求數量,0表示進 程永遠不會過期 </IfModule>
4.5 DSO 動態共享對象
配置指定實現模塊加載
LoadModule <mod_name> <mod_path>
模塊文件路徑可使用相對路徑:
相對於ServerRoot(/etc/httpd指向的路徑)
4.6 DocumentRoot "Main" server的文檔頁面路徑
DoucmentRoot指向的路徑爲URL路徑的起始位置
其相當於站點URL的根路徑;
(FileSystem) /data/vhosts1/index.html --> (URL) /index.html
4.8 站點訪問控制
基於兩種機制指明對哪些資源進行何種訪問控制
基於文件系統路徑:
<Directory "/PATH/TO/SOME_DIR"> ... </Directory> <File ""> ... </File> <FileMatch "PATTERN"> ... </FileMatch>
基於URL路徑:
<Location "/PATH/TO/SOME_URL"> ... </Location> <LocationMatch "URL_PATTERN"> ... </LocationMatch>
4.8.1 <Directory>中“基於源地址”實現訪問控制
(1) Options
用於定義資源的展示方式,後跟1個或多個以空白字符分隔的“選項”列表;
Indexes:
指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給
用戶。
FollowSymLinks:
允許跟蹤符號鏈接文件所指向的源文件;
ExecCGI:允許執行CGI腳本。
None:
All:
(2)AllowOverride
httpd允許訪問控制相關的哪些指令可以放在.htaccess文件(每個目
錄下都可以有一個)中;
/data/web/
.htaccess
admin:.htaccess
images:.htaccess
None:
All:
(3)order,allow和eny from
基於ip地址的訪問控制
order:定義allow和deny的生效次序;寫在後面的表示默認法則;
Allow from IP/NETWORK/FQDN
Deny from IP/NETWORK/FQDN
來源地址格式:
IP或者Netaddr
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
來源請求遵循最佳匹配法則機制:
order allow,deny(默認機制)白名單
order deny,allow(默認機制) 黑名單
allow from all
4.8.2 基於用戶的訪問控制機制
認證方式有2種:basic 明文,digest消息摘要認證
安全域:需要用戶認證後方能訪問的路徑;應該通過名稱對其進行標識,以便於告知用戶
認證的原因;
虛擬賬號:僅用於訪問某服務時用到的行號和密碼
存儲於何處(httpd要有相應的適配模塊):
文本文件;sql數據庫;ldap目錄存儲
basic基於用戶認證配置示例:
(1) 定義安全域
<Directory "/data/web/admin"> Options None AllowOverride None AuthType Basic AuthName "SOME_STRING_HERE" AuthName "For Administrators" AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" AuthUserFile "/etc/httpd/conf/.htpasswd" Require user username1 username2 ... </Directory>
允許賬號文件中的所有用戶登錄訪問:
Require valid-user
(2) 提供賬號和密碼存儲(文本文件)
使用專用命令完成此類文件的創建及用戶管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自動創建此處指定的文件,因此,僅應該在此文件不存在時使用;
-m:md5格式加密
-s: sha格式加密
-D:刪除指定用戶
# htpasswd -c -m /etc/httpd/conf/.htpasswd jerry
# htpasswd -m /etc/httpd/conf/.htpasswd tom
basic基於組賬號認證配置示例:
(1)定義安全域
<Directory ""> Options None AllowOverride None AuthType Basic AuthName "String“ AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" Require group grpname1 grpname2 ... </Directory>
(2) 創建用戶賬號和組賬號文件;
組文件:每一行定義一個組
GRP_NAME: username1 username2 ...
4.9 定義站點默認主頁
DirectoryIndex index.html index.html.var
4.10 定義路徑別名
Alias /URL/ "/PATH/TO/SOMEDIR/"
alias 指定的URL右側的“/” 相當於後面的路徑右側的“/”
DocumentRoot "/data/vhosts1"
http://www.magedu.com/images/logo.png
/data/vhosts1/images/logo.png
Alias /images/ "/tmp/pub/"
http://www.magedu.com/images/logo.png
/tmp/pub/logo.png
4.11 設定默認字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
4.12 日誌設定
日誌類型:訪問日誌 和錯誤日誌
錯誤日誌:
ErrorLog logs/error_log
LogLevel warn
Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
訪問日誌:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat:定義日誌信息格式
CustomLog:指明日誌文件路徑及日誌格式
LogFormat format strings:
%h:遠程主機,客戶端IP地址; %l:Remote User, 通常爲一個減號(“-”); %u:Remote user (from auth; may be bogus if return status (%s) is 401); 非爲登錄訪問時,其爲一個減號; %t:服務器收到請求時的時間; %r:First line of request, 即表示請求報文的首行;記錄了此次請求的“方法”,“URL”以及協議版本; %>s:響應狀態碼; %b:響應報文的大小,單位是字節;不包括響應報文的http首部; %{Referer}i:請求報文中首部“referer”的值; 即從哪個頁面中的超鏈接跳轉至當前頁面的; %{User-Agent}i:請求報文中首部“User-Agent”的值;即發出請求的應用程序;
4.13 虛擬主機配置
站點標識:socket
ip相同,但是端口不同
ip不同,但是端口默認端口
FQDN不同:
請求報文首部
虛擬主機有三種實現方案:
基於ip:爲每個虛擬主機準備至少一個獨有ip地址;
基於port:爲每個虛擬主機使用至少一個獨有的port;
基於FQDN:爲每個虛擬主機使用至少一個FQDN;
注意:一般虛擬機不要與中心主機混用;因此要使用虛擬主機,得先禁用'main'機;
禁用方法:註釋中心主機的DocumentRoot指令即可;
虛擬主機的配置方法:
<VirtualHost IP:PORT> ServerName FQDN DocumentRoot "" </VirtualHost> 其它可用指令: ServerAlias:虛擬主機的別名;可多次使用; ErrorLog: CustomLog: <Directory ""> 可設置訪問控制 ... </Directory> Alias ...