Apache2.2安全配置和性能優(yōu)化 
 
 
一、	Apache禁止目錄遍歷 
 
 
將Options Indexes FollowSymLinks中的Indexes 去掉,就可以禁止 Apache 顯示該目錄結(jié)構(gòu)。Indexes 的作用就是當(dāng)該目錄下沒(méi)有 index.html文件時(shí),就顯示目錄結(jié)構(gòu)。 
 
 
 
 
二、	apache 隱藏版本信息 
1.隱藏Apache版本信息 
 
 
測(cè)試默認(rèn) apache 的狀態(tài)信息 
[root@1314it conf]# curl -Is localhost 
HTTP/1.1 200 OK 
Date: Tue, 16 Nov 2010 04:20:15 GMT 
Server: Apache/2.2.3 (CentOS) DAV/2 PHP/5.1.6 mod_perl/2.0.4 Perl/v5.8.8 
X-Powered-By: PHP/5.1.6 
Connection: close 
Content-Type: text/html; charset=GB2312 
 
 
[root@1314it conf]# 
 
 
修改主配置文件 httpd.conf 
ServerSignature Off 
ServerTokens Prod 
 
 
重啟 apache 測(cè)試 
 
 
測(cè)試隱藏版本號(hào)后 apache 的狀態(tài)信息 
[root@1314it conf]# curl -Is localhost 
HTTP/1.1 200 OK 
Date: Tue, 16 Nov 2010 04:21:41 GMT 
Server: Apache 
X-Powered-By: PHP/5.1.6 
Connection: close 
Content-Type: text/html; charset=GB2312 
 
 
[root@1314it conf]# 
三、	apache隱藏banner(版本),關(guān)閉trace 
Apache Banner的隱藏方法,  
修改httpd.conf文件,設(shè)置以下選項(xiàng): 
ServerTokens ProductOnly 
ServerSignature Off 
關(guān)閉trace-method 
TraceEnable off 
另外apache可以在編譯的時(shí)候,故意混淆banner信息,達(dá)到隱藏的目的 
 
 
四、	apache并發(fā)數(shù)調(diào)整 
在/usr/local/etc/apache22/httpd.conf中加載MPM配置(去掉前面的注釋?zhuān)?br />
# Server-pool management (MPM specific) 
Include etc/apache22/extra/httpd-mpm.conf 
可見(jiàn)的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但里面根據(jù)httpd的工作模式分了很多塊,哪一部才是當(dāng)前httpd的工作模式呢?可通過(guò)執(zhí)行 apachectl -l 來(lái)查看: 
Compiled in modules: 
              core.c 
              prefork.c 
              http_core.c 
              mod_so.c 
看到prefork 字眼,因此可見(jiàn)當(dāng)前httpd應(yīng)該是工作在prefork模式,prefork模式的默認(rèn)配置是: 
<IfModule mpm_prefork_module> 
   StartServers    5 
   MinSpareServers  5 
   MaxSpareServers  10 
   MaxClients     150 
   MaxRequestsPerChild   0 
</IfModule> 
2.要加到多少? 
連接數(shù)理論上當(dāng)然是支持越大越好,但要在服務(wù)器的能力范圍內(nèi),這跟服務(wù)器的CPU、內(nèi)存、帶寬等都有關(guān)系。 
查看當(dāng)前的連接數(shù)可以用: 
ps aux | grep httpd | wc -l 
或: 
pgrep httpd|wc -l 
計(jì)算httpd占用內(nèi)存的平均數(shù): 
ps aux|grep -v grep|awk '/httpd/{sum+=;n++};END{print sum/n}' 
由于基本都是靜態(tài)頁(yè)面,CPU消耗很低,每進(jìn)程占用內(nèi)存也不算多,大約200K。 
服務(wù)器內(nèi)存有2G,除去常規(guī)啟動(dòng)的服務(wù)大約需要500M(保守估計(jì)),還剩1.5G可用,那么理論上可以支持1.5*1024*1024*1024/200000 = 8053.06368 
約8K個(gè)進(jìn)程,支持2W人同時(shí)訪問(wèn)應(yīng)該是沒(méi)有問(wèn)題的(能保證其中8K的人訪問(wèn)很快,其他的可能需要等待1、2秒才能連上,而一旦連上就會(huì)很流暢) 
五、	控制最大連接數(shù)的MaxClients ,因此可以嘗試配置為: 
<IfModule mpm_prefork_module> 
                StartServers                      5 
                MinSpareServers                   5 
                MaxSpareServers                  10 
                ServerLimit                    5500 
                MaxClients                     5000 
                MaxRequestsPerChild               100 
</IfModule> 
注意,MaxClients默認(rèn)最大為250,若要超過(guò)這個(gè)值就要顯式設(shè)置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重啟httpd時(shí)會(huì)有提示。 
重啟httpd后,通過(guò)反復(fù)執(zhí)行pgrep httpd|wc -l 來(lái)觀察連接數(shù),可以看到連接數(shù)在達(dá)到MaxClients的設(shè)值后不再增加,但此時(shí)訪問(wèn)網(wǎng)站也很流暢,那就不用貪心再設(shè)置更高的值了,不然以后如果網(wǎng)站訪 問(wèn)突增不小心就會(huì)耗光服務(wù)器內(nèi)存,可根據(jù)以后訪問(wèn)壓力趨勢(shì)及內(nèi)存的占用變化再逐漸調(diào)整,直到找到一個(gè)最優(yōu)的設(shè)置值。 
(MaxRequestsPerChild不能設(shè)置為0,可能會(huì)因內(nèi)存泄露導(dǎo)致服務(wù)器崩潰) 
更佳最大值計(jì)算的公式: 
apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2 
apache_max_process = apache_max_process_with_good_perfermance * 1.5 
 
 
六、	Apache日志切割 
方法1、使用 cronolog 為每一天建立一個(gè)新的日志 
安裝cronolog程序 
主配置文件中的使用方法 
ErrorLog "|bin/cronolog logs/error_%Y%m%d.log" 
CustomLog "|bin/cronolog logs/access_%Y%m%d.log" combined 
虛擬主機(jī)配置文件中的使用方法 
ServerAdmin webmaster@localhost 
DocumentRoot "E:/htdocs" 
ServerName localhost 
ErrorLog "|bin/cronolog logs/localhost/error_%Y%m%d.log" 
CustomLog "|bin/cronolog logs/localhost/access_%Y%m%d.log" combined 
方法2使用 rotatelogs 每隔一天記錄一個(gè)日志 
主配置文件中的使用方法 
 
 
ErrorLog "|bin/rotatelogs -l logs/error_%Y%m%d.log 86400" 
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined 
虛擬主機(jī)配置文件中的使用方法 
 
 
ServerAdmin webmaster@localhost 
DocumentRoot "E:/htdocs" 
ServerName localhost 
ErrorLog "|bin/rotatelogs -l logs/localhost/error_%Y%m%d.log 86400" 
CustomLog "|bin/rotatelogs -l logs/localhost/access_%Y%m%d.log 86400" combined 
 
 
注意: 
這兩個(gè)管道日志文件程序還有一點(diǎn)不同之處是使用 cronolog 時(shí)如果日志是放在某個(gè)不存在的路徑則會(huì)自動(dòng)創(chuàng)建目錄,而使用 rotatelogs 時(shí)不能自動(dòng)創(chuàng)建,這一點(diǎn)要特別注意 
七、	apache對(duì)頁(yè)面進(jìn)行壓縮和頁(yè)面緩存來(lái)提升性能 
 
 
Apache來(lái)對(duì)頁(yè)面進(jìn)行壓縮和頁(yè)面緩存來(lái)提升性能.為了實(shí)現(xiàn)這些功能需要三個(gè)模塊mod_deflate、mod_expires和mod_headers 
 
 
要實(shí)現(xiàn)這些東西的配置先在httpd.conf文件下找到下面三個(gè)地方 
文本代碼 
#LoadModule deflate_module   modules/mod_deflate.so    
#LoadModule expires_module   modules/mod_expires.so    
#LoadModule headers_module   modules/mod_headers.so   
    同時(shí)去掉前面的“#”,這些模塊功能已經(jīng)開(kāi)啟了,下面我們?cè)谂渲肎ZIP和Expires了。配置GZIP和Expires也很容易,我們只需要在httpd.conf 配置文件中啟用并進(jìn)行相關(guān)的配置即可,配置如下: 
文本代碼 
<IfModule   mod_expires.c>     
 ExpiresActive   on    
 ExpiresDefault "now plus 1   day"   
 ExpiresByType image/x-icon "access plus 10   year"   
 ExpiresByType image/gif "access plus 1   month"   
 ExpiresByType image/jpeg "access plus 1   month"   
 ExpiresByType text/css "now plus 1   month"   
 ExpiresByType text/javascript "now plus 1   month"   
 ExpiresByType application/x-javascript "now plus 1   month"   
 ExpiresByType text/html "now plus 5   minutes"   
 ExpiresByType text/plain "now plus 1   month"   
 ExpiresByType image/js "access plus 1   month"   
 ExpiresByType application/x-shockwave-flash "access plus 1   week"   
 <FilesMatch   ".(gif|jpe?g|png)$">    
  Header set   Cache-Control "max-age=604800"   
  Header unset   ETag    
 </FilesMatch>    
</IfModule>    
FileETag   none    
<ifmodule   mod_deflate.c>    
 DeflateCompressionLevel   9   
 AddOutputFilterByType DEFLATE text/html text/plain text/xml   application/x-httpd-jsp    
 AddOutputFilter DEFLATE js   css    
</ifmodule>    
<Location   "/">    
 SetOutputFilter   DEFLATE    
 BrowserMatch ^Mozilla/4   gzip-only-text/html    
 BrowserMatch ^Mozilla/4.0[678]   no-gzip    
 BrowserMatch bMSIE !no-gzip   !gzip-only-text/html    
 SetEnvIfNoCase Request_URI   .(?:gif|jpe?g|png)$ no-gzip dont-vary    
 Header append Vary   User-Agent   env=!dont-vary    
</Location>   
 
 
 
 
八、	修改Apache配置文件開(kāi)啟gzip壓縮傳輸 
 
 
第1步 
LoadModule deflate_module modules/mod_deflate.so 
LoadModule headers_module modules/mod_headers.so 
  打開(kāi)httpd.conf后,先將上面兩行配置前面的#號(hào)去掉,這樣apache就會(huì)啟用這兩個(gè)模塊,其中mod_deflate是壓縮模塊,就是對(duì)要傳輸?shù)娇蛻?hù)端的代碼進(jìn)行g(shù)zip壓縮;mod_headers模塊的作用是告訴瀏覽器頁(yè)面使用了gzip壓縮,如果不開(kāi)啟mod_headers那么瀏覽器就會(huì)對(duì)gzip壓縮過(guò)的頁(yè)面進(jìn)行下載,而無(wú)法正常顯示。 
第2步 
  在httpd.conf中加入以下代碼,可以加到任何空白地方,不了解apache的朋友,如果擔(dān)心加錯(cuò)地方,就放到http.conf文件的最后一行,如果是虛擬服務(wù)器可以寫(xiě).htaccess文件里面,然后放在項(xiàng)目下即可。 
<IfModule mod_deflate.c> 
    SetOutputFilter DEFLATE    #必須的,就像一個(gè)開(kāi)關(guān)一樣,告訴apache對(duì)傳輸?shù)綖g覽器的內(nèi)容進(jìn)行壓縮 
 
 
    SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary #設(shè)置不對(duì)后綴gif,jpg,jpeg,png的圖片文件進(jìn)行壓縮 
    SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary #同上,就是設(shè)置不對(duì)exe,tgz,gz。。。的文件進(jìn)行壓縮 
    SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary 
 
 
    AddOutputFilterByType DEFLATE text/* #設(shè)置對(duì)文件是文本的內(nèi)容進(jìn)行壓縮,例如text/html  text/css  text/plain等 
    AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript #這段代碼你只需要了解application/javascript application/x-javascript這段就可以了,這段的意思是對(duì)javascript文件進(jìn)行壓縮 
    AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp #這段是告訴apache對(duì)php類(lèi)型的文件進(jìn)行壓縮 
 
 
    BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.x 有一些問(wèn)題,所以只壓縮文件類(lèi)型是text/html的 
    BrowserMatch ^Mozilla/4.0[678] no-gzip # Netscape 4.06-4.08 有更多的問(wèn)題,所以不開(kāi)啟壓縮 
    BrowserMatch bMSIE !no-gzip !gzip-only-text/html # IE瀏覽器會(huì)偽裝成 Netscape ,但是事實(shí)上它沒(méi)有問(wèn)題 
</IfModule>
 
 
	ServerTokens ProductOnly 
ServerSignature Off 
TraceEnable off 
 
 
<IfModule mod_deflate.c> 
    SetOutputFilter DEFLATE 
    SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary 
    SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary 
    SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary 
    AddOutputFilterByType DEFLATE text/* 
    AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript 
    AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp 
    BrowserMatch ^Mozilla/4 gzip-only-text/html 
    BrowserMatch ^Mozilla/4.0[678] no-gzip 
    BrowserMatch bMSIE !no-gzip !gzip-only-text/html 
</IfModule> 
  |