CentOS6上的httpd程序包爲httpd-2.2版本,能夠直接使用rpm包安裝或者源碼編譯安裝,rpm包的安裝方式再也不贅述:html
# yum install httpd
CentOS6上httpd程序安裝完成後的主要文件分佈:
數據庫
主配置文件:/etc/httpd/conf/httpd.conf
apache
輔助配置文件:/etc/httpd/conf.d/*.conf 其做用是爲httpd.conf提供片斷vim
服務腳本:/etc/rc.d/init.d/httpd瀏覽器
服務腳本配置文件:/etc/sysconfig/httpd安全
主程序文件:bash
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
一、修改監聽的IP和端口
Listen [IP:]PORT
例:Listen 172.16.20.242:8080
省略IP表示監聽本機全部IP地址;且Listen可重複屢次;
例:
則表示即監聽本機全部IP地址的80端口,也監聽IP172.16.20.246的8080端口。
二、持久鏈接,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,那麼鏈接會當即斷開
三、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服務才能使配置生效。
四、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
五、定義'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
六、站點訪問控制
便可基於兩種類型的路徑指明對哪些資源進行訪問控制
基於文件系統路徑:
<Directory ""></Directory>
<File ""></File> 針對單個文件作訪問控制
<FileMatch ""></FileMatch>基於匹配機制進行文件訪問控制
基於URL路徑:
<Location ""></Location>
...
訪問控制機制:
基於來源地址(IP)
基於用戶帳號密碼
七、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,其餘的所有容許。
八、定義默認主頁面
DirectoryIndex index.html index.html.var
能夠同時定義多個。
九、日誌設定
當客戶端訪問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
十、路徑別名
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
十一、設定默認字符集
AddDefaultCharset XXX
常見的中文字符集:GBK,GB2312,GB18030
十二、基於用戶的訪問控制
即便用用戶名密碼的機制對資源的訪問進行控制。
認證質詢:
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]#
示例:
1三、虛擬主機,便可以在一個物理服務器上提供多個網頁站點服務
有三種實現方案:
基於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地址
配置以下
1四、內置的status頁面
能夠經過此頁面查看關於服務器的相關信息
在Order指令中,能夠配置容許那些IP用戶訪問此頁面,這是很是有必要的
配置完畢後,須要重載配置文件才能生效,訪問地址爲: http://x.x.x.x/server-status
若是須要查看更詳細的信息,須要啓用ExtendedStatus On
實現:基於帳號實現訪問控制,在location中實現
寫的比較潦草,若有遺漏錯誤和爭議之處,歡迎你們的批評指正和討論,謝謝。