為什么站點訪問慢?請收好這份 Web 服務器性能提升的總結
優化思路淺析
要優化 Web 服務器的性能,我們先來看看 Web 服務器在 web 頁面處理上的步驟:
Web 瀏覽器向一個特定的服務器發出 Web 頁面請求; Web 服務器接收到 web 頁面請求后,尋找所請求的 web 頁面,并將所請求的 Web 頁面傳送給 Web 瀏覽器; Web 瀏覽器接收到所請求的 web 頁面內容,并將它顯示出來。
Web 服務器從磁盤中讀取靜態頁面內容的速度,也即時間; Web 服務器判定請求內容是靜態還是動態內容的時間; Web 服務器轉發請求給應用服務器的時間; 應用服務器處理(解釋)動態內容所需的時間; Web 服務器返回 Web 內容給瀏覽器的響應時間; Web 服務器接收來自瀏覽器請求的處理性能; Web 訪問請求數據在網絡上傳輸的時間:包括從瀏覽器到服務器,和從服務器到瀏覽器兩部分; 瀏覽器本地計算和渲染 Web 內容的時間,即接收內容后展現內容的時間。
Web 服務器執行安全策略檢查的時間,或者說性能; Web 服務器讀取日志文件、寫日志內容、關閉對日志文件訪問的時間,先讀后寫再關閉,這三步中的讀與寫又涉及到磁盤訪問性能因素; 同時與 Web 服務器連接會話的客戶端數量大小,即并發訪問量多大。
我們可以將上面一共 11 項影響因素抽像出來,那么就是:
Web 服務器磁盤性能; Web 服務器與應用服務器交互的性能; 應用服務器處理動態內容的性能,或者說動態內容應用處理性能; 客戶端與 Web 服務器的連接速度,即網絡傳輸性能; Web 瀏覽器解釋和渲染 Web 內容的性能; Web 訪問并發性能。
反映到我們進行性能優化,可以入手的角度就有:
性能優化實踐
1. 站點簡介
一個社區論壇站點,采用 Discuz! 論壇程序構建,該程序采用主流的 PHP + MySQL 組成。
網站目前有近 5 萬注冊用戶,絕大多數是國內的用戶,活躍用戶數在一半左右,每天平均 PV 在 15~20 萬,獨立訪問 IP 數在 8000 左右。
2. Web 服務器性能優化需求
網站現部署在國外的服務器,租用虛擬主機來運營,因為訪問量比較大,所以經常會收到虛擬主機服務商的流量很大的通知,要求控制下訪問量。
另外,虛擬主機的服務器在美國,沒有在國內租用虛擬主機的原因是國內網站在備案方面非常繁瑣,在網站一開始運營時數據量和訪問量都比較小,所以對性能要求不高,數據量小,所以服務器在查詢處理數據時速度比較快,也讓人感覺訪問速度不慢,現在隨著數據量和訪問量的不斷上升,訪問速度已明顯下降,到了需要改善訪問性能的時候了。
基于目前該社區網站的情況,提出的優化需求是,國內訪問速度需要提升一倍,目前首頁加載時間需要 40 秒左右,希望優化后能在 20 秒以內將首頁加載完成。
另外提出網站數據能夠每天自動備份一次,備份數據保留一個月的,以便隨時恢復。
上述兩點需求,其中第一條才是性能優化需求,第二條是額外的需求了。
3. 性能優化方案
根據其網站的現狀和優化需求,結合自己的經驗,加上谷歌的搜索,同時與網站主不斷確認溝通,最終得到以下性能優化方案:
由虛擬主機部署改為獨立服務器部署
虛擬主機受限比較多,無法自己自定義配置 Web 服務器,無法配置 PHP 動態緩存,而且獨立服務器可以獨享內存、處理器資源,不再受虛擬主機商對每個虛擬主機用戶的內存和處理器資源占用限制。處理器資源和內存資源,對接受更多并發訪問有直接性能提升效果。
由 Windows 操作系統改為 Linux 操作系統
Web 服務器采用 Nginx,而不使用 Apache
對 PHP 查詢進行動態緩存,使用 eAccelerator 這個加速器
具體地,我們計劃對 eAccelerator 進行以下設置優化:
緩存使用物理內存來進行,不使用磁盤來緩存。我們知道內存的讀寫性能是硬盤的 N 倍,所以在內存資源可以安排情況下,強烈建議使用內存來保存 eAccelerator 的緩存內容。 緩存大小設置為 32MB,這個值是操作系統默認支持最大的緩存容量。雖然可以通過修改配置文件來加大這個值,但我們覺得沒有必要,所以就放棄了。
Nginx 性能優化
選用了 Nginx,雖然它的性能很好,但我們仍然需要對它進行性能優化,在這個案例中,我們做了以下優化:
- 使用 8 個進程,每個進程大約需要 20M 內存消耗,這里一共使用了 150M 左右的內存。
- 充分使用主服務器的 CPU 內核:
四核,使用 CPU 粘性配置選項(worker_cpu_affinity),每核處理器分配兩個進程。
- 開啟 gzip 壓縮功能:
gzip 壓縮對 JS, CSS, XML 壓縮效果非常好,能壓縮一半,即減少一倍的傳輸時間;
對圖片文件,JPG 已經壓縮過的,它的壓縮性能要少一些。
- 圖片本地緩存 1 天:
網站上的圖片很多,通常一張圖片上傳后,不會頻繁的修改,只會頻繁的訪問,所以將圖片放在 Nginx 緩存里,可以減少服務器訪問加載次數,提升訪問速度。
- JS、CSS 文件本地緩存 7 天:
這兩種網頁文件,平時都不會去修改它,將它緩存起來,可以減少加載次數,提升訪問速度。
為什么這兩種文件不和圖片一起設置緩存有效期,是考慮了不同文件的修改頻率不一樣。
- Nginx 日志每天切割一次:
這個優化項能大大減小 Nginx 日志文件的大小,經過一周的查看,每天的日志文件是 50M 左右,如果不是每天切割,用月切割,那一個月的日志文件就是幾個 G,要 Web 服務器在內存里加載這么大的文件,系統本身內存不夠用,就自然會用到磁盤來緩存,這就影響性能。
每天 50M 左右,在內存上完全可以順利加載,這樣 Nginx 在處理訪問時,可以快速的保存訪問日志。
經過上述幾個優化項目,Nginx 這邊一共需要占用 200M 左右內存資源。
對 PHP CGI 進程性能進行優化
MySQL 數據庫性能優化
因此我們要選擇對讀表、查詢性能更好的存儲引擎,結合以前了解的知識,MySQL 缺省的 MyISAM 引擎就是被設計為適合處理讀頻率遠大于寫頻率的環境,查詢效率相當可觀,而且內存占用很少,這也與我們租用低內存配置的 VPS 相符。
內容分發網絡應用