1. 程式人生 > >WEB服務之apache優化

WEB服務之apache優化

都在 兩個 thread 銷毀 eva 轉換成 來源 實例 位置

1 源碼官方下,補丁及時打

正如我們在apache部署篇講到的我們需要對下載的源碼包進行驗證一樣,我們在挑選apache源碼安裝包的時候,一定要去官網,不要去亂七八糟的站點進行下載,防止源碼包被別有用心的人動過手腳,導致後面對公司業務造成不必要損失。

另外為了apache的安全性和性能考慮,我們一定要多多關註apache的官網的補丁發布情況,一旦有新的補丁,我們一定要及早打上。特別是一些安全補丁,防止受到損失。

2 屏蔽apache版本等敏感信息

1)我們在apache主配置文件httpd.conf中,找到包含httpd-default.conf的行,並解開註釋

[root@c64-web /]# grep "httpd-default.conf" /usr/local/apache/conf/httpd.conf
#Include conf/extra/httpd-default.conf
[root@c64-web /]# sed -i ‘s#\#Include conf/extra/httpd-default.conf#Include conf/extra/httpd-default.conf#g‘ /usr/local/apache/conf/httpd.conf

註意:編譯安裝的情況下,只有此行解開註釋了,後面的修改才能生效。

2)打開httpd-default.conf文件,修改如下兩個地方

[root@jincon /]# grep Server conf/extra/httpd-default.conf|grep -v "#"
ServerTokens full
ServerSignature Off
修改為:
ServerTokens Prod
ServerSignature Off
經過上面的修改,當你在curl -I www.jincon.com的時候,還是會出現下面的信息
Server: 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 6 #補丁級別
#define AP_SERVER_DEVBUILD_BOOLEAN 0 #

上述列出的行,我已經給出了註釋,大家可以修改成自己想要的,然後編譯安裝之後,再對httpd-default.conf文件進行修改,對方就徹底不知道你的版本號了。

3 更改apache的默認用戶

通過更改apache的默認用戶,可以提升apache的安全性。這樣,即使apache服務被攻破,×××拿到apache普通用戶也不會對系統和其他應用造成破壞。這裏創建的apache用戶,將用於對子進程和線程的控制。
[root@c64-web /]# useradd -M -s /sbin/nologin apache 創建apache用戶

編輯apache配置文件,修改默認的用戶。

[root@c64-web /]# vim /usr/local/apache/conf/httpd.conf
User apache    #更改默認的daemon用戶為apache用戶
Group apache   #更改默認的daemon用戶為apache用戶

4 Apache目錄及文件權限設置

在生產環境的網站架構中,我們應把資源文件,例如用戶上傳的圖片及附件等和程序做好分離,最好是把上傳程序也分離開來。這樣才能更方便我們做好授權,保證apache服務和整個服務器安全。

這裏我們設置apache的網站目錄屬主和屬組是root,權限是755,文件的權限為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
並且,在對日誌的授權商,我們要將屬主和屬組都設置為root,權限設置為700。
drwx------ 2 root root 4096 11月 5 02:46 logs

由於apache日誌的記錄是由apache的主進程進行操作的,而apache的主進程又是root用戶啟動的,所以這裏設置700是不影響日誌記錄了。這也是日誌記錄的最安全的方法。

5 配置cronolog進行日誌輪詢

由於apache自帶的日誌輪詢工具rotatelogs,據專家說在進行日誌切割時容易丟日誌,因此我們通常使用cronolog進行日誌輪詢。
5.1、下載並安裝cronolog

[root@jincon /]# cd /server/tools/
[root@jincon tools]# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
[root@jincon tools]# tar zxf cronolog-1.6.2.tar.gz
[root@jincon tools]# cd cronolog-1.6.2
[root@jincon cronolog-1.6.2]# ./configure
[root@jincon cronolog-1.6.2]# make&&make install

5.2、配置apache使用cronolog
由於實驗用的apache開啟了虛擬主機功能,所以以下範例配置都在虛擬主機中進行。

[root@jincon cronolog-1.6.2]# vim /usr/local/apache/httpd/extra/httpd-vhosts.conf

將配置文件中的CustomLog和ErrorLog替換為下面的(由於我們要對多站點,所以這裏要替換兩個虛擬主機的,並且將日誌存放名字做有效的區分才好)

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"

更多日誌格式參考:
按天輪詢(生產環境常見用法,推薦使用):

CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined

按小時輪詢(生產環境較常見用法):

CustomLog "|/usr/local/sbin/cronolog /app/logs /access_www_ %Y%m%d%H.log" combined

6 錯誤頁面優雅顯示

為了提升網站的用戶體驗,避免404,403之類的醜陋的默認錯誤提示出現,我們需要對錯誤頁面進行優化,讓他們變的漂亮一點。錯誤頁面不僅在於告訴用戶訪問出現了問題,而且需要引導用戶到正確的頁面。

錯誤頁面優雅化顯示的實現方式主要有兩種,下面我們主要以404錯誤為例:

第一種:在apache的主配置文件httpd.conf中的標簽內添加ErrorDocument配置。

[root@jincon /]# vi /usr/local/apache/conf/httpd.conf

<Directory "/www/html">
AllowOverride None
Options None
Require all granted
ErrorDocument 404 /404.html    #將404錯誤跳轉到/www/html下的404.html頁面上
</Directory>

第二種方法:在apache的虛擬主機配置文件httpd-vhost.conf中的中添加ErrorDocument配置。

<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/www/html"
ServerName www.jincon.com
ServerAlias jincon.com
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 http://www.jincon.com ;   #將404錯誤跳轉到http://www.jincon.com 頁面上
</VirtualHost>

從上面的兩種解決方案,我們可以看出ErrorDocument的命令格式如下:
ErrorDocument 錯誤代碼 跳轉到的頁面或文件

另外這裏需要註意,你若設置跳轉到文件,必須要有這個文件才行。另外文件必須在站點目錄內,不然會報錯。

在跳轉到文件的測試中,我用全路徑和別名路徑進行測試,當把404錯誤頁面跳轉文件放到其他目錄的時候,不報錯,但是頁面跳轉不過去。若跳轉為未鏈接,則不影響。

7 啟用壓縮模塊mod_deflate

網站隨著用戶訪問量的增加和內容量的增加,網站的帶寬會不斷的增加,隨之就是網站成本的增加。並且當內容量增大的時候,客戶端如果帶寬小,就會影響用戶的體驗。因此從這兩方面考慮,網站的某些內容必須經過壓縮之後再傳給用戶,然後在用戶客戶端進行解壓,來實現雙方共贏的效果。

apache 的壓縮要用到mod_deflate模塊,該模塊提供了DEFLATE輸出過濾器,允許服務器在將輸出內容發送到客戶端以前進行壓縮,以節約帶寬。它的核心思想就是把文件先在服務器進行壓縮,然後再進行傳輸,這樣可以顯著減少文件傳輸的大小。當傳輸完畢後,客戶端瀏覽器會重新對壓縮過的內容進行解壓縮。如果沒特殊情況的話,所以的文本內容都應該能被gzip壓縮,例如:html(php),js,css,xml,txt等。特殊情況就是像一些首頁上有很多廣告投放的js代碼,由於需要每次加載進而進行來訪信息統計,所以這些廣告代碼擁有者網站的js不會經過gzip壓縮,

mod_deflate模塊,在部署的時候已經編譯安裝進去了。

那麽如果沒有安裝,如何安裝呢?並且如果不知道到是否安裝了,如何查看呢?

7.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) #此種結果為編譯安裝時裝的
[root@c64-web /]# /usr/local/apache/bin/apachectl -M | grep deflate
deflate_module (shared) #此種結果為DSO方式安裝的

安裝了的話,就可以直接進行壓縮配置了,如果沒有安裝,下面為安裝方法:
a)編譯時安裝方法
編譯的時候跟上--enable-deflate即可實現安裝

b)DSO方式安裝
[root@c64-web /]# cd /server/tools/httpd-2.4.6/modules/filters/ #切到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
擴展:使用DSO方式安裝,apxs後跟的參數詳解:

  1. -c 此選項表明需要執行編譯操作。它首先會編譯c源程序(.c)files為對應的目標代碼文件(.c),然後連接這些目標代碼和files中其余的目標代碼文件(.c和.a),以生成動態共享對象dsofile。如果沒有指定-s選項,則此輸出文件名由files中的第一個文件名推測得出,也就是默認 mod_name.so。
  2. -i 此選項表示需要執行安裝操作,以安裝一個或多個動態共享對象到服務器的modules目錄。
  3. -a 此選項自動增加一個LoadModule行到httpd.conf文件中,以激活此模塊,或者,如果此行已經存在,則啟用之。
  4. 壓縮模塊配置

7.2、配置壓縮參數

註意如果我們是編譯安裝時已經編譯進去的,此時我們需要先將httpd.conf主配置文件中

LoadModule deflate_module modules/mod_deflate.so
此行解鎖後再進行下面操作,不然下面的操作會報錯。
我們需要在虛擬機的中添加如下配置即可實現壓縮:
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   #在日誌中放置壓縮率標記,下面是記錄日誌的,這個功能一般不用
#LogFormat ‘"%r" %{outstream}n/%{instream}n (%{ratio}n%%)‘ deflate
#CustmLog logs/deflate_log.log deflate

下面是朋友公司的另外一種壓縮配置,有興趣的朋友們也可以操作操作:

DeflateCompressionLevel 9
SetOutputFilter DEFLATE
DeflateFilterNote Input instream #聲明輸入流的byte數量
DeflateFilterNote Output outstream #聲明輸出流的byte數量
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類型文件

執行上面的添加後,我們對apache進行優雅重啟:

/usr/local/apache/bin/apachectl graceful

下面訪問我們的網站,然後用火狐或者google遊覽器的YSLOW插件進行壓縮效果的查看

我們在企業生產環境中時,在啟用mod_deflate時,一定要註意,對於太小的文件和某些格式的圖片不要對它們進行壓縮,有可能越壓越大。

下面給出大家幾乎是所有的AddOutputFilterByTypeDEFLATE後跟的壓縮文件類型,大家可以參照選擇:

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

8 mod_expires緩存功能

雖然我們上面通過mod_deflate模塊啟用了壓縮,從很大程度上節約了企業帶寬,降低了企業成本。可是由於現在越來越多的圖片、腳本、css和 flash被嵌入到頁面中,當客戶訪問站點勢必會做很多次的http請求,因此我們還可以通過mod_expires緩存模塊來設置 ExpiresHeader來緩存這些文件。Expires是通過header報文來指定特定類型的文件在遊覽器中的緩存時間的。平時,我們大多數的圖片,flash在發布之後都是不需要經常修改的,因此做了緩存之後,遊覽器第一次從服務器下載之後,就不需要再從服務器下載這些文件而是直接從遊覽器緩存中讀取了。這樣客戶訪問頁面的速度就會大大加快,企業的帶寬壓力也得到了緩解。

8.1、mod_expires模塊檢查及安裝

檢查mod_expires模塊是否安裝的方法如下:

[root@c64-web /]# /usr/local/apache/bin/apachectl -M | grep deflate
expires_module (static) #此種結果為編譯安裝時裝的
[root@c64-web /]# /usr/local/apache/bin/apachectl -M | grep deflate
expires_module (shared) #此種結果為DSO方式安裝的

安裝了的話,就可以直接進行壓縮配置了,如果沒有安裝,下面為安裝方法:
a)編譯方式安裝:
編譯的時候跟上--enable-expires即可實現安裝

b)DSO方式安裝:

[root@c64-web /]# cd /server/tools/httpd-2.4.6/modules/filters/ #切到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

8.2、配置緩存參數

註意如果我們是編譯安裝時已經編譯進去的,此時我們需要先將httpd.conf主配置文件中:

LoadModule expires_module modules/mod_expires.so

此行解鎖後再進行下面操作,不然會報錯。
緩存的用法有3種,分別對全局,對目錄,對虛擬主機:
a)對全局
對全局的配置就是在apache主配置文件httpd.conf的末尾加入如下參數即可:

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 /404.html
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)對虛擬主機
對虛擬主機的配置就是在apache的虛擬主機配置文件httpd-vhost.conf中添加如下參數即可:

ServerAdmin [email protected]
DocumentRoot "/www/html"
ServerName www.jincon.com
ServerAlias jincon.com
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"
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服務器進行優化重啟,然後用火狐或者google遊覽器的YSlow插件進行緩存效果查看。

? 擴展:expires模塊的語法
上面已經的操作就是實現apache的緩存功能。其中,expires後面的參數你也可以根據需求自行更改,緩存時間也是一樣可以更改的。

這裏我對expires的模塊語法進行一些細說

expires模塊用到了ExpiresDefault和EXpiresByType兩個指令,下面是這兩個指令的語法。

ExpiresDefault “<base> [plus] {<num><type>}*”
EXpiresByType type/encoding " [plus] {}"
其中的參數有3個:access,now(等價於‘access’),modification
plus關鍵字是可選的。

必須是整數,確保可以atoi()所接收。(atoi可以把字符串轉換成長整型數)
參數類型:years,months,weeks,days,hours,minutes,seconds

下面用幾個例子帶大家理解下:

例如:下面3個指令都表示文檔默認的有效期是一個月
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"

註意:如果你使用基於最後修改日期的設置,“Expires”頭將不會被添加到那些並非來自於硬盤文件的內容,這是因為這些內容並不存在“最後修改時間”的屬性。

基準時刻可以是源文件的最後修改時刻或者客戶端對源文件的訪問時刻,至於使用那一個則由指定。“M”表示源文件的最後修改時刻,“A”表示客戶端對源文件的訪問時刻,需要註意的是和seconds之間沒有空格。

這兩個基準的差別是很微妙的。如果使用“M”,所有當前緩存中的文檔副本都將在同一時刻過期,這個可能對定期更新的URL(比如位於同一位置的每周通告)很有好處。如果使用“A”,則每個客戶端所得到的有效期是不一樣的,這個可能對那些幾乎不更新的圖片很有好處,特別是對於一組都引用相同圖片的相關文檔。

緩存優化對企業來說是至關重要了的,不同的公司類型,緩存的類型和時間又各不相同,大家具體可以用YSlow對淘寶,京東,新浪,谷歌等站點進行測試,看看他們的緩存時間是多少,並思考下為什麽那樣設置。

雖然緩存的設置有如下優點:
1.縮短服務的響應時間
2.減輕服務器負擔
3.減少網絡帶寬使用量,降低企業成本

但是他的缺點也是顯而易見的,由於使用了緩存設置,導致被緩存的內容更新了,但是客戶看到的卻還是舊的。
如何解決被緩存文件及時更新這個問題呢?
1.第一種:縮短緩存時間例如:1天,不徹底犧牲性能
2.第二種:對緩存的對象改名。

9 啟用worker模式

啟用worker模式,提升並發數(可以達到2000-5000)
apache有兩個模式,默認的模式是prefork模式。那麽我們為什麽要使用worker模式呢?這兩種模式又有什麽區別呢?

9.1、prefork模式

prefork使用的是多個子進程,而每個子進程只有一個線程,每個進程在某個確定的時間只能維持一個連接。

工作原理:控制進程最初建立若幹個子進程,為了不在請求到來時再生成子進程,所以要根據需求不斷的創建新的子進程,最大可以達到每秒32個直到滿足需求為止。

安裝方法:在編譯的過程中,加入參數--with-mpm=frefork,不加也可以,因為默認的話,會采用prefork模式。

優點:效率高,穩定,安全。對於線程調試困難的平臺來說,調試更加容易些。
缺點:與worker模式相比消耗資源多。

配置參數說明:

</IFModule mpm_prefork_module>
StartServers 5 #最初建立的子進程
MinSpareServers 5 #最小空閑進程數,如果空閑的進程小於設定值,Apache會自動建立進程,如果服務器並發及負載大的話,可以考慮加大。
MaxSpareServers 10 #最大空閑進程數,如果空閑的進程大於設定值,Apache會自動kill掉多余的進程,如果服務器負載大的話,可以考慮加大。
MaxClients 150 #設定的是apache可以同時處理的請求,是對apache性能影響最大的參數,就是apache可以同時處理的請求數,就是說,如果有150個用戶在訪問,那麽第151個用戶就要等之前的訪問結束後才能訪問。
MaxRequestsPerChild 0 # 每個子進程可處理的請求數,每個子進程在處理了“MaxRequestsPerChild”個請求後將自動銷毀。0以為著無限,即子進程永不銷毀。雖然缺省設為0可以使每個子進程處理更多的請求,但如果設置成非0值也有兩點重要的好處。(1)可防止意外的內存泄露(2)在服務器負載下載的時候會自動減少子進程數。
</IFModule>

生產環境配置實例1:


</IFModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 5000
</IFModule>

9.2、worker模式

worker模式是apche2.x新引進來的模式,是線程與進程的結合,在worker模式下會有多個子進程,每個子進程又會有多個線程。每個線程在某個確定的時間只能維持一個連接。

工作原理:由主控制進程生成若幹個子進程,而每個子進程中又包含固定的線程數,各個線程獨立處理請求,同樣為了不在請求到來時再生成線程,在配置文件中設置了最小和最大的空閑線程數及所有子進程中的線程總數,如果現有子進程中的線程總數不能滿足並發及負載,控制進程將派生新的子進程。

安裝方法:在配置編譯的工程中,加入參數--with-mpm=worker,如果不加的話系統會采用默認prefork模式。

優點:內存占用比prefork模式低,適合高並發高流量HTTP服務。
缺點:假如一個線程崩潰,整個進程就會連同其任何線程一起“死掉”。由於線程共享內存空間,所以一個程式在運行時必須被系統識別為“每個線程都是安全的”。服務穩定性不如prefork模式。

配置參數說明:

StartServers 2 #最初建立的子進程
MaxClients 150 #所有子進程中的線程總數。如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。
MinSpareThreads 25 #最小空閑線程數,如果空閑的線程小於設定值,apache會自動建立線程,如果服務器負載大的話,可以考慮加大此參考值。
MaxSpareThreads 75 #最大空閑線程數,如果空閑的線程大於設定值,apache會自動kill掉多余的線程,如果服務器負載大的話,可以考慮加大此參考值。
ThreadsPerChild 25 #每個進程包含固定的線程數,此參數在worker模式中,是影響最大的參數,ThreadsPerChild的最大缺省值是64,如果負載較大,64是不夠的。這時要顯式使用threadlimit指令,它的最大缺省值是20000.
MaxRequestsPerChild 0 #功能同prefork模式

常用配置參考:

生產環境配置實例1:

StartServers 3
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerChild 0

生產環境配置實例2:

StartServers 5
MaxClients 9600
ServerLimit 64
MinSpareThreads 25
MaxSpareThreads 500
ThreadLimit 200
ThreadsPerChild 150
MaxRequestsPerChild 0

生產場景配置實例3:

StartServers 2
MaxClients 500
ServerLimit 25
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

生產場景配置實例4:

StartServers 3
MaxClients 1600
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 64

worker 模式下所能同時處理的請求總數是由子進程總數乘以Threadsperchild值決定的,應該大於等於maxclients。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。默認最大的子進程總數是16,如需加大時也需要顯示聲明serverlimit的值(最大值是20000)

特別說明:如果顯示聲明了ServerLimit,那麽它乘以ThreadsPerChild的值必須大於等於MaxClients,而且 MaxClients必須是ThreadsPerChild的整數倍,否則apache將會自動調節到一個相應值(可能是個非期望值)。

數學表達:
MaxClient<=總的進程數(ServerLimit)x線程數(ThreadsPerChild)
MaxClient%ThreadsPerChild=0

生產環境中我們需要開啟httpd-mpm.conf配置行,這樣才能實現並發鏈接數的增加。
1、開啟httpd-mpm.conf配置行

這裏我們要apache的主配置文件httpd.conf,找到包含httpd-mpm.conf的行,並解開註釋
[root@c64-web /]# grep "httpd-mpm.conf" /usr/local/apache/conf/httpd.conf
#Include conf/extra/httpd-mpm.conf
[root@c64-web /]# sed -i ‘s#\#Include conf/extra/httpd-mpm.conf#Include conf/extra/httpd-mpm.conf#g‘ /usr/local/apache/conf/httpd.conf
註意:編譯安裝的,只有此行解開註釋了,後面的修改才能生效。

2、修改httpd-mpm.conf配置

1)如果你的apache服務為worker模式,那麽生產環境中可以選擇上面worker模式的生產環境配置實例1的配置。
2)如果你的apache服務為prefork模式,那麽生產環境中可以參考上面prefork模式的生產環境配置實例1的配置。
生產環境中,這裏我建議大家選擇worker模式。

10 開啟防盜鏈

一些小網站為了盈利,通過盜鏈來實現對自己網站內容的豐富,這無疑加大了企業的空間和流量的成本,因此我們需要對apache進行防盜鏈的配置。

由於我們要用到mod_rewrite模塊,因此我們需要先檢測該模塊是否安裝,檢測和安裝方法與上面mod_deflate和mod_expires的一樣,這裏不多講了。

防盜鏈配置:
一般我們都是將防盜鏈的配置,配置在虛擬主機裏面,配置如下:

ServerAdmin [email protected]
DocumentRoot "/www/html"
ServerName www.jincon.com
ServerAlias jincon.com
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} !^http://jincon.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://jincon.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.jincon.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.jincon.com$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.jincon.com [R,NC]
如上配置之後,我們重啟apache服務即可生效。

11 禁止目錄瀏覽

由於開啟目錄瀏覽會讓我們整個目錄下的內容全部都暴露到外面,因此我們必須要禁止目錄瀏覽功能。當然一些目錄開放給客戶做下載的,可以忽略此項優化。我的http://down.jincon.com就是範例。

我們通過修改apache主配置文件httpd.conf中的標簽內的Options選項參數來實現禁用目錄瀏覽。

實現方法有三種:
第一種:

AllowOverride None
Options FollowSymLinks #不填寫Indexes項,默認即為關閉。
Require all granted

第二種:

AllowOverride None
Options -Indexes #通過在Indexes前面加-來禁用此功能
Require all granted

第三種:

AllowOverride None
Options None #禁用所有選項
Require all granted

12 禁用AllowOverride選項,關閉.htaccess文件使用

首先是性能考慮,如果AllowOverride啟用了.htaccess文件,則apache需要在每個目錄中查找.htaccess文件。因此,無論是否真正用到,啟用.htaccess都會導致服務器性能的下降。另外,對於每一個請求,都需要讀取一次.htaccess文件。
其次是安全考慮,這樣會允許用戶自己修改服務器的配置,這可能會導致某些意想不到的修改,所以請認真考慮是否應當給予用戶這樣的特權。

12.1、禁用AllowOverride選項

我們通過修改apache主配置文件httpd.conf中的標簽內的AllowOverride選項參數來實現禁用目錄瀏覽。

Options none
AllowOverride None #禁止該選項,防止用戶重復載入
Require all granted

通過該設置加快了服務器響應速度,因為它不再讓每個請求去尋求每個目錄的訪問控制文件(.htaccess)

12.2、關閉.htaccess文件使用

默認在Unix平臺下能夠使用.htaccess來對目錄權限進行規則定義,但是這是不安全的,建議關閉,默認的選項:

AccessFileName .htaccess

這裏我們將它關閉註釋掉

#AccessFileName .htaccess
全部目錄權限定義使用httpd.conf中的定義,不使用.htaccess進行定義。

13 關閉自帶CGI功能

生產環境中,一般我們不使用apache自帶的cgi的功能,如果使用的話,可以用mod_perl模塊來替代。因此我們這裏需要將apache主配置文件httpd.conf中有關cgi的內容刪除掉。

刪除部分:

ScriptAlias /cgi-bin/ "/usr/local/apache2.4.6/cgi-bin/"
<Directory "/usr/local/apache2.4.6/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>

14 禁止PHP解析指定站點的目錄

企業的站點有時會提供用戶進行上傳操作,而用戶上傳文件的存放目錄,我們是不能給php的解析權限的,否則會對apache服務和系統造成危害。

15 apache的安全模塊

我們需要對apache站點增加一些擴展的安全模塊,如:mod_evasive20防DDOS、mod_limitipconn(針對單站點)配置、mod_security2防SQL註入等等之類的工具。

另外,下面是推薦給大家的幾個工具。
makejail http://www.floc.net/makejail/
它是一個自動把建立jail所需要的程序放到jail內的軟件,使用python編寫,他有debian和openbsd的版本。

mod-security http://www.modsecurity.org/
它是apche的一個模塊,它不僅可以實現過濾請求和日誌審計等功能,而且可以防止SQLInjection和跨站腳本×××等是個很不錯的安全模塊。

16 使用tmpfs文件系統替代頻繁訪問的目錄

tmpfs 是一種基於內存的文件系統。它最主要的兩個優勢就是動態文件系統大小和速度快。因為典型的tmpfs文件系統會完全駐留在RAM中,讀寫幾乎可以是瞬間的。即使用了一些交換分區,性能仍然是卓越的。因此對於那些頻繁訪問的目錄,建議使用tmpfs文件系統進行替代。

17 優化系統內核參數

對系統內核的優化參數,我們在系統的基礎優化這邊博文已經講過了。系統內核優化最主要的目的就是減少TIME-WAIT的TCP連接數。

由於在基礎優化篇我們已經對apache進行了內核參數的優化,因此這裏我就不再操作了。這裏我將為大家對優化的參數進行講解。

net.ipv4.tcp_fin_timeout #表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間,默認值是60秒。
net.ipv4.tcp_tw_reuse #表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認值為0,表示關閉。該參數對應系統路徑為:/proc/sys/net/ipv4/tcp_tw_reuse 0
net.ipv4.tcp_tw_recycle # 表示開啟TCP連接中TIME-WAIT sockets的快速回收該參數對應系統路徑為:/proc/sys/net/ipv4/tcp_tw_recycle提示:reuse和recycle 兩個參數為了防止生產環境下web,squid等time_wait過多設置的。
net.ipv4.tcp_syncookies # 表示開啟SYN Cookies功能。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN×××,Centos5系列默認值為1,表示開啟。因此這個參數也可以不添加。該參數對應系統路徑為:/proc/sys/net/ipv4/tcp_syncookies,默認為1
net.ipv4.tcp_keepalive_time #表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改為10分鐘。該參數對應系統路徑為:/proc/sys/net/ipv4/tcp_keepalive_time,默認為7200秒。
net.ipv4.ip_local_port_range #選項用來設定允許系統打開的端口範圍。即用於向外連接的端口範圍。該參數對應系統路徑為:/proc/sys/net/ipv4/ip_local_port_range 32768 61000
net.ipv4.tcp_max_syn_backlog #表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網絡連接數。選項為服務器端用來記錄那些尚未收到客戶端確認信息的連接請求的最大值。
該參數對應系統路徑為:/proc/sys/net/ipv4/tcp_max_syn_backlog
net.ipv4.tcp_max_tw_buckets # 表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清楚並打印警告信息。默認為180000,對於Apache、Nginx等服務器來說可以調整低一點,如改為5000-30000,不同業務的服務器也可以給大一旦,比如lvs,squid。上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於Squid效果卻不大。此項參數可以控制TIME_WAIT套接字的最大數量,避免 Squid服務器被大量的TIME_WAIT套接字拖死。此參數對應系統路徑為:/proc/sys/net/ipv4 /tcp_max_tw_buckets
net.ipv4.tcp_synack_retries #參數的值決定了內核放棄連續之前發送SYN+ACK包的數量。該參數對應系統路徑為:/proc/sys/net/ipv4/tcp_synack_retries默認值為5
net.ipv4.tcp_syn_retries #表示在內核放棄建立連接之前發送SYN包的數量。該參數對應系統路徑為:/proc/sys/net/ipv4/tcp_syn_retries 5
net.ipv4.tcp_max_orphans # 選項用於設定系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤立連接將立即被復位並打印出警告信息。這個限制這是為了防止簡單的Dos×××,不能過分依靠這個限制甚至認為減少這個值,更多的情況是增加這個值。該參數對應系統路徑為:/proc/sys/net /ipv4/tcp_max_orphans 65536

18 盡可能減少HTTP請求數

http 請求是要開銷的,想辦法減少請求數自然可以提高網頁速度。常用的方法,合並css,js(將一個頁面中的css和js文件分別合並)以及 Imagemaps和csssprites等。當然或許將css,js文件拆分成多個是因為css結構,共用等方面的考慮。阿裏巴巴中文站當時的做法是開發時依然分開開發,然後在後臺對js,css進行合並,這樣對於遊覽器來說依然是一個請求,但是開發時仍然能還原成多個,方便管理和重復引用。yahoo 甚至建議將首頁的css和js直接寫在頁面文件裏面,而不是外部引用。因為首頁的訪問量太大了,這麽做可以減少兩個請求數。而事實上國內的很多門戶都是這麽做的。

其中csssprites是指只用將頁面上的背景圖合並成一張,然後通過css的background-position屬性定義不過的值來取他的背景。淘寶和阿裏巴巴中文站目前都是這樣做的。http://www.csssprites.com/這是個工具網站,它可以自動將你上傳的圖片合並,並給出對應的background-position坐標。並將結果以png和gif的格式輸出。

19 使用CDN做網站加速

簡單地說,就是通過在現有的Internet中增加一層新的網絡架構,將網站的內容發布到最接近用戶的緩存服務器內。通過DNS負載均衡的技術,判斷用戶來源就近訪問cache服務器取得所需的內容,杭州的用戶訪問接近杭州服務器上的內容,北京訪問接近北京服務器上的內容。這樣可以有效減少數據在網絡上傳輸的事件,提高速度。把靜態內容發布到CDN減少了用戶影響時間20%或更多。

國內有名的CND公司:網宿,藍汛(chinacache),快網

20 apache網站架構優化

好的網站架構是網站性能強大關鍵,更是網站安全的關鍵。

在生產環境中建議將程序頁面服務器、圖片附件服務器和上傳服務器三者的功能盡量分離。

那麽如何實現分離呢?
1、分離最佳方式是分別使用獨立的服務器(需要程序支持)
2、次選方案在前端負載均衡器通過haproxy/nginx來根據用戶請求的目錄或擴展名來對後端的服務器發出請求。
例如:請求http://www.jincon.com/a/b.jpg 就拋給圖片服務器(CDN最好),這裏是根據擴展名.jpg分發
請求http://www.jincon.com/upload/index.php 就拋給上傳服務器(CDN最好),這裏是根據URL路徑分發
均不符合上面兩個要求的,默認就都是拋給web服務器。

WEB服務之apache優化