一、硬體方面
apache所運作的硬體環境都是對性能影響最大的因素,即使不能對硬體進行更新,也最好給apache一個單獨的主機以免受到其他應用的幹擾。
記憶體,對性能影響最大。對于靜态内容(圖檔、javascript檔案、css檔案等),它決定了apache可以緩存多少内容,它緩存的内容越多,在硬碟上讀取内容的機會就越少,大記憶體可以極大提高靜态站點的速度;對動态高負載站點來說,每個請求儲存的時間更多一些,apache的mpm子產品會為每個請求派生出相應的程序或線程分别處理,而程序或線程的數量與記憶體的消耗近似成正比,是以增大記憶體對提高動态站點的負載和運作速度也極為有利 。
其次是硬碟的速度,靜态站點尤為突出,apache不斷的在讀取檔案并發送給相應的請求,硬碟的讀寫是極其頻繁的;動态站點也要不斷的加載web程式(php等),一個請求甚至要讀取十幾個檔案才能處理完成,是以盡可能的提高硬碟速度和品質對提高apache的性能是有積極意義的。
最後是cpu和網絡,cpu影響的是web程式執行速度,網絡影響流量大小。
二、軟體方面
1.Apache的工作模式
Apache HTTP伺服器被設計為一個強大的、靈活的能夠在多種平台以及不同環境下工作的伺服器。在Apache 2.0中引入的一個概念“将Apache的結構能夠子產品化”,把核心的任務處理作為一個可插拔的子產品來運作,這樣就很容易根據不同的環境和應用來更有效的優化Apache的運作,這種子產品化的設計就叫做“多程序處理子產品”(Multi-Processing Module,MPM),也叫做工作模式。通過設定不同的參數,實作對apache性能的優化,下面将介紹三種主要的工作模式。
(1)Prefork模式(非線程型的)
其主要工作方式是:當Apache伺服器啟動後,mpm_prefork子產品會預先建立多個子程序(預設為5個),當接收到用戶端的請求後,mpm_prefork子產品再将請求轉交給子程序處理,并且每個子程序同時隻能用于處理單個請求。如果目前的請求數将超過預先建立的子程序數時,mpm_prefork子產品就會建立新的子程序來處理額外的請求。Apache總是試圖保持一些備用的或者是空閑的子程序用于迎接即将到來的請求。這樣用戶端的請求就不需要在接收後等候子程序的産生。
優點:每個子程序都會獨立處理對應的單個請求,是以,如果其中一個請求出現問題就不會影響到其他請求,同時效率上要比Worker高。
不足:其占用的系統資源相對其他兩種子產品而言較多,記憶體使用大得多不擅長處理高并發的場景。
Apache在prefork工作模式下影響性能的重要參數說明
# prefork MPM
<IfModule mpm_prefork_module>
StartServers 5
#apache啟動時候預設開始的子程序數
MinSpareServers 5
#最小的閑置子程序數
MaxSpareServers 10
#最大的閑置子程序數
MaxRequestWorkers 250
#設定了允許同時的最大接入請求數量。任何超過MaxRequestWorkers限制的請求将進入等候隊列,在apache2.3.1以前的版本MaxRequestWorkers被稱為MaxClients,舊的名字仍舊被支援。
MaxConnectionsPerChild 500
#設定的是每個子程序可處理的請求數。每個子程序在處理了“MaxConnectionsPerChild”個請求後将自動銷毀。0意味着無限,即子程序永不銷毀。雖然預設設為0可以使每個子程序處理更多的請求,但如果設成非零值也有兩點重要的好處:1、可防止意外的記憶體洩漏。2、在伺服器負載下降的時侯會自動減少子程序數。是以,可根據伺服器的負載來調整這個值。在Apache2.3.9之前稱之為MaxRequestsPerChild。
</IfModule>
注1:MaxRequestWorkers是這些指令中最為重要的一個,設定的是 Apache可以同時處理的請求,是對Apache性能影響最大的參數。如果請求總數已達到這個值(可通過ps -ef|grep http|wc -l來确認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP通路卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越多,建議将初始值設為(以Mb為機關的最大實體記憶體/2),然後根據負載情況進行動态調整。比如一台4G記憶體的機器,那麼初始值就是4000/2=2000。
注2:prefork 控制程序在最初建立“StartServers”個子程序後,為了滿足MinSpareServers設定的需要建立一個程序,等待一秒鐘,繼續建立兩 個,再等待一秒鐘,繼續建立四個……如此按指數級增加建立的程序數,最多達到每秒32個,直到滿足MinSpareServers設定的值為止。這種模式 可以不必在請求到來時再産生新的程序,進而減小了系統開銷以增加性能。MaxSpareServers設定了最大的空閑程序數,如果空閑程序數大于這個 值,Apache會自動kill掉一些多餘程序。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整為 MinSpareServers+1。如果站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。
注3:ServerLimit和MaxClients(MaxRequestWorkers)有什麼差別呢?
是因為在apache1時代,控制最大程序數隻有MaxClients這個參數,并且這個參數最大值為256,并且是寫死了的,試圖設定為超過256是無效的,這是由于apache1時代的伺服器硬體限制的。但是apache2時代由于伺服器硬體的更新,硬體已經不再是限制,是以使用ServerLimit這個參數來控制最大程序數,ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients之前,值要不小于MaxClients。
注4:檢視Apache加載的子產品
[root@www ~]#apachectl -t -D DUMP_MODULES
或
[root@www ~]# apachectl -M
[root@www ~]# apachectl –l
如何檢視Apache的工作模式呢?可以使用httpd -V 指令檢視,另外使用httpd -l 也可以檢視到
注5:如何修改prefork參數和啟用prefork模式
vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
#先編輯httpd-mpm.conf配置檔案,修改prefork工作模式對應的參數。
vi /usr/local/http-2.4.23/conf/httpd.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
Include conf/extra/httpd-mpm.conf
#編輯httpd.conf配置檔案,加載prefork對應子產品(注意要将其他工作模式的行注釋掉),并加載httpd-mpm.conf配置檔案。
#修改完配置檔案後,重新開機httpd服務。

執行”apachectl -V”也可以看到apache目前的工作模式。
因為startserver的值為5,是以可以看到5個子程序。
(2)Worker模式(多程序多線程)
和prefork模式相比,worker使用了多程序和多線程的混合模式,worker模式也同樣會先預派生一些子程序,然後每個子程序建立一些線程,同時包括一個監聽線程,每個請求過來會被配置設定到一個線程來服務。
優點:線程比起程序會更輕量,因為線程是通過共享父程序的記憶體空間,是以,記憶體的占用會減少一些,在高并發的場景下會比prefork有更多可用的線程,表現會更優秀一些;
不足:一個線程崩潰,整個程序就會連同其任何線程一起"死掉";在使用keep-alive長連接配接的時候,某個線程會一直被占用,即使中間沒有請求,需要等待到逾時才會被釋放(該問題在prefork模式下也存在)。
Apache在worker工作模式下影響性能的重要參數說明
# worker MPM
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
#最小空閑數量的工作線程
MaxSpareThreads 250
#最大空閑數量的工作線程
ThreadsPerChild 25
#每個子程序産生的線程數量
MaxRequestWorkers 400
#與prefork模式相同
MaxConnectionsPerChild 0
注1:Worker 由主要制程序生成“StartServers”個子程序,每個子程序中包含固定的ThreadsPerChild線程數,各個線程獨立地處理請求。同樣, 為了不在請求到來時再生成線程,MinSpareThreads和MaxSpareThreads設定了最少和最多的空閑線程數;
而MaxRequestWorkers 設定了同時連入的clients最大總數。如果現有子程序中的線程總數不能滿足載,控制程序将派生新的子程序 。
MinSpareThreads和 MaxSpareThreads的最大預設值分别是75和250。這兩個參數對Apache的性能影響并不大,可以按照實際情況相應調節 。
注2:ThreadsPerChild是worker MPM中與性能相關最密切的指令。ThreadsPerChild的最大預設值是64,如果負載較大,64也是不夠的。這時要顯式使用 ThreadLimit指令,它的最大預設值是20000。
注3:Worker模式下所能同時處理的請求總數是由子程序總數乘以ThreadsPerChild 值決定的,應該大于等于MaxRequestWorkers。如果負載很大,現有的子程序數不能滿足時,控制程序會派生新的子程序。預設最大的子程序總數是16,加大時 也需要顯式聲明ServerLimit(系統配置的最大程序數量,最大值是20000)。需要注意的是,如果顯式聲明了ServerLimit,那麼它乘以 ThreadsPerChild的值必須大于等于MaxRequestWorkers,而且MaxRequestWorkers必須是ThreadsPerChild的整數倍,否則 Apache将會自動調節到一個相應值。
注4:程序與線程的差別
線程是指程序内的一個執行單元,也是程序内的可排程實體.
與程序的差別:
(1)位址空間:程序内的一個執行單元;程序至少有一個線程;它們共享程序的位址空間;而程序有自己獨立的位址空間;
(2)資源擁有:程序是資源配置設定和擁有的機關,同一個程序内的線程共享程序的資源
(3)線程是處理器排程的基本機關,但程序不是.
(4)二者均可并發執行.
程序和線程都是由作業系統所體會的程式運作的基本單元,系統利用該基本單元實作系統對應用的并發性。
程序和線程的差別在于:
簡而言之,一個程式至少有一個程序,一個程序至少有一個線程。
線程的劃分尺度小于程序,使得多線程程式的并發性高。
另外,程序在執行過程中擁有獨立的記憶體單元,而多個線程共享記憶體,進而極大地提高了程式的運作效率。
(3)Event模式:
這是Apache最新的工作模式,是worker模式的變種,它把服務程序從連接配接中分離出來,一—worker模式不同的是在于它解決了keep-alive長連接配接的時候占用線程資源被浪費的問題,在event工作模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,将請求傳遞給伺服器的線程,執行完畢後,又允許它釋放。這增強了在高并發場景下的請求處理。event模式不能很好的支援https的通路(HTTP認證相關的問題)。
2.apache配置參數
(1)KeepAlive On/Off
KeepAlive指的是保持連接配接活躍,換一句話說,如果将KeepAlive設定為On,那麼來自同一用戶端的請求就不需要再一次連接配接,避免每次請求都要建立一個連接配接而加重伺服器的負擔。一般情況下,圖檔較多的網站應該把KeepAlive設為On。
(2)KeepAliveTimeOut number
如果第二次請求和第一次請求之間超過KeepAliveTimeOut的時間的話,第一次連接配接就會中斷,再建立第二個連接配接。它的設定一般考慮圖檔或者JS等檔案兩次請求間隔,一般設定為3-5秒。
(3)MaxKeepAliveRequests 100
一次連接配接可以進行的HTTP請求的最大請求次數。将其值設為0将支援在一次連接配接内進行無限次的傳輸請求。事實上沒有客戶程式在一次連接配接中請求太多的頁面,通常達不到這個上限就完成連接配接了。
(4)HostnameLookups on|off|double
如果是使用on,那麼隻有進行一次反查,如果用double,那麼進行反查之後還要進行一次正向解析,隻有兩次的結果互相符合才行,而off就是不進行域名驗證。
如果為了安全,建議使用double;為了加快通路速度,建議使用off。
域名查找開啟這個會增加apache的負擔, 減慢通路速度建議關閉。
(5)timeout 5
推薦5 這個是 apache接受請求或者發出響應的時間,超過這個時間斷開。
注:以上配置項可在/usr/local/http-2.4.23/conf/extra/httpd-default.conf設定并在httpd.conf檔案中通過include選項引用
MPM相關的配置參數是影響并發效率的主要因素
(1)StartServers 10
設定伺服器啟動時建立的子程序數量。因為子程序數量動态的取決于負載的輕重,是以一般沒有必要調整這個參數。
(2)MinSpareServers 10
設定空閑子程序的最小數量。所謂空閑子程序是指沒有正在處理請求的子程序。如果目前空閑子程序數少于MinSpareServers ,那麼Apache将以最大每秒一個的速度産生新的子程序。隻有在非常繁忙機器上才需要調整這個參數。将此參數設的太大通常是一個壞主意。
(3)MaxSpareThreads 75
設定空閑子程序的最大數量。如果目前有超過MaxSpareServers數量的空閑子程序,那麼父程序将殺死多餘的子程序。隻有在非常繁忙機器上才需要調整這個參數。将此參數設的太大通常是一個壞主意。如果你将該指令的值設定為比MinSpareServers小,Apache将會自動将其修改成”MinSpareServers+1″。
(4)ServerLimit 2000
伺服器允許配置的程序數上限。隻有在你需要将MaxClients設定成高于預設值256的時候才需要使用。要将此指令的值保持和MaxClients一樣。修改此指令的值必須完全停止服務後再啟動才能生效,以restart方式重新開機動将不會生效。
(5)MaxClients/MaxRequestWorkers 256
用于用戶端請求的最大請求數量(最大子程序數),任何超過MaxClients限制的請求都将進入等候隊列。預設值是256,如果要提高這個值必須同時提高ServerLimit的值。建議将初始值設為(以Mb為機關的最大實體記憶體/2),然後根據負載情況進行動态調整。比如一台4G記憶體的機器,那麼初始值就是4000/2=2000。
(6)MaxRequestsPerChild /MaxConnectionsPerChild 0
設定的是每個子程序可處理的請求數。每個子程序在處理了“MaxRequestsPerChild”個請求後将自動銷毀。0意味着無限,即子程序永不銷毀。記憶體較大的伺服器可以設定為0或較大的數字。記憶體較小的伺服器不妨設定成30、50、100。是以一般情況下,如果你發現伺服器的記憶體直線上升,建議修改該參數試試。
注:以上配置項可在/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf設定并在httpd.conf檔案中通過include選項引用
3.開啟apache的Gzip(deflate)功能
gzip可以極大的加速網站,有時壓縮比率高到80%,最少都有40%以上,還是相當不錯的。在Apache2之後的版本,子產品名不叫gzip,而叫mod_deflate。
如果要開啟deflate的話,一定要打開下面二個子產品:
LoadModule deflate_module modules/mod_deflate.so
#壓縮子產品,就是對要傳輸到用戶端的代碼進行gzip壓縮
LoadModule headers_module modules/mod_headers.so
#告訴浏覽器頁面使用了gzip壓縮,如果不開啟mod_headers那麼浏覽器就會對gzip壓縮過的頁面進行下載下傳,而無法正常顯示。
設定壓縮比率,取值範圍在 1(最低) 到 9(最高)之間,不建議設定太高,雖然有很高的壓縮率,但是占用更多的CPU資源。
mod_deflate子產品檢查及安裝
如果沒有安裝,可以采用DSO方式安裝該子產品,方法如下:
第一步:
/usr/local/http-2.4.23/bin/apxs -c -i -a /root/httpd-2.4.23/modules/filters/mod_deflate.c
#以dso的方式編譯安裝mod_deflate.c子產品到apache中
/usr/local/http-2.4.23/bin/apxs -c -i -a /root/httpd-2.4.23/modules/metadata/mod_headers.c
#以dso的方式編譯安裝mod_headers.c到apache中
apxs指令參數說明:
-i 此選項表示需要執行安裝操作,以安裝一個或多個動态共享對象到伺服器的modules目錄中。
-a 此選項自動增加一個LoadModule行到httpd.conf檔案中,以啟用此子產品,或者,如果此行已經存在,則啟用之。
-c 此選項表示需要執行編譯操作。
第二步:
/usr/local/http2.4.23/bin/apachectl graceful #優雅啟動httpd服務
修改Apache主配置檔案httpd.conf開啟gzip壓縮傳輸
去掉加載deflate_module和headers_module配置行前面的”#”号。
在配置檔案最後添加以下代碼(在添加代碼前最好先查一查要添加的代碼是否存在):
<IfModule mod_deflate.c>
DeflateCompressionLevel 6 #壓縮程度的等級,預設可以采用 6 這個數值,以維持耗用處理器效能與網頁壓縮品質的平衡。
SetOutputFilter DEFLATE #設定輸出過濾器,對輸出啟用壓縮,必須的,就像一個開關一樣,告訴apache對傳輸到浏覽器的内容進行壓縮
AddOutputFilterByType DEFLATE text/* #設定對檔案是文本的内容進行壓縮,例如text/html text/css text/plain等.
AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript #對javascript檔案進行壓縮
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp #對php類型的檔案進行壓縮.
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary #設定不對字尾gif,jpg,jpeg,png的圖檔檔案進行壓縮。注:?:表示不會捕獲 ( )裡内容了
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary #同上,就是設定不對exe,tgz,gz等的檔案進行壓縮
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary #同上就是設定不對pdf,avi,mp3等的檔案進行壓縮
#設定日志輸出!
DeflateFilterNote Input input_info #聲明輸入流的byte數量
DeflateFilterNote Output output_info #聲明輸出流的byte數量
DeflateFilterNote Ratio ratio_info #聲明壓縮的百分比
LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate #聲明日志格式
CustomLog logs/deflate_log.log deflate #指定日志檔案名稱及位置
修改完成後儲存退出并優雅啟動httpd服務
測試
使用谷歌浏覽器測試通路(提示:在通路測試頁之前按F12鍵)
通路文本類的測試頁面,結果如下:
可以看到内容進過了壓縮
在響應封包頭中并不存在内容壓縮的提示
檢視日志,結果如下:
4.配置mod_expires子產品
這個非常有用的優化,mod_expires可以減少20-30%左右的重複請求,讓重複的使用者對指定的頁面請求結果都CACHE在本地,根本不向伺服器送出請求。但要注意更新快的檔案不要這麼做。
這個子產品控制伺服器應答時的Expires頭内容和Cache-Control頭的max-age指令。有效期(expiration date)可以設定為相對于源檔案的最後修改時刻或者用戶端的通路時刻。
啟用expire緩存方法
修改Apache的主配置檔案httpd.conf:
#啟用expires_module
LoadModule expires_module modules/mod_expires.so
#然後添加Expires配置規則
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "now plus 1 month"
ExpiresByType application/x-javascript "now plus 5 day"
ExpiresByType p_w_picpath/jpeg "access plus 1 month"
ExpiresByType p_w_picpath/gif "access plus 1 month"
ExpiresByType p_w_picpath/bmp "access plus 1 month"
ExpiresByType p_w_picpath/x-icon "access plus 1 month"
ExpiresByType p_w_picpath/png "access plus 1 minutes"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresDefault "now plus 0 minutes"
</IfModule>
關于expires配置規則的說明:
ExpiresByType 和ExpiresDefault 文法:
ExpiresByType type/encoding "<base> [plus] {<num><type>}"
ExpiresDefault "<base> [plus] {<num><type>}"
其中<base>是下列之一(指定從什麼時候開始計算有效期):
· access從浏覽時開始算起
· now (等價于'access ')
· modification從網頁檔案的”最後編輯時間”開始算起
plus 關鍵字是可選的,<num>必須是整數,<type>是下列之一:
· years
· months
· weeks
· days
· hours
· minutes
· seconds
注1:有效期可以通過增加"<num><type>"子句進一步調整:
ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType p_w_picpath/gif "modification plus 5 hours 3 minutes"
注2:如果你使用基于最後修改日期的設定,"Expires:"頭将不會被添加到那些并非來自于磁盤檔案的内容。這是因為這些内容并不存在"最後修改時間"的屬性。
事實上關于時間的設定方式有兩種,上面是文字叙述型的,還有一種是代碼加秒數型的,例如:
ExpiresByType p_w_picpath/gif A2592000
ExpiresByType text/html M604800
”A”等同”access”,使用代碼”A”比較适合應用在不常變動的網頁檔案類型,例如圖檔。另外一種代碼是”M”,其意義等同于”modification”,使用代碼”M”比較适合應用在經常變動的網頁檔案類型,例如HTML頁面這類經常更新内容的資料。
驗證
隻有加載了expires子產品後,才會出現方框中的兩行,可以看到圖檔的有效期是一個月。
5.Apache禁止目錄周遊
将Options Indexes FollowSymLinks中的Indexes 去掉,就可以禁止 Apache 顯示該目錄結構。
Indexes 的作用就是當該目錄下沒有 index.html檔案時,就顯示目錄結構,如下圖所示:
去掉Indexes後,如下圖所示:
6.apache 隐藏版本資訊
測試預設 apache 的狀态資訊
暴露了web伺服器使用的程式版本。
(1)主配置中啟用httpd-default.conf
Include conf/extra/httpd-default.conf
(2)修改httpd-default.conf
檔案:/usr/local/http-2.4.23/conf/extra/httpd-default.conf
找到
ServerTokens Full
ServerSignature On
改成
ServerTokens Prod
ServerSignature off
重新開機 apache 測試
測試隐藏版本号後 apache 的狀态資訊
如果你需要徹底将版本之類的資訊進行改頭換面,你就需要在編譯之前做準備或者進行從新編譯了。在重新編譯時,修改源碼包下include目錄下的ap_release.h檔案
#define AP_SERVER_BASEVENDOR "Apache Software Foundation" #服務的供應商名稱
#define AP_SERVER_BASEPROJECT "Apache HTTP Server" #服務的項目名稱
#define AP_SERVER_BASEPRODUCT "Apache" #服務的産品名
#define AP_SERVER_MAJORVERSION_NUMBER 2 #主要版本号
#define AP_SERVER_MINORVERSION_NUMBER 4 #小版本号
#define AP_SERVER_PATCHLEVEL_NUMBER 23 #更新檔級别
#define AP_SERVER_DEVBUILD_BOOLEAN 0 #
上述列出的行,已經給出了注釋,大家可以修改成自己想要的,然後編譯安裝之後,對方就徹底不知道你的版本号了。
7.Apache日志切割
所謂日志切割,就是将apache的通路日志或錯誤日志按照不同的方法分塊存儲,一方面便于檢視,另一方面也便于删除。畢竟磁盤空間是有限的,如果沒有日志切割,日志檔案大到要删除的地步時,隻能将整個檔案都删除。下面将介紹兩種工具及其使用方法:
方法1:使用rotatelogs(apache自帶的工具)每隔一天記錄一個日志
編輯Apache的主配置檔案,更改内容如下:
#注釋掉如下兩行
#ErrorLog logs/error_log
#CustomLog logs/access_log common
#然後添加如下兩行
ErrorLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y%m%d.log 86400"
CustomLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined
注:其中86400為輪轉的時間機關為秒,表示一天。
驗證:優雅啟動httpd,并通路web服務,然後檢視logs目錄下的日志檔案。
由于apache自帶的日志輪詢工具rotatelogs,據說在進行日志切割時容易丢日志,是以我們通常使用cronolog進行日志輪詢。
方法2:使用 cronolog 為每一天建立一個新的日志
下載下傳安裝cronolog程式
編輯Apache的主配置檔案,格式與rotatelogs的一樣:
ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y%m%d.log"
CustomLog "|/usr/local/sbin/cronolog logs/access-%Y%m%d.log" combined
#如果Apache中有多個虛拟主機,最好每個虛拟主機中放置一個這樣的代碼,并将日志檔案名改成不同的名字。
擴充:
#這個保證了每天一個檔案夾檔案夾下每個小時産生一個log
CustomLog "|/usr/local/sbin/cronolog logs /%Y%m%d/access_log.%H" combined
#按天輪詢(生産環境常見用法,推薦使用):
CustomLog "|/usr/local/sbin/cronolog logs/access_www_%Y%m%d.log" combined
#按小時輪詢(生産環境較常見用法):
CustomLog "|/usr/local/sbin/cronolog logs /access_www_ %Y%m%d%H.log" combined
注意:
這兩個管道日志檔案程式還有一點不同之處是使用 cronolog 時如果日志是放在某個不存在的路徑則會自動建立目錄,而使用 rotatelogs 時不能自動建立,這一點要特别注意。
8.配置防盜鍊
方法1:Apache 防盜鍊的第一種實作方法,可以用rewrite實作。
首先要确認 Apache 的rewrite module可用:
然後在找到自己網站對應的配置的地方(如在主配置檔案中或虛拟主機中),加入下列代碼:
#防盜鍊配置
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !test\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.test\.com/.*$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.test.com/about/nolink.png [R,NC,L]
注:相關選項的解釋
(1)RewriteEngine On #啟用rewrite,要想rewrite起作用,必須要寫上
(2)RewriteCond test-string condPattern #寫在RewriteRule之前,可以有一或N條,用于測試rewrite的比對條件,具體怎麼寫,後面會詳細說到。
(3)RewriteRule Pattern Substitution #規則
(4)%{HTTP_REFERER}:伺服器變量,HTTPReferer是header的一部分,當浏覽器向web伺服器發送請求的時候,一般會帶上Referer,告訴伺服器我是從哪個頁面連結過來的,伺服器藉此可以獲得一些資訊用于處理。比如從我首頁上連結到一個朋友那裡,他的伺服器就能夠從HTTP Referer中統計出每天有多少使用者點選我首頁上的連結通路他的網站。
(5)[ NC]指的是不區分大小寫,[R]強制重定向 redirect
(6)字母L表示如果能比對本條規則,那麼本條規則是最後一條(Last),忽略之後的規則
防盜鍊配置的說明:
(1)紅色部分: 表示自己的信任站點。對我的站點來說,設定為 http://www.test.com 和 http://test.com
(2)綠色部分: 要保護檔案的擴充名(以|分開)。以這些為擴充名的檔案,必須通過紅色标注的網址引用,才可以通路。
(3)藍色部分: 定義被盜鍊時替代的圖檔,讓所有盜鍊 jpg、gif、swf 等檔案的網頁,顯示網頁文檔根目錄下的about/ nolink.png 檔案。注意:替換顯示的圖檔不要放在設定防盜鍊的目錄中,并且該圖檔檔案體積越小越好。當然你也可以不設定替換圖檔,而是使用下面的語句即可:RewriteRule .*\.(gif|jpg|png)$ - [F]
注1:[F] (強制URL為被禁止的 forbidden),強制目前URL為被禁止的,即,立即回報一個HTTP響應代碼403(被禁止的)。
注2:
RewriteCond%{HTTP_REFERER}!^$
上面這一行意在允許空“HTTP_REFERER”的通路,即允許使用者在浏覽器位址欄中直接輸入圖檔位址時圖檔檔案的顯示。
RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
設定允許通路的HTTP來源,包括網站自身。
RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]
将不滿足referer條件的通路重定向至nolink.png。nolink.png位于允許“盜鍊”的目錄about中,要注意字尾名,不然,警告資訊和圖檔将無法在對方網站上顯示。
方法2:通過判斷浏覽器頭資訊來阻止某些請求,即利用SetEnvIfNoCase和access。
這個方法可以通過阻止某些機器人或蜘蛛爬蟲抓取你的網站來節省你的帶寬流量。
文法: SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
SetEnvIfNoCase 當滿足某個條件時,為變量指派,即根據用戶端請求屬性設定環境變量。
注:Referer ,指明了請求目前資源原始資源的URL,使用referer是可以防盜鍊。然後在找到自己網站對應的配置的地方(如在主配置檔案中或虛拟主機中),加入下列代碼:
SetEnvIfNoCase Referer "^$" local_ref
SetEnvIfNoCase Referer "www.benet.com/.*$" local_ref
SetEnvIfNoCase Referer "benet.com/.*$" local_ref
<filesmatch "\.(mp3|mp4|zip|rar|jpg|gif)">
# 2.4版本以下的
方法一:
Order Deny,Allow
Allow from env=local_ref
Deny from all
方法二:
Order Allow,Deny
#2.4版本以上,方法如下:
Require all denied
Require env local_ref
</filesmatch>