Web服務(wù)器站點訪問慢該怎么提升
Web服務(wù)器站點訪問慢該怎么提升,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
要優(yōu)化 Web 服務(wù)器的性能,我們先來看看 Web 服務(wù)器在 web 頁面處理上的步驟:
- Web 瀏覽器向一個特定的服務(wù)器發(fā)出 Web 頁面請求;
- Web 服務(wù)器接收到 web 頁面請求后,尋找所請求的 web 頁面,并將所請求的 Web 頁面?zhèn)魉徒o Web 瀏覽器;
- Web 瀏覽器接收到所請求的 web 頁面內(nèi)容,并將它顯示出來。
上面三個步驟都關(guān)系 Web 服務(wù)器,但實際 Web 服務(wù)器性能相關(guān)最大的是在第 2 步,這里 Web 服務(wù)器需要尋找來自瀏覽器所請求的 Web 頁面內(nèi)容。我們知道,Web 頁面內(nèi)容有靜態(tài)的,也有動態(tài)的,靜態(tài)的內(nèi)容,web 服務(wù)器可以直接將結(jié)果發(fā)回給瀏覽器,對于動態(tài)內(nèi)容,則通常需要交給應(yīng)用服務(wù)器先處理,由應(yīng)用服務(wù)器返回結(jié)果。當然,也有 Web 服務(wù)器本身可以處理動態(tài)內(nèi)容的,例如 IIS 就可以自已解釋處理 ASP, ASP.NET 這兩種微軟的動態(tài)網(wǎng)頁腳本語言。從上面簡要的分析里,我們大致可以得到這樣的結(jié)論,影響 Web 頁面訪問的影響因素會有這幾個:- Web 服務(wù)器從磁盤中讀取靜態(tài)頁面內(nèi)容的速度,也即時間;
- Web 服務(wù)器判定請求內(nèi)容是靜態(tài)還是動態(tài)內(nèi)容的時間;
- Web 服務(wù)器轉(zhuǎn)發(fā)請求給應(yīng)用服務(wù)器的時間;
- 應(yīng)用服務(wù)器處理(解釋)動態(tài)內(nèi)容所需的時間;
- Web 服務(wù)器返回 Web 內(nèi)容給瀏覽器的響應(yīng)時間;
- Web 服務(wù)器接收來自瀏覽器請求的處理性能;
- Web 訪問請求數(shù)據(jù)在網(wǎng)絡(luò)上傳輸?shù)臅r間:包括從瀏覽器到服務(wù)器,和從服務(wù)器到瀏覽器兩部分;
- 瀏覽器本地計算和渲染 Web 內(nèi)容的時間,即接收內(nèi)容后展現(xiàn)內(nèi)容的時間。
上面 8 項很容易理解,也很直接,其實還有以下幾項也是關(guān)乎 Web 頁面訪問速度體驗的因素,你可以思考下是否如此?或者說是否會影響到頁面訪問性能。- Web 服務(wù)器執(zhí)行安全策略檢查的時間,或者說性能;
- Web 服務(wù)器讀取日志文件、寫日志內(nèi)容、關(guān)閉對日志文件訪問的時間,先讀后寫再關(guān)閉,這三步中的讀與寫又涉及到磁盤訪問性能因素;
- 同時與 Web 服務(wù)器連接會話的客戶端數(shù)量大小,即并發(fā)訪問量多大。
我們可以將上面一共 11 項影響因素抽像出來,那么就是:
- Web 服務(wù)器與應(yīng)用服務(wù)器交互的性能;
- 應(yīng)用服務(wù)器處理動態(tài)內(nèi)容的性能,或者說動態(tài)內(nèi)容應(yīng)用處理性能;
- 客戶端與 Web 服務(wù)器的連接速度,即網(wǎng)絡(luò)傳輸性能;
- Web 瀏覽器解釋和渲染 Web 內(nèi)容的性能;
反映到我們進行性能優(yōu)化,可以入手的角度就有:
- 增加帶寬,包括服務(wù)器和客戶端兩邊的 Internet 連接帶寬;
- 盡可能多地使用靜態(tài)內(nèi)容,這樣 Web 服務(wù)器就可以無需請求應(yīng)用服務(wù)器,直接將 Web 內(nèi)容發(fā)給瀏覽器端,這里可以入手的方案又有:
- 多臺服務(wù)器負載均衡同時處理大量的并發(fā)訪問;
- 提升服務(wù)器磁盤訪問性能,也即通常所說的 I/O 性能;
- 減少網(wǎng)頁中的 HTTP 請求數(shù);
- 合理部署服務(wù)器,在離客戶端更近的地方部署服務(wù)器,已經(jīng)證明可以明顯地提升訪問性能。
性能優(yōu)化實踐
經(jīng)過前面小節(jié)的簡要分析,我相信你對優(yōu)化 Web 服務(wù)器有一定的思路了,你可以從硬件層面、軟件層面、Web 代碼三個層面去優(yōu)化。下面我們結(jié)合一個具體的實例來實踐一回,本文所舉例是一個小型的 Web 站點,部分數(shù)據(jù)系假設(shè),如有類同,純屬巧合,僅起拋磚引玉之用。在實際工作中,如果碰到大站點,你可以參考此處的分析,修改優(yōu)化方案。1. 站點簡介
一個社區(qū)論壇站點,采用 Discuz! 論壇程序構(gòu)建,該程序采用主流的 PHP + MySQL 組成。
網(wǎng)站目前有近 5 萬注冊用戶,絕大多數(shù)是國內(nèi)的用戶,活躍用戶數(shù)在一半左右,每天平均 PV 在 15~20 萬,獨立訪問 IP 數(shù)在 8000 左右。
2. Web 服務(wù)器性能優(yōu)化需求
網(wǎng)站現(xiàn)部署在國外的服務(wù)器,租用虛擬主機來運營,因為訪問量比較大,所以經(jīng)常會收到虛擬主機服務(wù)商的流量很大的通知,要求控制下訪問量。
另外,虛擬主機的服務(wù)器在美國,沒有在國內(nèi)租用虛擬主機的原因是國內(nèi)網(wǎng)站在備案方面非常繁瑣,在網(wǎng)站一開始運營時數(shù)據(jù)量和訪問量都比較小,所以對性能要求不高,數(shù)據(jù)量小,所以服務(wù)器在查詢處理數(shù)據(jù)時速度比較快,也讓人感覺訪問速度不慢,現(xiàn)在隨著數(shù)據(jù)量和訪問量的不斷上升,訪問速度已明顯下降,到了需要改善訪問性能的時候了。
基于目前該社區(qū)網(wǎng)站的情況,提出的優(yōu)化需求是,國內(nèi)訪問速度需要提升一倍,目前首頁加載時間需要 40 秒左右,希望優(yōu)化后能在 20 秒以內(nèi)將首頁加載完成。
另外提出網(wǎng)站數(shù)據(jù)能夠每天自動備份一次,備份數(shù)據(jù)保留一個月的,以便隨時恢復(fù)。
上述兩點需求,其中第一條才是性能優(yōu)化需求,第二條是額外的需求了。
3. 性能優(yōu)化方案
根據(jù)其網(wǎng)站的現(xiàn)狀和優(yōu)化需求,結(jié)合自己的經(jīng)驗,加上谷歌的搜索,同時與網(wǎng)站主不斷確認溝通,最終得到以下性能優(yōu)化方案:
由虛擬主機部署改為獨立服務(wù)器部署
虛擬主機受限比較多,無法自己自定義配置 Web 服務(wù)器,無法配置 PHP 動態(tài)緩存,而且獨立服務(wù)器可以獨享內(nèi)存、處理器資源,不再受虛擬主機商對每個虛擬主機用戶的內(nèi)存和處理器資源占用限制。處理器資源和內(nèi)存資源,對接受更多并發(fā)訪問有直接性能提升效果。
由 Windows 操作系統(tǒng)改為 Linux 操作系統(tǒng)
網(wǎng)站使用的是 PHP + MySQL 程序,PHP 在 Windows 下的性能,受限于 IIS 需要通過 ISAPI 形式調(diào)用 PHP,所以性能不如 Linux 下 Apache 直接通過 PHP 模塊解釋 PHP,更不如 Nginx 與 PHP-FPM 的性能,既然使用了獨立服務(wù)器,操作系統(tǒng)也可以自己確定,Linux 系統(tǒng)我們選用了熟悉的 Ubuntu Linux Server 10.04(一年前還沒有 12.04),^-^。Web 服務(wù)器采用 Nginx,而不使用 Apache
選用 Nginx 而不用 Apache 的原因非常直接和干脆,因為站點里有很多靜態(tài)的附件文件,在處理靜態(tài)內(nèi)容上,Nginx 性能是 Apache 的差不多 10 倍。在 PHP 解釋和偽靜態(tài)規(guī)則方面,Apache 要比 Nginx 強,但這不影響我們放棄它,為緩解這一點,我們在后面對 PHP 進行了動態(tài)緩存。對 PHP 查詢進行動態(tài)緩存,使用 eAccelerator 這個加速器
PHP 加速器是一個為了提高 PHP 執(zhí)行效率,從而緩存起 PHP 的操作碼,這樣 PHP 后面執(zhí)行就不用解析轉(zhuǎn)換了,可以直接調(diào)用 PHP 操作碼,這樣速度上就提高了不少。eAccelerator 是一個開源 PHP 加速器,優(yōu)化和動態(tài)內(nèi)容緩存,提高了 PHP 腳本的緩存性能,使得 PHP 腳本在編譯的狀態(tài)下,對服務(wù)器的開銷幾乎完全消除。它還有對腳本起優(yōu)化作用,以加快其執(zhí)行效率。使得的 PHP 程序代碼執(zhí)效率能提高 1-10 倍,這個加速還是非常明顯的。具體地,我們計劃對 eAccelerator 進行以下設(shè)置優(yōu)化:
- 緩存使用物理內(nèi)存來進行,不使用磁盤來緩存。我們知道內(nèi)存的讀寫性能是硬盤的 N 倍,所以在內(nèi)存資源可以安排情況下,強烈建議使用內(nèi)存來保存 eAccelerator 的緩存內(nèi)容。
- 緩存大小設(shè)置為 32MB,這個值是操作系統(tǒng)默認支持最大的緩存容量。雖然可以通過修改配置文件來加大這個值,但我們覺得沒有必要,所以就放棄了。
Nginx 性能優(yōu)化
選用了 Nginx,雖然它的性能很好,但我們?nèi)匀恍枰獙λM行性能優(yōu)化,在這個案例中,我們做了以下優(yōu)化:
使用 8 個進程,每個進程大約需要 20M 內(nèi)存消耗,這里一共使用了 150M 左右的內(nèi)存。
充分使用主服務(wù)器的 CPU 內(nèi)核:
四核,使用 CPU 粘性配置選項(worker_cpu_affinity),每核處理器分配兩個進程。
開啟 gzip 壓縮功能:
gzip 壓縮對 JS, CSS, XML 壓縮效果非常好,能壓縮一半,即減少一倍的傳輸時間;
對圖片文件,JPG 已經(jīng)壓縮過的,它的壓縮性能要少一些。
圖片本地緩存 1 天:
網(wǎng)站上的圖片很多,通常一張圖片上傳后,不會頻繁的修改,只會頻繁的訪問,所以將圖片放在 Nginx 緩存里,可以減少服務(wù)器訪問加載次數(shù),提升訪問速度。
JS、CSS 文件本地緩存 7 天:
這兩種網(wǎng)頁文件,平時都不會去修改它,將它緩存起來,可以減少加載次數(shù),提升訪問速度。
為什么這兩種文件不和圖片一起設(shè)置緩存有效期,是考慮了不同文件的修改頻率不一樣。
Nginx 日志每天切割一次:
這個優(yōu)化項能大大減小 Nginx 日志文件的大小,經(jīng)過一周的查看,每天的日志文件是 50M 左右,如果不是每天切割,用月切割,那一個月的日志文件就是幾個 G,要 Web 服務(wù)器在內(nèi)存里加載這么大的文件,系統(tǒng)本身內(nèi)存不夠用,就自然會用到磁盤來緩存,這就影響性能。
每天 50M 左右,在內(nèi)存上完全可以順利加載,這樣 Nginx 在處理訪問時,可以快速的保存訪問日志。
經(jīng)過上述幾個優(yōu)化項目,Nginx 這邊一共需要占用 200M 左右內(nèi)存資源。
對 PHP CGI 進程性能進行優(yōu)化
Nginx 沒有 PHP 模塊,所以它對 PHP 的支持是通過 PHP-FPM 來實現(xiàn)的,PHP-FPM 是跑進程來處理并發(fā)請求,在這個案例中,我們配置了 20 個進程,每個進程差不多占用 20M 左右內(nèi)存資源,一共是 400M 左右。同時,PHP-FPM 與 Nginx 交互機制,選用 Linux Socket 模式而不是 TCP 協(xié)議端口,Socks 是系統(tǒng)級處理模式,socks 也就是一個文件連接,而 TCP 協(xié)議端口,需要經(jīng)過網(wǎng)絡(luò)協(xié)議處理,性能不如前者,所以我們選擇了前者。MySQL 數(shù)據(jù)庫性能優(yōu)化
因為網(wǎng)站主程序是選用他人開發(fā)的開源程序,所以對數(shù)據(jù)庫查詢的程序優(yōu)化我們無法處理,只能從 MySQL 本身尋找突破口。我們可以想像一下,對于論壇網(wǎng)站,通??促N、查貼的訪問量要遠大于創(chuàng)建貼子、回復(fù)貼子的訪問量,體現(xiàn)在 MySQL 數(shù)據(jù)庫上,就是讀表與查詢表數(shù)據(jù)的連接處理更多。因此我們要選擇對讀表、查詢性能更好的存儲引擎,結(jié)合以前了解的知識,MySQL 缺省的 MyISAM 引擎就是被設(shè)計為適合處理讀頻率遠大于寫頻率的環(huán)境,查詢效率相當可觀,而且內(nèi)存占用很少,這也與我們租用低內(nèi)存配置的 VPS 相符。
具體到 MySQL 配置參數(shù)的優(yōu)化上,受限于服務(wù)器上內(nèi)存資源本身有限,就直接采用缺省的中型環(huán)境配置文件。內(nèi)容分發(fā)網(wǎng)絡(luò)應(yīng)用
站點每天十多萬的訪問,上萬獨立 IP 訪問,查看先前的訪問統(tǒng)計,訪問來自國內(nèi)各個地區(qū),使用多種網(wǎng)絡(luò)連接訪問進來,為保證來自各網(wǎng)絡(luò)的用戶訪問速度,同時也減少對網(wǎng)站服務(wù)器的請求,我們采用了 CDN 來分發(fā)靜態(tài)內(nèi)容,這樣各地的用戶可以就近訪問到已緩存在 CDN 上的文件,CDN 服務(wù)商會在靜態(tài)內(nèi)容第一次訪問時緩存到他們?nèi)珖鞯氐姆?wù)器上,當?shù)诙卧L問時,用戶實際是沒有連接到網(wǎng)站服務(wù)器上獲取文件的,而是直接從 CDN 服務(wù)器上獲取,可以明顯的提升網(wǎng)站性能。看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。