httpd配置-CentOS6
# yum install httpd
CentOS6上httpd程序安裝完成後的主要文件分布:
主配置文件:/etc/httpd/conf/httpd.conf
輔助配置文件:/etc/httpd/conf.d/*.conf 其作用是為httpd.conf提供片段
服務腳本:/etc/rc.d/init.d/httpd
服務腳本配置文件:/etc/sysconfig/httpd
主程序文件:
prefork模型程序文件:/usr/sbin/httpd
worker模型程序文件:/usr/sbin/httpd.worker
event模型程序文件:/usr/sbin/httpd.event
訪問日誌文件目錄:/var/log/httpd/access_log
錯誤日誌文件目錄:/var/log/httpd/error_log
站點文檔目錄:/var/www/html(可以理解為網頁文件存放目錄)
模塊文件路徑:/usr/lib64/httpd/modules/
CentOS6上httpd服務常用配置(以下配置均在httpd.conf中)
配置文件的組成:
分為三部分組成
第一部分
### Section 1:Global Environment
配置全局環境,程序工作特性
### Section 2:'Main' server configuration
主服務器配置
### Section 3:Virtual Hosts
虛擬主機配置
### Section 1 Global Environment
1、修改監聽的IP和端口
Listen [IP:]PORT
例:Listen 172.16.20.242:8080
省略IP表示監聽本機所有IP地址;且Listen可重復多次;
例:
則表示即監聽本機所有IP地址的80端口,也監聽IP172.16.20.246的8080端口。
2、持久連接,Persistent Connection
連接建立,每個資源獲取完成後不會立即斷開連接,而是繼續等待其它的請求完成;
KeepAlive On|Off
是否開啟KeepAlive
MaxKeepAliveRequests #
持久連接允許的發起的的最大請求次數,默認為100,
KeepAliveTimeout #
超時時長,即連接建立之後,第一次請求和第二次請求之間的最大時間,默認為15秒,超過這個時間,連接就會斷開,再次請求就必須重新建立連接
測試KeepAlive配置效果
使用telnet HOST PORT指令
輸入GET /URL HTTP/1.1(HTTP/1.1為協議版本)
Host: HOSTNAME or IP
敲兩次回車
如果開啟了KeepAlive,那麽連接不會斷開,等待用戶繼續發起請求,知道超過超時時間
如果未開啟KeepAlive,那麽連接會立即斷開
3、MPM配置
MPM即Multipath Process Module是;多道處理模塊,模型分別為prefork,worker,event,httpd-2.2不支持同時編譯多個模塊,所以只能在編譯安裝時選定一個;rpm安裝的包提供三個二進制程序文件,分別用於實現不同MPM機制的支持;
prefork:多進程模型,每個進程響應一個請求;
一個主進程,負責生成n個子進程,子進程也成為工作進程,每個子進程處理一個用戶請求,也會預先生成多個空閑進程,隨時等待請求到達;最大不會超過2014個;
prefork配置如下
StartServers:服務啟動時啟動的服務器進程數。
MinSpareServers:最小空閑進程數,當httpd啟動時,會先啟動StartServers個子進程,然後再啟動MinSpareServers個子進程。
MaxSpareServers:最大空閑進程數,如果空閑子進程數大於MaxSpareServers個,那麽httpd會自動kill掉超出的子進程。
MaxClients:並發請求的最大數,即可以同時處理的請求數。
ServerLimit:最大活動進程數,為MaxClient所準備的在其服務生命周期內所允許的最大值,在線的服務器進程數量最大值。最大值為200000,當MaxClients不夠用時,可以增大ServerLimit,然後增大MaxClients,一般這兩個值相等。
MaxRequestPerChild:每個子進程在生命周期內所能夠響應的最大請求數;一旦某進程超過了這個數量則會自動釋放所有內存後自殺。這個值可以設置為0,0即永不結束,但這樣做的弊端是進程占用內存過大而且容易內存溢出。不過對於KeepAlive鏈接,只有第一個請求會被算作一個請求,KeepAlive有效期內的其它請求不算。
worker:多線程模型,每個線程響應一個請求;
一個主進程,生成多個子進程,每個子進程生成固定個數的線程,每個線程獨立響應一個請求。
worker配置如下
StartServers:當httpd程序啟動時,伴隨啟動StartServers個子進程。
MaxClients:並發請求的最大數,即所有子進程中的線程總數限制。
MinSpareThreads:最小空閑線程數。
MaxSpareThreads:最大空閑線程數。
ThreadsPerChild:每個子進程可以生成的線程數。
MaxRequestsPerChild:每個線程在生命周期內可以相應的最大請求數,0表示不限制。
event模型
事件驅動模型
一個主進程,生產多個子進程,每個子進程直接響應n個請求。
在httpd-2.2中,event為測試使用
在httpd-2.4中,event可在生產使用
確認當前使用的模塊的方法:
# ps aux | grep httpd
這裏可以查看到運行的是httpd.worker程序,其默認為/usr/sbin/httpd,即prefork
查看當前使用的靜態編譯的模塊:
更換使用的httpd程序:
通過修改/etc/sysconfig/httpd實現,這是服務腳本/etc/rcd/init.d/httpd的配制文件
如果需要切換為其它程序文件,直接將HTTPD=/usr/sbin/httpd.worker中的httpd.worker更改為httpd(prefork模型)或httpd.event(event模型)。需要註意的是,修改配置後,需要重新啟動httpd服務才能使配置生效。
4、DSO
Dynamic Shared Object,動態共享對象,即動態裝卸載模塊
查看所有模塊包括靜態編譯和動態加載的
# httpd -M
使用配置指令實現模塊加載
LoadModule <mod_name> <mod_path>
模塊路徑mod_path可使用相對路徑,即相對於ServerROOT(/etc/httpd)指向的路徑而言,而在/etc/httpd/modules是一個指向/usr/lib64/httpd/modules/的軟鏈接。因為真實的模塊存放路徑是/usr/lib64/httpd/modules/
# ll /etc/httpd/modules
# ls /usr/lib64/httpd/modules/
啟用和禁用模塊:
直接在/etc/httpd/conf/httpd.conf中修改
# vim /etc/httpd/conf/httpd.conf
如上圖所示,如果需要禁用某模塊,直接在該模塊指令前加上"#"號,使該指令註釋掉即可,如果需要啟用模塊,刪掉指令前的"#"號和空白字符。註意:修改後需要重啟服務才能生效。
### Section 2:'Main' server configuration
5、定義'Main' Server的文檔頁面路徑,即DocmentRoot,也就是網頁文件存放目錄
默認路徑為/var/www/html/,直接修改路徑即可,且路徑要真實存在。
DocumentRoot指向的路徑為URL路徑的起始位置:
DocumentRoot "/var/www/html"
如果在/var/www/html/test/index.html,那麽訪問該網頁時,應該輸入路徑:http://x.x.x.x/test/index.html
6、站點訪問控制
即可基於兩種類型的路徑指明對哪些資源進行訪問控制
基於文件系統路徑:
<Directory ""></Directory>
<File ""></File> 針對單個文件做訪問控制
<FileMatch ""></FileMatch>基於匹配機制進行文件訪問控制
基於URL路徑:
<Location ""></Location>
...
訪問控制機制:
基於來源地址(IP)
基於用戶賬號密碼
7、Directory中基於來源地址實現訪問控制
<Directory "/www/htdocs"> Options None AllowOverride None Order allow,deny Allow from all </Directroy>
如果所示,當需要對資源文件進行訪問控制的時候,需要修改Directory指令所指定的路徑,並且在其中修改訪問控制指令,訪問控制指令如下:
(1)Options
定義用戶對此目錄下資源進行訪問時所支持的訪問選項
所有可用特性:Indexes Includes FollowSysmLinks SymLinksifOwnerMatch ExecCGI MultiViews None All
在指定的選項前加"-"號,意為使此選項失效
例:Options -Indexes Inclues
Indexes:索引
當沒有定義主頁面時,如果允許Indexes,那麽會列出指定的文檔根路徑下的所有目錄及文件,具有非常大的安全風險,CentOS默認設置有默認頁面,會在沒有定義主頁面,而又允許Indexes時,用戶就會訪問到默認設置的頁面,這個網頁文件定義在/etc/htpd/conf.d/welcome.conf中
Includes:允許使用mod_include提供的服務器端包含
FollowSymLinks:允許跟蹤符號鏈接文件;如果在資源目錄中有符號鏈接,那麽訪問符號鏈接時,會自動追溯訪問符號鏈接指向的文件。
SymLinksifOwnerMatch:只有當前源文件和符號鏈接文件屬主相同,才允許跟蹤符號鏈接文件。
ExecCGI:是否允許執行CGI腳本。
MultiViews:是否允許多視圖
AllowOverride:是否允許在此處配置的目錄訪問控制覆蓋每個目錄自身的目錄訪問控制(每目錄訪問控制)。
(2)基於來源地址的訪問控制機制
Order:
Order allow,deny 只有allow的才allow,其他的都為deny,白名單
Order deny,allow 只有deny的才deny,其他的都為allow,黑名單
Allow from ...
Deny from ...
來源地址:
IP
NetAddr:支持多種格式,如下
172.16 == 172.16.0.0 == 172.16.0.0/16 == 172.16.0.0/255/255.0.0
例:
Order allow,deny Allow from 172.16.20.242
意為只放行172.16.20.242,其他的全部都拒絕。
Order deny,allow Allow from 172.16.20.242
意為只拒絕172.16.20.242,其他的全部允許。
8、定義默認主頁面
DirectoryIndex index.html index.html.var
可以同時定義多個。
9、日誌設定
當客戶端訪問http資源時會產生日誌,日誌有兩類,錯誤日誌和訪問日誌。
錯誤日誌:
ErrorLog logs/error_log
此路徑是相對應/etc/httpd/而言,而不是根路徑,即/etc/httpd/logs/error_log
LogLevel warn 日誌級別
級別從高到低一次排列順序為:
emerg,alert,crit,error,warn,notice,info,debug
emerg:緊急情況,系統無法使用
alert:必須立即采取措施
crit:致命情況
error:錯誤情況
warn:警告情況
notice:一般重要情況
info:普通信息
debug:出錯級別信息
如果定義錯誤日誌記錄級別為某一級時,則表示會記錄比這個級別更高的的錯誤日誌,包括這個級別
例:LogLevel warn定義記錄級別為warn,那麽按照排序,warn以上級別的日誌都會記錄,包括emerg,alert,crit,error,包括warn。
訪問日誌:
CustomLog logs/access_log combined
日誌存儲位置 日誌格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
% 表示在記錄日誌時,根據用戶請求將這些宏替換成對應的相關信息。如下:
%h:客戶端IP地址;
%l:Remote logname(form identd,if supplied);-表示為空;並非表單登錄名,而是使用mod_ident登陸
%u:Remote user,(from auth;may be bogus if return status (%s)is 401);即基於httpbasic或digist登陸認證的用戶名;
%t:Time the request was received(standard english format),服務器收到請求的時間;
%r:First line of request,請求報文的首行信息(method url version);
%>s:響應狀態碼;響應狀態中最後一段數值格式的響應狀態碼信息,而不包括原因短語;
%b:響應報文的大小,單位是字節,不包含響應報文首部;
%{Referer}i:請求報文當中“referer”首部的值;當前資源的訪問入口,即從哪個頁面中的超鏈接跳轉而來;
%{User-Agent}i:請求報文當中"User-Agent"首部的值;即發出請求用到的程序;
詳情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10、路徑別名
Alias /URL/ "/PATH/TO/SOMEDIR/"
示例:
Alias /bbs/ "/forum/htdocs"
http://www.xxx.com/bbs/index.html
默認index.html存放在/www/htdocs/bbs/
通過別名機制使得路徑變成了/forum/htdocs/bbs/
這時候如果訪問http://www.xxx.com/bbs/index.html,就不是訪問的/www/htdocs/bbs/index.html,而是/forum/htdocs/bbs/index.html
11、設定默認字符集
AddDefaultCharset XXX
常見的中文字符集:GBK,GB2312,GB18030
12、基於用戶的訪問控制
即使用用戶名密碼的機制對資源的訪問進行控制。
認證質詢:
WWW-Authenticate:響應碼為401,拒絕客戶端請求,並說明要求客戶提供賬號和密碼;
認證:
Authorization:客戶端用戶填入賬號和密碼後再次發送請求報文;認證通過,則服務器端發送響應的資源;
認證方法:
basic:明文
digest:消息摘要,即經過md5加密,很多老版本的瀏覽器不支持digest認證;不過可以放置在https中使用,現在大多數都是通過表單認證(使用編寫的認證程序進行認證,與http程序無關),很少通過這種認證。
安全域:需要用戶認證後方能訪問的路徑(多為敏感資源或路徑);應該通過名稱對其進行標識,並用於告知用戶認證的原因;
用戶的賬號和密碼,一般使用虛擬賬號;避免使用系統賬號,產生安全隱患,僅用於訪問某服務器時用到的認證標識;
存儲:
文本文件
SQL數據庫
ldap 輕量目錄訪問協議
nis ???
basic認證:
(1)定義安全域
<Directory ""> Options None AllowOverride None AuthType Basic //認證類型為明文認證 AuthName "STRING" //認證名為為STRING AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" //認證所用的用戶文件存儲位置 Require user username1 usename2 ... //可用的用戶,即那些用戶可以通過認證,取自用戶文件 </Directory>
例:
首先在httpd.conf中做好相應配置,然後創建存儲用戶名和密碼的用戶文件
(2)提供賬號和密碼存儲(文本文件)
用戶文件需要使用htpasswd命令進行創建和管理等
htpasswd [options] PASSWORD_FILE USERNMAE
-c:自動創建password_file,因此,僅應該在添加第一個用戶時使用;
-m:md5加密用戶密碼
-s:sha1加密用戶名密碼
-D:刪除指定用戶
例:
可以通過cat命令查看密碼文件,可以看出用戶的密碼都是加密存放的。
(3)實現基於組進行認證
<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>
要提供用戶文件和組文件
組文件中每一行定義一個組;與用戶不就不同的是需要手動創建
GRP_NAME:user1 user2 user3 ...
[root@localhost htdocs]# vim /etc/httpd/conf.d/.htpgroup MyGroup1: tom jerry [root@localhost htdocs]#
示例:
13、虛擬主機,即可以在一個物理服務器上提供多個網頁站點服務
有三種實現方案:
基於IP:為每個虛擬主機準備至少一個IP地址
基於PORT:為每個虛擬主機準備至少一個專用port;實踐中很少使用
基於hostname:為每個虛擬主機準備至少一個專用hostname;實踐中很多使用
可混合使用上述三種方式中任意方式:
註意:一般虛擬主機不能與中心主機混用,所以,要使用虛擬主機,線禁用中心主機;禁用中心主機需要註釋DocumentRoot
每個虛擬主機都有自己的專用配置:
<VirtualHost "IP:PORT">
ServerName ""
DocumentRoot ""
ServerAlias
ErrorLog
CustomLog
</VirtualHost>
例1:基於ip
需要有多個IP地址,httpd.conf中配置好後,還需要創建好網頁文件,否則會報錯。日誌文件制定好路徑和文件名後,系統會自動生成的。
例2:基於port
需要用到除80以外的端口時,需要額外修改Listen指令
例3:基於hostname
首先需要將NameVirtualHost *:80啟用,2.2需要,2.4不需要啟用,並且將*號改為監聽的IP地址
配置如下
14、內置的status頁面
可以通過此頁面查看關於服務器的相關信息
在Order指令中,可以配置允許那些IP用戶訪問此頁面,這是非常有必要的
配置完畢後,需要重載配置文件才能生效,訪問地址為: http://x.x.x.x/server-status
如果需要查看更詳細的信息,需要啟用ExtendedStatus On
實現:基於賬號實現訪問控制,在location中實現
寫的比較潦草,如有遺漏錯誤和爭議之處,歡迎大家的批評指正和討論,謝謝。
httpd配置-CentOS6