Apache的各類優化以及安全配置詳解

簡介:javascript

Apache所運行的硬件環境都是對性能影響最大的因素,即便不能對硬件進行升級,也最好給Apache一個單獨的主機以避免受到其餘應用的干擾。各個硬件指標中,對性能影響最大的是內存,對於靜態內容(圖片、JavaScript文件、css文件等)。它決定了Apache能夠緩存多少內容,它緩存的內容越多,在硬盤上讀取內容的機會就會越少,大內存能夠極大提升靜態站點的速度;php

對動態高負載站點來講,每一個請求保存的時間更多一些,Apache的mpm模塊會爲每一個請求派生出相應的進程或線程分別處理,而進程或線程的數量與內存的消耗近似成正比,所以增大內存對提升動態站點的負載和運行速度也極爲有利。css

其次是硬盤的速度,靜態站點尤其突出,Apache不斷的在讀取文件併發送給相應的請求,硬盤的讀寫是極其頻繁的;動態站點也要不斷的加載web程序(php等),一個請求甚至要讀取十幾個文件才能處理完成,所以儘量的提升硬盤速度和質量對提升Apache的性能是有積極意義的。html

最後CPU和網絡,CPU影響的是web程序執行速度,網絡影響流量大小。java

 

1、Apache的幾種工做模式以及調優web

Apache詳細安裝過程請點擊這條連接便可查看:http://blog.csdn.net/kangshuo2471781030/article/details/79171344apache

Apache HTTP服務器被設計爲一個強大的、靈活的可以在多種平臺以及不一樣環境下工做的服務器。這種模塊化的設計就叫作「多進程處理模塊」(Multi-Processing Module,MPM),也叫作工做模式。vim

1.Prefork(一個非線程型的):瀏覽器

其主要工做方式是:當Apache服務器啓動後,mpm_prefork模塊會預先建立多個子進程(默認爲5個),每一個子進程只有一個線程,當接受到客戶端的請求後,mpm_prefork模塊再將請求轉交給子進程處理,而且每一個子進程同時只能用於處理單個請求。若是當前的請求數將超過預先建立的子進程數時,mpm_prefork模塊就會建立新的子進程來處理額外的請求。這樣客戶端的請求就不須要在接受後等候子進程的產生。緩存

因爲在mpm_prefork模塊中,每一個請求對應一個子進程,所以其佔用的系統資源相對其餘兩種模塊而言較多。不過mpm_prefork模塊的優勢在於它的每一個子進程都會獨立處理對應單個請求,這樣,若是其中一個請求出現問題就不會影響到其餘請求。Prefork在效率上要比work要高,可是內存使用大得多,不擅長處理高併發的場景。

Apache在prefork工做模式下影響性能的重要參數說明: 

# prefork MPM <IfModule mpm_prefork_module> StartServers 5 #Apache啓動時默認開始的子進程數 MinSpareServers 5 #最小的閒置子進程數 MaxSpareServer 10 #最大的閒置子進程數 MaxRequestWorkers 250 #MaxRequestWorkers設置了容許同時的最大接入請求數量。 #任何超過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 httpd | 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時代因爲服務器硬件的升級,硬件已經再也不是限制,因此使用ServerServerLimit這個參數來控制最大進程數,ServerLimit值>=MaxClient值纔有效。ServerLimit要放在MaxClients以前,值要不小於MaxClients。

(4)查看Apache加載的模塊

/Applications/MAMP/Library/bin/apachectl -t -D DUMP_MODULES

/Applications/MAMP/Library/bin/apachectl -M

/Applications/MAMP/Library/bin/apachectl -l

如何查看Apache的工做模式呢?可使用httpd -V命令查看,另外使用httpd -l也能夠查看到

/Applications/MAMP/Library/bin/httpd -V

 

2.Work模式(多線程多進程)

和prefork模式相比,work使用了多進程多線程的混合模式,work模式也一樣會先預派生一些子進程,而後每一個子進程建立一些線程,同時包括一個監聽線程,每一個請求過來會被分配到一個線程來服務。線程比起進程會更輕量,由於線程是經過共享父進程的內存空間,所以,內存的佔用會減小一些,在高併發的場景下會比prefork有更多可用的線程,表現會更優秀一些;另外,若是一個線程出現了問題也會致使同一進程下的線程出現問題,若是是多個線程出現問題,也只是影響Apache的一部分,而不是所有。因爲用到多進程多線程,須要考慮的線程的安全了,在使用keep-alive長鏈接的時候,某個線程會一被佔用,即便中間沒有請求,須要等到超時纔會被釋放(該問題在prefork模式下也存在)

總的來講,prefork方式速度要稍高於worker,然而它須要的CPU和memory資源也稍多於worker。

Apache在worker工做模式下影響性能的重要參數說明:

<IfModule mpm_worker_module> StartServers 2 #apache啓動時候默認開始的子進程數 MaxClients 150 #MaxClients / MaxRequestWorkers 用於客戶端請求的最大請求數量(最大子進程數) MinSpareThreads 25 #最小空閒數量的工做線程 MaxSpareThreads 75 #最大空閒數量的工做線程 ThreadsPerChild 25 #每一個子進程產生的線程數量 MaxRequestsPerChild 0 #MaxRequestsPerChild / MaxConnectionsPerChild 每一個子進程可處理的請求數 </IfModule>

注意:

(1)work由主控制進程生成「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)進程與線程的區別

線程是指進程內的一個執行單元,也是進程內的可調度實體。

與進程的區別是:

地址空間:進程內的一個執行單元,進程至少有一個線程,它們共享進程的地址空間,而進程有本身獨立的地址空間。

資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源

線程是處理器調度的基本單位,但進程不是

兩者都可併發執行

進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。

進程和線程的區別在於:

簡而言之,一個程序至少有一個進程,一個進程至少有一個線程

線程的劃分尺度小於進程,使得多線程程序的併發性高。

另外,進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率。

 

3.Event模式:

這是Apache最新的工做模式,是worker模式的變種,它把服務進程從鏈接中分離出來,worker模式不一樣的是在於它解決了keep-alive長鏈接的時候佔用線程資源被浪費的問題,在event工做模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢後,由容許它釋放。這加強了在高併發場景下的請求處理。event模式bu不能很好的支持https的訪問(HTTP認證相關的問題)。

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選項引用。

4.開啓Apache的Gzip(deflate)功能:
gzip能夠極大的加速網站,有時壓縮比率高到80%,最少都有40%以上,仍是至關不錯的。
在Apache2以後的版本,模塊名不叫gzip,而叫mod_deflate

未使用Gzip

開啓使用Gzip

 

(1)若是要開啓deflate的話,必定要打開下面兩個模塊

LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so

設置壓縮比率,取值範圍在1(最低)到9(最高)之間,不建議設置過高,雖然有很高的壓縮率,可是佔用更多的CPU資源

注意:

 若是沒有安裝:

A:編譯時安裝方法:

編譯的時候跟上--enable-deflate便可實現安裝

B:DSO方式安裝:

cd /root/httpd-2.4.23/modules/filters/ #切到apache源碼包mod_deflate所在的目錄下
# /usr/local/http-2.4.23/bin/apxs -c -i -a mod_deflate.c #以dso的方式編譯安裝到apache中
# /usr/local/http2.2/bin/apxs -c -i -a /root/httpd-2.2.17/modules/metadata/mod_headers.c #以dso的方式編譯安裝到apache中

[root@www filters]# ll /usr/local/http-2.4.23/modules/mod_deflate.so #檢查mod_deflate是否安裝,成功安裝這裏會顯示出該文件
-rwxr-xr-x. 1 root root 98144 Oct 22 23:14 /usr/local/http-2.4.23/modules/mod_deflate.so

apxs命令參數說明:

-i :此選項表示須要執行安裝操做,以安裝一個或多個動態共享對象到服務器的modules目錄中。

-a:此選項自動增長一個LoadModule行到httpd.conf文件中,以啓用此模塊,或者,若是此行已經存在,則啓用之。

-c:此選項表示須要執行編譯操做


注意:
若是重啓的時候出現錯誤:
引用:

Cannot load /usr/local/apache/modules/mod_deflate.so into server: /usr/local/apache/modules/mod_deflate.so: undefined symbol: inflateEnd

須要在LoadModuledeflate_module  modules/mod_deflate.so 的前面加載zlib.so

這裏須要注意的是:LoadModuledeflate_module須要放在LoadModulephp5_module以後
引用:

LoadFile/usr/lib/libz.so(x64系統中該庫文件位於/usr/lib64目錄下,能夠軟連接到/usr/lib下LoadModule deflate_module modules/mod_deflate.so)

(3)從新啓動httpd

sudo /Applications/MAMP/Library/bin/apachectl  graceful

(4)修改Apache配置文件開啓gzip壓縮傳輸參數詳解:

修改Apache主配置httpd.conf文件,增長配置參數:

LoadModule deflate_module     modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so

打開httpd.conf後,先將上面兩行配置前面的#號去掉,這樣Apache就會啓用這個兩個模塊,

其中mod_deflate是壓縮模塊,就是對要傳輸到客戶端的代碼進行gzip壓縮;

mod_headers那麼瀏覽器就會對gzip壓縮過的頁面進行下載,而沒法正常顯示。
在httpd.conf中加入如下代碼,能夠加到任何空白地方,不瞭解Apache的話,若是擔憂加錯地方,就放到http.conf文件的最後一行
注意:

在添加代碼前最好先查一查要添加的代碼是否存在

<IfModule mod_deflate.c> DeflateCompressionLevel 9 #壓縮程度的等級,預設能夠採用6這個數值,以維持耗用處理器效能與網頁壓縮質量的平衡。 SetOutputFilter DEFLATE #設置輸出過濾器,對輸出啓用壓縮,必須的,就像一個開關同樣,告訴Apache對傳輸到瀏覽器的內容進行壓縮 #AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php #設置對文件的內容進行壓縮,例如text/html text/css text/plain等 #AddOutputFilterByType DEFLATE image/* 注意:圖片不須要進行壓縮,不然越壓縮越大 AddOutputFilterByType DEFLATE text/* 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等的文件進行壓縮 </IfModule>

 

(5)設置日誌輸出

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

(6)修改後保存退出並重啓httpd服務

sudo /Applications/MAMP/Library/bin/apachectl  graceful

查看日誌:

注意:

 圖片是不須要啓用Gzip壓縮的,接下來不妨作個測試,針對圖片作壓縮後的效果驗證。

(1)首先上傳一張圖片到Apache根目錄

(2)編輯index.html首頁把圖片加上

(3)重啓httpd服務

(4)訪問測試頁面,查看日誌圖片壓縮前的大小

  查看日誌:

(5)那麼,接下來開啓gzip圖片的壓縮功能

(6)保存退出,重啓服務

(7)再次查看日誌以及驗證:

 

從Gzip檢測結果來看,壓縮後的圖片體積居然大過原體積!這就解釋了爲何圖片不用啓用GZip壓縮的緣由了!
能夠檢測了幾個門戶網站的圖片,還有Google、baidu的圖片,通通都沒有啓用圖片GZip壓縮,只是啓用了html、css、js等文件的GZip壓縮,這就更加說明了GZip壓縮不適用於圖片上。另外,除了圖片以外,flash的swf文件也是不用啓用GZip壓縮的。

5.配置mod_expires模塊

  這個是很是有用的優化,mod_expires能夠減小20-30%左右的重複請求,讓重複的用戶對指定的頁面請求結果都cache在本地,根本不向服務器發出請求。但要注意更新快的文件不要這麼作。
這個模塊控制服務器應答時的Expires頭內容和Cache-Control頭的max-age指令。有效期(expirationdate)能夠設置爲相對於源文件的最後修改時刻或者客戶端的訪問時刻。

 (1)未啓用Expires的效果:

curl -I w.tt.com
HTTP/1.1 200 OK
Date: Sat, 29 Jun 2019 08:46:58 GMT
Server: Apache
X-Powered-By: PHP/7.3.1
Content-Type: text/html; charset=UTF-8

(2)啓用Expires緩存:

LoadModule expires_module modules/mod_expires.so

(3)而後添加Expires配置規則:

<IfModule mod_expires.c> ExpiresActive On ExpiresByType text/css "now plus 1 month" ExpiresByType application/x-javascript "now plus 5 day" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/bmp "access plus 1 month" ExpiresByType image/x-icon "access plus 1 month" ExpiresByType image/png "access plus 1 minutes" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresDefault "now plus 0 minutes" </IfModule> 

(4)重啓服務,並驗證

ExpiresDefault 和ExpiresByType指令一樣可以用易懂的語法格式進行定義:

ExpiresDefault "<base> [plus] {<num><type>}" ExpiresByType type/encoding "<base> [plus] {<num><type>}"

其中<base>是下列之一:
• access
• now(等價於'access ')
• modification                             
   plus關鍵字是可選的。<num>必須是整數,<type>是下列之一:

• years //年 
• months//月 
• weeks//星期 
• days/日 
• hours/時 
• minutes/分 
• seconds/秒
例如,下列3個指令都表示文檔默認的有效期是一個月:

ExpiresDefault "access plus 1 month" ExpiresDefault "access plus 4 weeks" ExpiresDefault "access plus 30 days"

有效期能夠經過增長"<num><type>"子句進一步調整:

ExpiresByType text/html "access plus 1 month 15 days 2 hours" ExpiresByType image/gif "modification plus 5 hours 3 minutes"

注意:

若是你使用基於最後修改日期的設置,"Expires:"頭將不會 被添加到那些並不是來自於磁盤文件的內容。這是由於這些內容並不存在"最後修改時間"的屬性。

 #GIF有效期爲1個月(秒數)

ExpiresByType image/gif A2592000 ExpiresByType image/jpeg A2592000 ExpiresByType image/png A2592000 ExpiresByType image/x-icon A2592000 ExpiresByType application/x-javascript A604800 ExpiresByType text/plain A604800

 

HTML文檔的有效期是最後修改時刻後的一星期 

ExpiresByType text/html M604800

注意:

以上"M"表示源文件的最後修改時刻,"A"表示客戶端對源文件的訪問時刻。後面的時間則以秒計算。

 

6.Apache禁止目錄遍歷(安全)

將Options Indexes FollowSymLinks中的Indexes 去掉,就能夠禁止 Apache 顯示該目錄結構。

注意:

Indexes 的做用就是當該網站目錄下沒有 index.html文件時,就會顯示目錄結構。

 

7.Apache隱藏版本信息(安全)

 (1)修改以下配置文件:

vim /usr/local/http-2.4.23/conf/extra/httpd-default.conf

找到:

ServerTokens Full ServerSignature On
改爲:
ServerTokens Prod
ServerSignature off

(2)重啓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  #

上述列出的行,已經給出了註釋,你們能夠修改爲本身想要的,而後編譯安裝以後,對方就完全不知道你的版本號了。

 

八、Apache日誌分割(安全)

簡介:
爲何要日誌分割?

隨着網站的訪問愈來愈大,WebServer產生的日誌文件也會愈來愈大,若是不對日誌進行分割,那麼只能一次將大的日誌(如Apache的日誌)整個刪除,

這樣也丟失了不少對網站比較寶貴的信息,由於這些日誌能夠用來進行訪問分析、網絡安全監察、網絡運行情況監控等,

所以管理好這些海量的日誌對網站的意義是很大的。

方法1:使用rotatelogs(apache自帶的工具)每隔一天記錄一個日誌

(1)編輯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爲輪轉的時間單位爲秒

(2.)重啓Apache驗證:查看logs目錄下的日誌文件

注意:

因爲apache自帶的日誌輪詢工具rotatelogs,聽說在進行日誌切割時容易丟日誌,所以咱們一般使用cronolog進行日誌輪詢。

方法2:使用 cronolog 爲每一天創建一個新的日誌

(1)下載安裝cronolog程序

官網下載地址:http://cronolog.org/download/cronolog-1.6.2.tar.gz

tar zxf cronolog-1.6.2.tar.gz cd cronolog-1.6.2/ ./configure && make && make install

(2)安裝完成後,進到Apache主配置文件添加以下兩行:

ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y%m%d.log" CustomLog "|/usr/local/sbin/cronolog logs/access-%Y%m%d.log" combined

 

注意:

若是Apache中有多個虛擬主機,最好每一個虛擬主機中放置一個這樣的代碼,並將日誌文件名改爲不一樣的名字。

(3)重啓Apache驗證,查看logs目錄下的日誌文件

注意:

這兩個管道日誌文件程序還有一點不一樣之處是,使用cronolog 時若是日誌是放在某個不存在的路徑則會自動建立目錄,而使用 rotatelogs 時不能自動建立,這一點要特別注意

 

擴展:

#這個保證了天天一個文件夾文,件夾下每一個小時產生一個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

總結:(1.)Apache常見的三種工做模式:prefork、work、event(概念)(2.)Apache針對prefork模式下的調優、針對work模式下的調優(調優)(3.)Apache開啓Gzip壓縮功能的調優(調優)(4.)Apache開啓Expires緩存功能的調優(調優)(5.)實現Apache禁止目錄遍歷的功能(安全)(6.)實現Apache隱藏版本號的功能(安全)(7.)實現Apache日誌切割的功能(安全)

相關文章
相關標籤/搜索