硬件上的考慮
其實起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