Linux網(wǎng)站架構(gòu)系列之a(chǎn)pache----調(diào)優(yōu)篇
前面兩篇博文講解了apache的部署和配置等方面知識,本篇將為大家詳細(xì)講解生產(chǎn)環(huán)境中對apache服務(wù)各個方面的優(yōu)化調(diào)試。
生產(chǎn)環(huán)境中,大家肯定不會部署了apache之后就完事拿去上線了。光桿子上戰(zhàn)場等著完蛋的嘛!因此,不論從安全還是性能角度,我們必須在apache服務(wù)上線之前,對其做諸多的優(yōu)化調(diào)試才行。因此,本篇筆者通過總結(jié)自己的學(xué)習(xí)和工作經(jīng)驗,歸納總結(jié)出的apache調(diào)優(yōu)的20個小點。
本文篇幅有點長,本來想分開寫了,后來想想還是放在一篇博文吧。因此,大家就擔(dān)待擔(dān)待吧。
環(huán)境:
CentOS6.4 x86_64位 采用最小化安裝,系統(tǒng)經(jīng)過了基本優(yōu)化篇
apache版本:
apr版本:apr-1.4.8
apr-util版本:apr-util-1.5.2
pcre版本:pcre-7.8
源碼包存放位置:/server/tools
源碼包編譯安裝位置:/etc/local/軟件名稱
一、源碼官方下,補(bǔ)丁及時打
正如我們在apache部署篇講到的我們需要對下載的源碼包進(jìn)行驗證一樣,我們在挑選apache源碼安裝包的時候,一定要去官網(wǎng),不要去亂七八糟的站點進(jìn)行下載,防止源碼包被別有用心的人動過手腳,導(dǎo)致后面對公司業(yè)務(wù)造成不必要損失。
另外為了apache的安全性和性能考慮,我們一定要多多關(guān)注apache的官網(wǎng)的補(bǔ)丁發(fā)布情況,一旦有新的補(bǔ)丁,我們一定要及早打上。特別是一些安全補(bǔ)丁,防止受到損失。
二、屏蔽apache版本等敏感信息
1)我們在apache主配置文件中,找到包含的行,并解開注釋
[root@c64-web /]# grep "; /usr/local/apache/conf/
#Include conf/extra/
[root@c64-web /]# sed -i ‘s##Include conf/extra/; /usr/local/apache/conf/
注意:編譯安裝的情況下,只有此行解開注釋了,后面的修改才能生效。
2)打開文件,修改如下兩個地方
[root@sunsky /]# grep Server conf/extra/|grep -v "#"
ServerTokens full
ServerSignature Off
修改為
ServerTokens Prod
ServerSignature Off
經(jīng)過上面的修改,當(dāng)你在curl-Iwww.sunsky.pw的時候,還是會出現(xiàn)下面的信息
Server: Apache
徹底讓版本等敏感信息消失
如果你需要徹底將版本之類的信息進(jìn)行改頭換面,你就需要在編譯之前做準(zhǔn)備或者進(jìn)行從新編譯了。在重新編譯時,修改源碼包下include目錄下的ap_release.h文件
#define AP_SERVER_BASEVENDOR "Apache Software Foundation" #服務(wù)的供應(yīng)商名稱
#define AP_SERVER_BASEPROJECT "Apache HTTP Server" #服務(wù)的項目名稱
#define AP_SERVER_BASEPRODUCT "Apache" #服務(wù)的產(chǎn)品名
#define AP_SERVER_MAJORVERSION_NUMBER 2 #主要版本號
#define AP_SERVER_MINORVERSION_NUMBER 4 #小版本號
#define AP_SERVER_PATCHLEVEL_NUMBER 6 #補(bǔ)丁級別
#define AP_SERVER_DEVBUILD_BOOLEAN 0 #
上述列出的行,我已經(jīng)給出了注釋,大家可以修改成自己想要的,然后編譯安裝之后,再對文件進(jìn)行修改,對方就徹底不知道你的版本號了。
三、更改apache的默認(rèn)用戶
我們通過更改apache的默認(rèn)用戶,可以提升apache的安全性。這樣,即使apache服務(wù)被攻破,黑客拿到apache普通用戶也不會對系統(tǒng)和其他應(yīng)用造成破壞。這里創(chuàng)建的apache用戶,將用于對子進(jìn)程和線程的控制。
[root@c64-web /]# useradd -M -s /sbin/nologin apache 創(chuàng)建apache用戶
編輯apache配置文件,修改默認(rèn)的用戶。
[root@c64-web /]# vim /usr/local/apache/conf/
User apache #更改默認(rèn)的daemon用戶為apache用戶
Group apache #更改默認(rèn)的daemon用戶為apache用戶
四、apache目錄及文件權(quán)限設(shè)置
在生產(chǎn)環(huán)境的網(wǎng)站架構(gòu)中,我們應(yīng)把資源文件,例如用戶上傳的圖片及附件等和程序做好分離,最好是把上傳程序也分離開來。這樣才能更方便我們做好授權(quán),保證apache服務(wù)和整個服務(wù)器安全。
這里我們設(shè)置apache的網(wǎng)站目錄屬主和屬組是root,權(quán)限是755,文件的權(quán)限為644。
lrwxr-xr-x 1 root root 23 11月 5 02:04 apache -> /usr/local/apache-2.4.6
drwxr-xr-x 14 root root 4096 11月 5 12:37 apache-2.4.6
并且,在對日志的授權(quán)商,我們要將屬主和屬組都設(shè)置為root,權(quán)限設(shè)置為700。
drwx------ 2 root root 4096 11月 5 02:46 logs
由于apache日志的記錄是由apache的主進(jìn)程進(jìn)行操作的,而apache的主進(jìn)程又是root用戶啟動的,所以這里設(shè)置700是不影響日志記錄了。這也是日志記錄的最安全的方法。
五、配置cronolog進(jìn)行日志輪詢
由于apache自帶的日志輪詢工具rotatelogs,據(jù)專家說在進(jìn)行日志切割時容易丟日志,因此我們通常使用cronolog進(jìn)行日志輪詢。
1、下載并安裝cronolog
[root@sunsky /]# cd /server/tools/
[root@sunsky tools]# wget
[root@sunsky tools]# tar zxf cronolog-1.6.2.tar.gz
[root@sunsky tools]# cd cronolog-1.6.2
[root@sunsky cronolog-1.6.2]# ./configure
[root@sunsky cronolog-1.6.2]# make&&make install
2、配置apache使用cronolog
由于實驗用的apache開啟了虛擬主機(jī)功能,所以以下范例配置都在虛擬主機(jī)中進(jìn)行。
[root@sunsky cronolog-1.6.2]# vim /usr/local/apache/
將配置文件中的CustomLog和ErrorLog替換為下面的(由于我們要對多站點,所以這里要替換兩個虛擬主機(jī)的,并且將日志存放名字做有效的區(qū)分才好)
CustomLog "|/usr/local/sbin/cronolog /app/logs/sunsky_access_%Y%m%d.log" combined
ErrorLog "|/usr/local/sbin/cronolog /app/logs/sunsky_error_%Y%m%d.log"
更多日志格式參考:
按天輪詢(生產(chǎn)環(huán)境常見用法,推薦使用):[!--empirenews.page--]
CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined
按小時輪詢(生產(chǎn)環(huán)境較常見用法):
CustomLog "|/usr/local/sbin/cronolog /app/logs /access_www_ %Y%m%d%H.log" combined
六、錯誤頁面優(yōu)雅顯示
為了提升網(wǎng)站的用戶體驗,避免404,403之類的丑陋的默認(rèn)錯誤提示出現(xiàn),我們需要對錯誤頁面進(jìn)行優(yōu)化,讓他們變的漂亮一點。錯誤頁面不僅在于告訴用戶訪問出現(xiàn)了問題,而且需要引導(dǎo)用戶到正確的頁面。
錯誤頁面優(yōu)雅化顯示的實現(xiàn)方式主要有兩種,下面我們主要以404錯誤為例:
第一種:在apache的主配置文件中的
[root@sunsky /]# vi /usr/local/apache/conf/
AllowOverride None
Options None
Require all granted
ErrorDocument 404 /l #將404錯誤跳轉(zhuǎn)到/www/html下的l頁面上
第二種方法:在apache的虛擬主機(jī)配置文件中的
ServerAdmin
DocumentRoot "/www/html"
ServerName www.sunsky.pw
ServerAlias sunsky.pw
CustomLog "|/usr/local/sbin/cronolog /app/logs/www_access_%Y%m%d.log" combined
ErrorLog "|/usr/local/sbin/cronolog /app/logs/www_error_%Y%m%d.log"
ErrorDocument 404 (php),js,css,xml,txt等。特殊情況就是像一些首頁上有很多廣告投放的js代碼,由于需要每次加載進(jìn)而進(jìn)行來訪信息統(tǒng)計,所以這些廣告代碼擁有者網(wǎng)站的js不會經(jīng)過gzip壓縮,
mod_deflate模塊,在我們前篇部署的時候已經(jīng)編譯安裝進(jìn)去了。
那么如果沒有安裝,如何安裝呢?并且如果不知道到是否安裝了,如何查看呢?
1、mod_deflate模塊檢查及安裝
由于apache2.2.x和2.4.x這兩個版本在檢查mod_deflate模塊是否安裝方法方法是不同的。最后,我無奈做了很多測試,下面建議大家這樣來檢查。
[root@c64-web /]# /usr/local/apache/bin/apachectl -M | grep deflate
deflate_module (static) #此種結(jié)果為編譯安裝時裝的
[root@c64-web /]# /usr/local/apache/bin/apachectl -M | grep deflate
deflate_module (shared) #此種結(jié)果為DSO方式安裝的
安裝了的話,就可以直接進(jìn)行壓縮配置了,如果沒有安裝,下面為安裝方法
a)編譯時安裝方法
編譯的時候跟上--enable-deflate即可實現(xiàn)安裝
b)DSO方式安裝
[root@c64-web /]# cd /server/tools/;#切到apache源碼包mod_deflate所在的目錄下
[root@c64-web filters]# /usr/local/apache/bin/apxs -c -i -a mod_deflate.c #以dso的方式編譯安裝到apache中
[root@c64-web filters]# ll /usr/local/apache/modules/mod_deflate.so #檢查mod_deflate是否安裝,成功安裝這里會顯示出該文件
-rwxr-xr-x 1 root root 76697 11月 5 07:50 /usr/local/apache/modules/mod_deflate.so
擴(kuò)展:使用DSO方式安裝,apxs后跟的參數(shù)詳解
-c 此選項表明需要執(zhí)行編譯操作。它首先會編譯c源程序(.c)files為對應(yīng)的目標(biāo)代碼文件(.c),然后連接這些目標(biāo)代碼和files中其余的目標(biāo)代碼文件(.c和.a),以生成動態(tài)共享對象dsofile。如果沒有指定-s選項,則此輸出文件名由files中的第一個文件名推測得出,也就是默認(rèn)mod_name.so。
-i 此選項表示需要執(zhí)行安裝操作,以安裝一個或多個動態(tài)共享對象到服務(wù)器的modules目錄。
-a 此選項自動增加一個LoadModule行到文件中,以激活此模塊,或者,如果此行已經(jīng)存在,則啟用之。
壓縮模塊配置
2、配置壓縮參數(shù)
注意如果我們是編譯安裝時已經(jīng)編譯進(jìn)去的,此時我們需要先將主配置文件中
LoadModule deflate_module modules/mod_deflate.so
此行解鎖后再進(jìn)行下面操作,不然下面的操作會報錯。
我們需要在虛擬機(jī)的
DeflateCompressionLevel 9 #壓縮等級,越大效率越高,消耗CPU也越高
SetOutputFilter DEFLATE #啟用壓縮
AddOutputFilterByType DEFLATE text/html text/plain text/xml #僅壓縮限制特定的MIME類型文件:
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE image/gif image/png image/jpe image/swf image/jpeg image/bmp
#DeflateFilterNote ratio #在日志中放置壓縮率標(biāo)記,下面是記錄日志的,這個功能一般不用
#LogFormat ‘"%r" %{outstream}n/%{instream}n (%{ratio}n%%)‘ deflate
#CustmLog logs/deflate_log.log deflate
下面是朋友公司的另外一種壓縮配置,有興趣的朋友們也可以操作操作。
DeflateCompressionLevel 9
SetOutputFilter DEFLATE
DeflateFilterNote Input instream #聲明輸入流的byte數(shù)量
DeflateFilterNote Output outstream #聲明輸出流的byte數(shù)量
DeflateFilterNote Ratio ratio #聲明壓縮的百分比
#LogFormat ‘"%r" %{outstream}n/%{instream}n (%{ratio}n%%)‘ deflate #聲明日志類型
#CustomLog logs/deflate_log.log deflate #聲明日志類型
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript #僅壓縮限制特定的MIME類型文件
執(zhí)行上面的添加后,我們對apache進(jìn)行優(yōu)雅重啟
[root@c64-web /]# /usr/local/apache/bin/apachectl graceful
下面訪問我們的網(wǎng)站,然后用火狐或者google游覽器的YSLOW插件進(jìn)行壓縮效果的查看[!--empirenews.page--]
怎么樣,是不是已經(jīng)進(jìn)行壓縮了啊!
我們在企業(yè)生產(chǎn)環(huán)境中時,在啟用mod_deflate時,一定要注意,對于太小的文件和某些格式的圖片不要對它們進(jìn)行壓縮,有可能越壓越大。
下面給出大家?guī)缀跏撬械腁ddOutputFilterByTypeDEFLATE后跟的壓縮文件類型,大家可以參照選擇。
text/plain text/html text/php text/xml text/css text/javascript
application/xhtml+xml application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php image/svg+xml image/gif image/png image/jpe image/swf image/jpeg image/bmp
八、mod_expires緩存功能
雖然我們上面通過mod_deflate模塊啟用了壓縮,從很大程度上節(jié)約了企業(yè)帶寬,降低了企業(yè)成本??墒怯捎诂F(xiàn)在越來越多的圖片、腳本、css和flash被嵌入到頁面中,當(dāng)客戶訪問站點勢必會做很多次的http請求,因此我們還可以通過mod_expires緩存模塊來設(shè)置ExpiresHeader來緩存這些文件。Expires是通過header報文來指定特定類型的文件在游覽器中的緩存時間的。平時,我們大多數(shù)的圖片,flash在發(fā)布之后都是不需要經(jīng)常修改的,因此做了緩存之后,游覽器第一次從服務(wù)器下載之后,就不需要再從服務(wù)器下載這些文件而是直接從游覽器緩存中讀取了。這樣客戶訪問頁面的速度就會大大加快,企業(yè)的帶寬壓力也得到了緩解。
1、mod_expires模塊檢查及安裝
檢查mod_expires模塊是否安裝的方法如下:
[root@c64-web /]# /usr/local/apache/bin/apachectl -M | grep deflate
expires_module (static) #此種結(jié)果為編譯安裝時裝的
[root@c64-web /]# /usr/local/apache/bin/apachectl -M | grep deflate
expires_module (shared) #此種結(jié)果為DSO方式安裝的
安裝了的話,就可以直接進(jìn)行壓縮配置了,如果沒有安裝,下面為安裝方法
a)編譯方式安裝
編譯的時候跟上--enable-expires即可實現(xiàn)安裝
b)DSO方式安裝
[root@c64-web /]# cd /server/tools/;#切到apache源碼包mod_expires所在的目錄下
[root@c64-web filters]# /usr/local/apache/bin/apxs -c -i -a mod_expires.c #以dso的方式編譯安裝到apache中
[root@c64-web filters]# ll /usr/local/apache/modules/mod_expires.so #檢查mod_deflate是否安裝,成功安裝這里會顯示出該文件
-rwxr-xr-x 1 root root 37439 11月 5 02:02 /usr/local/apache/modules/mod_expires.so
2、配置緩存參數(shù)
注意如果我們是編譯安裝時已經(jīng)編譯進(jìn)去的,此時我們需要先將主配置文件中
LoadModule expires_module modules/mod_expires.so
此行解鎖后再進(jìn)行下面操作,不然會報錯。
緩存的用法有3種,分別問對全局,對目錄,對虛擬主機(jī)。
a)對全局
對全局的配置就是在apache主配置文件的末尾加入如下參數(shù)即可
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus12 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
b)對目錄
對目錄的配置就是在apache主配置文件中
AllowOverride None
Options None
Require all granted
ErrorDocument 404 /l
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus12 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
c)對虛擬主機(jī)
對虛擬主機(jī)的配置就是在apache的虛擬主機(jī)配置文件中添加如下參數(shù)即可
ServerAdmin
DocumentRoot "/www/html"
ServerName www.sunsky.pw
ServerAlias sunsky.pw
CustomLog "|/usr/local/sbin/cronolog /app/logs/www_access_%Y%m%d.log" combined
ErrorLog "|/usr/local/sbin/cronolog /app/logs/www_error_%Y%m%d.log"
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus12 12 months"
ExpiresByType image/jpg "access plus 12 months"[!--empirenews.page--]
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
以上三種配置任何一種配置之后,對apache服務(wù)器進(jìn)行優(yōu)化重啟,然后用火狐或者google游覽器的YSlow插件進(jìn)行緩存效果查看。
擴(kuò)展:expires模塊的語法
上面已經(jīng)的操作就是實現(xiàn)apache的緩存功能。其中,expires后面的參數(shù)你也可以根據(jù)需求自行更改,緩存時間也是一樣可以更改的。
這里我對expires的模塊語法進(jìn)行一些細(xì)說
expires模塊用到了ExpiresDefault和EXpiresByType兩個指令,下面是這兩個指令的語法。
ExpiresDefault “ [plus] {
EXpiresByType type/encoding " [plus] {
其中的參數(shù)有3個:access,now(等價于‘access’),modification
plus關(guān)鍵字是可選的。
下面用幾個例子帶大家理解下
例如:下面3個指令都表示文檔默認(rèn)的有效期是一個月
ExpiresDefault "access plus 1 month"
ExpiresDefault "access plus 4 weeks"
ExpiresDefault "access plus 30 days"
有效期可以通過增加“
ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes"
注意:如果你使用基于最后修改日期的設(shè)置,“Expires”頭將不會被添加到那些并非來自于硬盤文件的內(nèi)容,這是因為這些內(nèi)容并不存在“最后修改時間”的屬性。
基準(zhǔn)時刻可以是源文件的最后修改時刻或者客戶端對源文件的訪問時刻,至于使用那一個則由指定。“M”表示源文件的最后修改時刻,“A”表示客戶端對源文件的訪問時刻,需要注意的是
和seconds之間沒有空格。
這兩個基準(zhǔn)的差別是很微妙的。如果使用“M”,所有當(dāng)前緩存中的文檔副本都將在同一時刻過期,這個可能對定期更新的URL(比如位于同一位置的每周通告)很有好處。如果使用“A”,則每個客戶端所得到的有效期是不一樣的,這個可能對那些幾乎不更新的圖片很有好處,特別是對于一組都引用相同圖片的相關(guān)文檔。 緩存優(yōu)化對企業(yè)來說是至關(guān)重要了的,不同的公司類型,緩存的類型和時間又各不相同,大家具體可以用YSlow對淘寶,京東,新浪,谷歌等站點進(jìn)行測試,看看他們的緩存時間是多少,并思考下為什么那樣設(shè)置。 雖然緩存的設(shè)置有如下優(yōu)點 1.縮短服務(wù)的響應(yīng)時間 2.減輕服務(wù)器負(fù)擔(dān) 3.減少網(wǎng)絡(luò)帶寬使用量,降低企業(yè)成本 但是他的缺點也是顯而易見的,由于使用了緩存設(shè)置,導(dǎo)致被緩存的內(nèi)容更新了,但是客戶看到的卻還是舊的。 如何解決被緩存文件及時更新這個問題呢? 第一種:縮短緩存時間例如:1天,不徹底犧牲性能 第二種:對緩存的對象改名。 九、啟用worker模式,提升并發(fā)數(shù)(可以達(dá)到2000-5000) apache有兩個模式,默認(rèn)的模式是prefork模式。那么我們?yōu)槭裁匆褂脀orker模式呢?這兩種模式又有什么區(qū)別呢? 1、prefork模式 prefork使用的是多個子進(jìn)程,而每個子進(jìn)程只有一個線程,每個進(jìn)程在某個確定的時間只能維持一個連接。 工作原理:控制進(jìn)程最初建立若干個子進(jìn)程,為了不在請求到來時再生成子進(jìn)程,所以要根據(jù)需求不斷的創(chuàng)建新的子進(jìn)程,最大可以達(dá)到每秒32個直到滿足需求為止。 安裝方法:在編譯的過程中,加入?yún)?shù)--with-mpm=frefork,不加也可以,因為默認(rèn)的話,會采用prefork模式。 優(yōu)點:效率高,穩(wěn)定,安全。對于線程調(diào)試?yán)щy的平臺來說,調(diào)試更加容易些。 缺點:與worker模式相比消耗資源多。 配置參數(shù)說明: StartServers 5 #最初建立的子進(jìn)程 MinSpareServers 5 #最小空閑進(jìn)程數(shù),如果空閑的進(jìn)程小于設(shè)定值,Apache會自動建立進(jìn)程,如果服務(wù)器并發(fā)及負(fù)載大的話,可以考慮加大。 MaxSpareServers 10 #最大空閑進(jìn)程數(shù),如果空閑的進(jìn)程大于設(shè)定值,Apache會自動kill掉多余的進(jìn)程,如果服務(wù)器負(fù)載大的話,可以考慮加大。 MaxClients 150 #設(shè)定的是apache可以同時處理的請求,是對apache性能影響最大的參數(shù),就是apache可以同時處理的請求數(shù),就是說,如果有150個用戶在訪問,那么第151個用戶就要等之前的訪問結(jié)束后才能訪問。 MaxRequestsPerChild 0 #每個子進(jìn)程可處理的請求數(shù),每個子進(jìn)程在處理了“MaxRequestsPerChild”個請求后將自動銷毀。0以為著無限,即子進(jìn)程永不銷毀。雖然缺省設(shè)為0可以使每個子進(jìn)程處理更多的請求,但如果設(shè)置成非0值也有兩點重要的好處。(1)可防止意外的內(nèi)存泄露(2)在服務(wù)器負(fù)載下載的時候會自動減少子進(jìn)程數(shù)。 生產(chǎn)環(huán)境配置實例1: StartServers 10 MinSpareServers 10 MaxSpareServers 15 ServerLimit 2000 MaxClients 1000 MaxRequestsPerChild 5000 2、worker模式 worker模式是apche2.x新引進(jìn)來的模式,是線程與進(jìn)程的結(jié)合,在worker模式下會有多個子進(jìn)程,每個子進(jìn)程又會有多個線程。每個線程在某個確定的時間只能維持一個連接。 工作原理:由主控制進(jìn)程生成若干個子進(jìn)程,而每個子進(jìn)程中又包含固定的線程數(shù),各個線程獨立處理請求,同樣為了不在請求到來時再生成線程,在配置文件中設(shè)置了最小和最大的空閑線程數(shù)及所有子進(jìn)程中的線程總數(shù),如果現(xiàn)有子進(jìn)程中的線程總數(shù)不能滿足并發(fā)及負(fù)載,控制進(jìn)程將派生新的子進(jìn)程。[!--empirenews.page--] 安裝方法:在配置編譯的工程中,加入?yún)?shù)--with-mpm=worker,如果不加的話系統(tǒng)會采用默認(rèn)prefork模式。 優(yōu)點:內(nèi)存占用比prefork模式低,適合高并發(fā)高流量HTTP服務(wù)。 缺點:假如一個線程崩潰,整個進(jìn)程就會連同其任何線程一起“死掉”。由于線程共享內(nèi)存空間,所以一個程式在運行時必須被系統(tǒng)識別為“每個線程都是安全的”。服務(wù)穩(wěn)定性不如prefork模式。 配置參數(shù)說明: StartServers 2 #最初建立的子進(jìn)程 MaxClients 150 #所有子進(jìn)程中的線程總數(shù)。如果現(xiàn)有子進(jìn)程中的線程總數(shù)不能滿足負(fù)載,控制進(jìn)程將派生新的子進(jìn)程。 MinSpareThreads 25 #最小空閑線程數(shù),如果空閑的線程小于設(shè)定值,apache會自動建立線程,如果服務(wù)器負(fù)載大的話,可以考慮加大此參考值。 MaxSpareThreads 75 #最大空閑線程數(shù),如果空閑的線程大于設(shè)定值,apache會自動kill掉多余的線程,如果服務(wù)器負(fù)載大的話,可以考慮加大此參考值。 ThreadsPerChild 25 #每個進(jìn)程包含固定的線程數(shù),此參數(shù)在worker模式中,是影響最大的參數(shù),ThreadsPerChild的最大缺省值是64,如果負(fù)載較大,64是不夠的。這時要顯式使用threadlimit指令,它的最大缺省值是20000. MaxRequestsPerChild 0 #功能同prefork模式 常用配置參考: 生產(chǎn)環(huán)境配置實例1: StartServers 3 MaxClients 2000 ServerLimit 25 MinSpareThreads 50 MaxSpareThreads 200 ThreadLimit 200 ThreadsPerChild 100 MaxRequestsPerChild 0 生產(chǎn)環(huán)境配置實例2: StartServers 5 MaxClients 9600 ServerLimit 64 MinSpareThreads 25 MaxSpareThreads 500 ThreadLimit 200 ThreadsPerChild 150 MaxRequestsPerChild 0 生產(chǎn)場景配置實例3: StartServers 2 MaxClients 500 ServerLimit 25 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 生產(chǎn)場景配置實例4: StartServers 3 MaxClients 1600 ServerLimit 25 MinSpareThreads 50 MaxSpareThreads 200 ThreadLimit 200 ThreadsPerChild 64 worker模式下所能同時處理的請求總數(shù)是由子進(jìn)程總數(shù)乘以Threadsperchild值決定的,應(yīng)該大于等于maxclients。如果負(fù)載很大,現(xiàn)有的子進(jìn)程數(shù)不能滿足時,控制進(jìn)程會派生新的子進(jìn)程。默認(rèn)最大的子進(jìn)程總數(shù)是16,如需加大時也需要顯示聲明serverlimit的值(最大值是20000) 特別說明:如果顯示聲明了ServerLimit,那么它乘以ThreadsPerChild的值必須大于等于MaxClients,而且MaxClients必須是ThreadsPerChild的整數(shù)倍,否則apache將會自動調(diào)節(jié)到一個相應(yīng)值(可能是個非期望值)。 數(shù)學(xué)表達(dá): MaxClient<=總的進(jìn)程數(shù)(ServerLimit)x線程數(shù)(ThreadsPerChild) MaxClient%ThreadsPerChild=0 生產(chǎn)環(huán)境中我們需要開啟配置行,這樣才能實現(xiàn)并發(fā)鏈接數(shù)的增加。 1、開啟配置行 這里我們要apache的主配置文件,找到包含的行,并解開注釋 [root@c64-web /]# grep "; /usr/local/apache/conf/ #Include conf/extra/ [root@c64-web /]# sed -i ‘s##Include conf/extra/; /usr/local/apache/conf/ 注意:編譯安裝的,只有此行解開注釋了,后面的修改才能生效。 2、修改配置 1)如果你的apache服務(wù)為worker模式,那么生產(chǎn)環(huán)境中可以選擇上面worker模式的生產(chǎn)環(huán)境配置實例1的配置。 2)如果你的apache服務(wù)為prefork模式,那么生產(chǎn)環(huán)境中可以參考上面prefork模式的生產(chǎn)環(huán)境配置實例1的配置。 生產(chǎn)環(huán)境中,這里我建議大家選擇worker模式。 十、開啟防盜鏈 一些小網(wǎng)站為了盈利,通過盜鏈來實現(xiàn)對自己網(wǎng)站內(nèi)容的豐富,這無疑加大了企業(yè)的空間和流量的成本,因此我們需要對apache進(jìn)行防盜鏈的配置。 由于我們要用到mod_rewrite模塊,因此我們需要先檢測該模塊是否安裝,檢測和安裝方法與上面mod_deflate和mod_expires的一樣,這里不多講了。 防盜鏈配置: 一般我們都是將防盜鏈的配置,配置在虛擬主機(jī)里面,配置如下: ServerAdmin DocumentRoot "/www/html" ServerName www.sunsky.pw ServerAlias sunsky.pw CustomLog "|/usr/local/sbin/cronolog /app/logs/www_access_%Y%m%d.log" combined ErrorLog "|/usr/local/sbin/cronolog /app/logs/www_error_%Y%m%d.log" RewriteEngine On RewriteCond %{HTTP_REFERER} !^*$ [NC] RewriteCond %{HTTP_REFERER} !^$ [NC] RewriteCond %{HTTP_REFERER} !^> AllowOverride None Options FollowSymLinks #不填寫Indexes項,默認(rèn)即為關(guān)閉。 Require all granted 第二種: AllowOverride None Options -Indexes #通過在Indexes前面加-來禁用此功能 Require all granted 第三種: AllowOverride None Options None #禁用所有選項 Require all granted 十二、禁用AllowOverride選項,關(guān)閉.htaccess文件使用 首先是性能考慮,如果AllowOverride啟用了.htaccess文件,則apache需要在每個目錄中查找.htaccess文件。因此,無論是否真正用到,啟用.htaccess都會導(dǎo)致服務(wù)器性能的下降。另外,對于每一個請求,都需要讀取一次.htaccess文件。[!--empirenews.page--] 其次是安全考慮,這樣會允許用戶自己修改服務(wù)器的配置,這可能會導(dǎo)致某些意想不到的修改,所以請認(rèn)真考慮是否應(yīng)當(dāng)給予用戶這樣的特權(quán)。 1、禁用AllowOverride選項 我們通過修改apache主配置文件中的 Options none AllowOverride None #禁止該選項,防止用戶重復(fù)載入 Require all granted 通過該設(shè)置加快了服務(wù)器響應(yīng)速度,因為它不再讓每個請求去尋求每個目錄的訪問控制文件(.htaccess) 2、關(guān)閉.htaccess文件使用 默認(rèn)在Unix平臺下能夠使用.htaccess來對目錄權(quán)限進(jìn)行規(guī)則定義,但是這是不安全的,建議關(guān)閉,默認(rèn)的選項: AccessFileName .htaccess 這里我們將它關(guān)閉注釋掉 #AccessFileName .htaccess 全部目錄權(quán)限定義使用中的定義,不使用.htaccess進(jìn)行定義。 十三、關(guān)閉自帶CGI功能 生產(chǎn)環(huán)境中,一般我們不使用apache自帶的cgi的功能,如果使用的話,可以用mod_perl模塊來替代。因此我們這里需要將apache主配置文件中有關(guān)cgi的內(nèi)容刪除掉。 刪除部分: ScriptAlias /cgi-bin/ "/usr/local/apache2.4.6/cgi-bin/" AllowOverride None Options None Require all granted 十四、禁止PHP解析指定站點的目錄 企業(yè)的站點有時會提供用戶進(jìn)行上傳操作,而用戶上傳文件的存放目錄,我們是不能給php的解析權(quán)限的,否則會對apache服務(wù)和系統(tǒng)造成危害。 十五、apache的安全模塊 我們需要對apache站點增加一些擴(kuò)展的安全模塊,如:mod_evasive20防DDOS、mod_limitipconn(針對單站點)配置、mod_security2防SQL注入等等之類的工具。 另外,下面是推薦給大家的幾個工具。 1、makejail 它是一個自動把建立jail所需要的程序放到j(luò)ail內(nèi)的軟件,使用python編寫,他有debian和openbsd的版本。 2、mod-security 它是apche的一個模塊,它不僅可以實現(xiàn)過濾請求和日志審計等功能,而且可以防止SQLInjection和跨站腳本攻擊等是個很不錯的安全模塊。 十六、使用tmpfs文件系統(tǒng)替代頻繁訪問的目錄 tmpfs是一種基于內(nèi)存的文件系統(tǒng)。它最主要的兩個優(yōu)勢就是動態(tài)文件系統(tǒng)大小和速度快。因為典型的tmpfs文件系統(tǒng)會完全駐留在RAM中,讀寫幾乎可以是瞬間的。即使用了一些交換分區(qū),性能仍然是卓越的。因此對于那些頻繁訪問的目錄,建議使用tmpfs文件系統(tǒng)進(jìn)行替代。 十七、優(yōu)化系統(tǒng)內(nèi)核參數(shù) 對系統(tǒng)內(nèi)核的優(yōu)化參數(shù),我們在系統(tǒng)的基礎(chǔ)優(yōu)化這邊博文已經(jīng)講過了。系統(tǒng)內(nèi)核優(yōu)化最主要的目的就是減少TIME-WAIT的TCP連接數(shù)。 由于在基礎(chǔ)優(yōu)化篇我們已經(jīng)對apache進(jìn)行了內(nèi)核參數(shù)的優(yōu)化,因此這里我就不再操作了。這里我將為大家對優(yōu)化的參數(shù)進(jìn)行講解。 net.ipv4.tcp_fin_timeout #表示如果套接字由本端要求關(guān)閉,這個參數(shù)決定了它保持在FIN-WAIT-2狀態(tài)的時間,默認(rèn)值是60秒。 net.ipv4.tcp_tw_reuse #表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)值為0,表示關(guān)閉。該參數(shù)對應(yīng)系統(tǒng)路徑為:/proc/sys/net/ipv4/tcp_tw_reuse 0 net.ipv4.tcp_tw_recycle #表示開啟TCP連接中TIME-WAIT sockets的快速回收該參數(shù)對應(yīng)系統(tǒng)路徑為:/proc/sys/net/ipv4/tcp_tw_recycle提示:reuse和recycle兩個參數(shù)為了防止生產(chǎn)環(huán)境下web,squid等time_wait過多設(shè)置的。 net.ipv4.tcp_syncookies #表示開啟SYN Cookies功能。當(dāng)出現(xiàn)SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,Centos5系列默認(rèn)值為1,表示開啟。因此這個參數(shù)也可以不添加。該參數(shù)對應(yīng)系統(tǒng)路徑為:/proc/sys/net/ipv4/tcp_syncookies,默認(rèn)為1 net.ipv4.tcp_keepalive_time #表示當(dāng)keepalive起用的時候,TCP發(fā)送keepalive消息的頻度。缺省是2小時,改為10分鐘。該參數(shù)對應(yīng)系統(tǒng)路徑為:/proc/sys/net/ipv4/tcp_keepalive_time,默認(rèn)為7200秒。 net.ipv4.ip_local_port_range #選項用來設(shè)定允許系統(tǒng)打開的端口范圍。即用于向外連接的端口范圍。該參數(shù)對應(yīng)系統(tǒng)路徑為:/proc/sys/net/ipv4/ip_local_port_range 32768 61000 net.ipv4.tcp_max_syn_backlog #表示SYN隊列的長度,默認(rèn)為1024,加大隊列長度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。選項為服務(wù)器端用來記錄那些尚未收到客戶端確認(rèn)信息的連接請求的最大值。 該參數(shù)對應(yīng)系統(tǒng)路徑為:/proc/sys/net/ipv4/tcp_max_syn_backlog net.ipv4.tcp_max_tw_buckets #表示系統(tǒng)同時保持TIME_WAIT套接字的最大數(shù)量,如果超過這個數(shù)字,TIME_WAIT套接字將立刻被清楚并打印警告信息。默認(rèn)為180000,對于Apache、Nginx等服務(wù)器來說可以調(diào)整低一點,如改為5000-30000,不同業(yè)務(wù)的服務(wù)器也可以給大一旦,比如lvs,squid。上幾行的參數(shù)可以很好地減少TIME_WAIT套接字?jǐn)?shù)量,但是對于Squid效果卻不大。此項參數(shù)可以控制TIME_WAIT套接字的最大數(shù)量,避免Squid服務(wù)器被大量的TIME_WAIT套接字拖死。此參數(shù)對應(yīng)系統(tǒng)路徑為:/proc/sys/net/ipv4/tcp_max_tw_buckets net.ipv4.tcp_synack_retries #參數(shù)的值決定了內(nèi)核放棄連續(xù)之前發(fā)送SYN+ACK包的數(shù)量。該參數(shù)對應(yīng)系統(tǒng)路徑為:/proc/sys/net/ipv4/tcp_synack_retries默認(rèn)值為5 net.ipv4.tcp_syn_retries #表示在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量。該參數(shù)對應(yīng)系統(tǒng)路徑為:/proc/sys/net/ipv4/tcp_syn_retries 5 net.ipv4.tcp_max_orphans #選項用于設(shè)定系統(tǒng)中最多有多少個TCP套接字不被關(guān)聯(lián)到任何一個用戶文件句柄上。如果超過這個數(shù)字,孤立連接將立即被復(fù)位并打印出警告信息。這個限制這是為了防止簡單的Dos攻擊,不能過分依靠這個限制甚至認(rèn)為減少這個值,更多的情況是增加這個值。該參數(shù)對應(yīng)系統(tǒng)路徑為:/proc/sys/net/ipv4/tcp_max_orphans 65536[!--empirenews.page--] 十八、盡可能減少HTTP請求數(shù) http請求是要開銷的,想辦法減少請求數(shù)自然可以提高網(wǎng)頁速度。常用的方法,合并css,js(將一個頁面中的css和js文件分別合并)以及Imagemaps和csssprites等。當(dāng)然或許將css,js文件拆分成多個是因為css結(jié)構(gòu),共用等方面的考慮。阿里巴巴中文站當(dāng)時的做法是開發(fā)時依然分開開發(fā),然后在后臺對js,css進(jìn)行合并,這樣對于游覽器來說依然是一個請求,但是開發(fā)時仍然能還原成多個,方便管理和重復(fù)引用。yahoo甚至建議將首頁的css和js直接寫在頁面文件里面,而不是外部引用。因為首頁的訪問量太大了,這么做可以減少兩個請求數(shù)。而事實上國內(nèi)的很多門戶都是這么做的。 其中csssprites是指只用將頁面上的背景圖合并成一張,然后通過css的background-position屬性定義不過的值來取他的背景。淘寶和阿里巴巴中文站目前都是這樣做的。這是個工具網(wǎng)站,它可以自動將你上傳的圖片合并,并給出對應(yīng)的background-position坐標(biāo)。并將結(jié)果以png和gif的格式輸出。 十九、使用CDN做網(wǎng)站加速 簡單地說,就是通過在現(xiàn)有的Internet中增加一層新的網(wǎng)絡(luò)架構(gòu),將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的緩存服務(wù)器內(nèi)。通過DNS負(fù)載均衡的技術(shù),判斷用戶來源就近訪問cache服務(wù)器取得所需的內(nèi)容,杭州的用戶訪問接近杭州服務(wù)器上的內(nèi)容,北京訪問接近北京服務(wù)器上的內(nèi)容。這樣可以有效減少數(shù)據(jù)在網(wǎng)絡(luò)上傳輸?shù)氖录?,提高速度。把靜態(tài)內(nèi)容發(fā)布到CDN減少了用戶影響時間20%或更多。 CDN技術(shù)示意圖: 國內(nèi)有名的CND公司:網(wǎng)宿,藍(lán)汛(chinacache),快網(wǎng) 二十、apache網(wǎng)站架構(gòu)優(yōu)化 好的網(wǎng)站架構(gòu)是網(wǎng)站性能強(qiáng)大關(guān)鍵,更是網(wǎng)站安全的關(guān)鍵。 在生產(chǎn)環(huán)境中建議將程序頁面服務(wù)器、圖片附件服務(wù)器和上傳服務(wù)器三者的功能盡量分離。 那么如何實現(xiàn)分離呢? 1、分離最佳方式是分別使用獨立的服務(wù)器(需要程序支持) 2、次選方案在前端負(fù)載均衡器通過haproxy/nginx來根據(jù)用戶請求的目錄或擴(kuò)展名來對后端的服務(wù)器發(fā)出請求。 例如:請求就拋給圖片服務(wù)器(CDN最好),這里是根據(jù)擴(kuò)展名.jpg分發(fā) 請求就拋給上傳服務(wù)器(CDN最好),這里是根據(jù)URL路徑分發(fā) 均不符合上面兩個要求的,默認(rèn)就都是拋給web服務(wù)器。