Apache參數的優化
按照前面提到的版本問題,Apache可以直接使用2.0版本産品線。針對Apache的優化主要是針對httpd.conf的優化,當然還有其他地方,如果特别留意的話,網上常有專家驚呼“居然這麼多人忽略xxxx處的優化”等等,實際情況也确實如此,因為優化的地方實在太多了,httpd.conf隻能做一個出發點。即便如此如果僅僅使用httpd.conf出廠預設值的話還是令人痛心不已。
httpd.conf的優化點有以下幾處:
1. KeepAlive
我安裝的Apache2.0出廠值居然是Off。除非你的網站隻有文字沒有圖檔,否則改成On。然後所有的麻煩就來了。
以前看到過一個Web2.0和Web1.0的服務比較圖,有印象的就是AdSense是1.0,垃圾Chitika成了2.0,同樣Akamai是1.0,BitTorrent成了2.0,真暈。其實Akamai的圖檔存儲服務主要解決伺服器的KeepAlive問題。看下面這個sample.html:
<html><body><p>Hello world</p><img src="hello.gif" /></body></html>
當浏覽器将請求發送給Apache後,Apache會為該使用者建立連接配接,傳回/sample.html的内容,浏覽器解析HTML檔案,發現還需要顯示/hello.gif,就再次向Apache送出請求。這時如果KeepAlive為Off,Apache就需要重建立立連接配接。試想如果頁面請求了1000個圖檔,Apache就需要建立1000個連接配接(但建立第N個時候N-x個連接配接已經被Apache聰明的關閉了)。如果KeepAlive為On,Apache會在同一個連接配接中處理所有這些請求,大大的節省了連接配接資源,可惜這個世界上有很多攻擊者,他們會利用這個連接配接不斷的特性不停的請求檔案,耗盡伺服器的資源。是以一些大公司像Yahoo、AOL都選用Akamai作為圖檔存儲服務,結果這些公司的sample.html版本就成了這個樣子:
<html><body><p>Hello world</p><img src=" http://a620.g.akamai.net/hello.gif" /></body></html>
(真實地圖檔位址會比這個複雜)
這樣一來每次使用者通路僅會向本機伺服器的Apache請求一次,剩下的請求發送到akamai了。不必為akamai的能力擔心,因為它有充足的抗負載技術,Web2.0的大喇叭們想用BT取代akamai,我靠。
2. MaxKeepAliveRequests
明白了1中的内容,這個看名字就知道一個連接配接可以最多發送多少次請求。預設是500。
3. KeepAliveTimeout
同樣,兩次請求間超過這個數字就中斷這個連接配接。如果你的KeepAlive是On,MaxKeepAliveRequests是500,KeepAliveTimeout是100,你可以算算攻擊者們用多久可以耗幹你的Apache。我把KeepAliveTimeout設為5,因為從我網站閱聽人人群的上網速度和網站的圖檔大小、數量考慮,5秒種可以完成加載多數頁面。
4. StartServers
StartServers的數字表示Apache啟動後直接建立的httpd數量。比如你的伺服器平時平均需要100個httpd,如果把StartServers設為10就會導緻Apache啟動之初不停的建立剩下的90個httpd。如果你的伺服器平時最多就用20個httpd,把StartServers設為50就浪費了資源。這個參數沒什麼大不了,因為Apache會自己趨向于适合的httpd服務數。
5. MinSpareServers、MaxSpareServers
保留備用的httpd服務數最小值和最大值。即當不需要這麼多httpd服務時,依然最少保留MinSpareServers個服務,但不超過MaxSpareServers個服務。需要根據Apache的運作尋找經驗值。
6. ServerLimit,MaxClients
比較重要的一個值。ServerLimit通常應該等于MaxClients。MaxClients決定了最大的httpd程序數,如果攻擊者占用了MaxClients的httpd服務數,你的網站就拒絕正常通路者通路了。但MaxClients的大小受記憶體的限制,是以Apache2的預設值是250,并加上了ServerLimit參數作限制,如果想設大MaxClients,必須同時擴大ServerLimit,但ServerLimit不應超過MaxClients。
7. MaxRequestsPerChild
決定了每個httpd服務可以處理的最大請求數,超過這個數字就需要新的httpd服務,後者又由MaxClients限制,環環相套。我的MaxRequestsPerChild是10000。
8. HostnameLookups
設為Off,避免DNS查詢的等待。
除了這8個參數外,Apache的另一個可塑點是加載的Module,把不需要的LoadModule注釋掉即可,大大的節省了記憶體。但是問題是你不知道那個Module不需要,即便對照着Apache的Module文檔朗讀各個Module作用,也隻能注釋掉很少幾個。下面是我比較踏實的注釋掉的幾個Module:
mime_magic_module、info_module、userdir_module、proxy_module、proxy_ftp_module、proxy_http_module、proxy_connect_module。
PHP加速器
PHP沒什麼值得優化的地方(這種東西真省心)。隻是建議把php.ini中的資料庫永久連接配接關閉以避免難堪的"Too many connections"錯誤。關閉php的mysql永久連結,即使php用戶端mysql_pconnect這樣的語句失效,但是不比擔心現有的代碼發生錯誤,因為PHP會自動将mysql_pconnect當作mysql_connect處理,并且在頁面執行完畢自動關閉資料庫連結。缺點是每次通路一個頁面都會建立一次資料庫連結,但不同于Apache的連結,因為Apache是每頁都有N個連結機會,而資料庫通常每頁隻需連接配接一次。
相對于對PHP本身的優化,安裝一個PHP加速工具更有意義。以前是PHP Eaccelerator,而現在流行的是eAccelerator(此中有很多恩恩怨怨)。eAccelerator在程式層緩存php檔案,而不是緩存php的執行、輸出結果,是以不必擔心時效性。eAccelerator安裝非常簡便,隻需要按步實施即可。
eAccelerator是繼前面提到的更新硬體、記憶體和更新MySQL到4.x外另一個可以顯著導緻網站速度提升的武器。