天天看點

優化你的伺服器Apache、MySQL、PHP

硬體上的考慮

其實起50%的作用,當然是越快越好。如果不知道哪個快,就換成越貴越好。可實際上不可能做到這些,因為銀子有限,是以按照這個順序考慮:記憶體越大

越好-

>硬碟SCSI好于SATA->CPU越快越好。下面是一個比較極端的進階配置(指運作MySQL資料庫級别的網站,想克隆ebay的去紮風

投然後買曙光好了):

Dual Xeon 3.x + 4G RAM + SCSI 叢集做MySQL伺服器

Dual Xeon 3.x + 4G RAM + SCSI 做HTTP。

下面是一個更為靠普的推薦配置:

Dual Xeon 3.x + 4G RAM + SCSI 做MySQL+HTTP的單機伺服器

而下面這個也是更為廣泛的配置:

Dual Xeon 3.x + 2G RAM + SATA 做MySQL+HTTP的單機伺服器

對于這種情況需要用心優化了。

記住,當有更多預算時,首先考慮的是記憶體,其次是高速硬碟和RAID,最後才是CPU。

軟體的版本

軟體指作業系統、Apache、MySQL和PHP的版本。對于作業系統,我一直習慣使用RedHat系列,現在用的是32位的Red Hat

Enterprise Linux企業版,可能是因為家裡的開發PC裝的是免費的Fedora

Core。而目前流行的被認為最适合做Web伺服器的是CentOS,不過我沒有用過。

相對于OS的版本,核心的版本更為重要,建議随時更新到最新版本的核心。關于核心比較重要的事情是跟超線程CPU的相容。早期的超線程功能往往會被

禁掉,因為軟體不支援,而現在的核心是支援超線程技術的,是以確定核心的更新是很有必要的。(參考文檔:Hyper-Threading speeds

Linux)

對于Apache、MySQL和PHP,都屬于雙線版本。即同時維護兩個版本的産品線,我建議使用最新版本的Apache

2.0,因為Apache 2.0在HTTP的性能上做了很大的改進(Apache網站語),而MySQL根據自己的愛好,我使用MySQL

4.1系。注意如果你使用MySQL 3.x版,強烈建議你現在就更新到MySQL 4.1,你可以即刻看到網站速度提高。

對于PHP,我依然使用4.4系,因為現有的應用都是在4下面開發的,同時聽說很多更新到PHP5後的慘痛故事,我就不冒險了。說到PHP,不得不

抱怨幾句,因為PHP的發行版經常有一些匪夷所思的BUG,比如有一次我發現某個在開發PC上用的好好的函數在伺服器上突然用不了(伺服器自動搶鮮更新了

PHP),最後折騰1天得知PHP釋出新版本的小子忘了把那個函數打包進去了(非常常用的函數apache_note)。

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:

Hello worldimg src="http://blog.penner.cn/hello.gif" />

當浏覽器将請求發送給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版本就成了這個樣

子:

Hello worldimg src="/hello.gif" />

(真實地圖檔位址會比這個複雜)這樣一來每次使用者通路僅會向本機伺服器的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外另一個可以顯著導緻網站速度提升的武器。

php