幫助中心
技術(shù)運(yùn)維百科
將Web服務(wù)器應(yīng)用性能提高十倍的10條建議
2016-05-19 18:00:15
ModelId=2&Id=715">

舉一個(gè)例子,一份亞馬遜十年前做過的研究可以證明,甚至在那個(gè)時(shí)候,網(wǎng)頁(yè)加載時(shí)間每減少100毫秒,收入就會(huì)增加1%。另一個(gè)最近的研究特別強(qiáng)調(diào)一個(gè)事實(shí),即超過一半的網(wǎng)站擁有者在調(diào)查中承認(rèn)它們會(huì)因?yàn)閼?yīng)用程序性能的問題流失用戶。

如何提高web服務(wù)器性能

網(wǎng)站到底需要多快呢?對(duì)于頁(yè)面加載,每增加1秒鐘就有4%的用戶放棄使用。頂級(jí)的電子商務(wù)站點(diǎn)的頁(yè)面在第一次交互時(shí)可以做到1秒到3秒加載時(shí)間,而這是提供最高舒適度的速度。很明顯這種利害關(guān)系對(duì)于 web 應(yīng)用來說很高,而且在不斷的增加。

想要提高效率很簡(jiǎn)單,但是看到實(shí)際結(jié)果很難。為了在你的探索之旅上幫助到你,這篇文章會(huì)給你提供10條最高可以提升10倍網(wǎng)站性能的建議。這是一系列介紹提高應(yīng)用程序性能的第一篇文章,包括充分測(cè)試的優(yōu)化技術(shù)和一點(diǎn) NGINX 的幫助。這個(gè)系列也給出了潛在的提高安全性的幫助。

Tip #1: 通過反向代理來提高性能和增加安全性

如果你的 web 應(yīng)用運(yùn)行在單個(gè)機(jī)器上,那么這個(gè)辦法會(huì)明顯的提升性能:只需要換一個(gè)更快的機(jī)器,更好的處理器,更多的內(nèi)存,更快的磁盤陣列,等等。然后新機(jī)器就可以更快 的運(yùn)行你的 WordPress 服務(wù)器, Node.js 程序, Java 程序,以及其它程序。(如果你的程序要訪問數(shù)據(jù)庫(kù)服務(wù)器,那么解決方法依然很簡(jiǎn)單:添加兩個(gè)更快的機(jī)器,以及在兩臺(tái)電腦之間使用一個(gè)更快的鏈路。)

問題是,機(jī)器速度可能并不是問題。web 程序運(yùn)行慢經(jīng)常是因?yàn)橛?jì)算機(jī)一直在不同的任務(wù)之間切換:通過成千上萬的連接和用戶交互,從磁盤訪問文件,運(yùn)行代碼,等等。應(yīng)用服務(wù)器可能會(huì)抖動(dòng) thrashing-比如說內(nèi)存不足、將內(nèi)存數(shù)據(jù)交換到磁盤,以及有多個(gè)請(qǐng)求要等待某個(gè)任務(wù)完成,如磁盤I/O。

你可以采取一個(gè)完全不同的方案來替代升級(jí)硬件:添加一個(gè)反向代理服務(wù)器來分擔(dān)部分任務(wù)。反向代理服務(wù)器位于運(yùn)行應(yīng)用的機(jī)器的前端,是用來處理網(wǎng)絡(luò)流量的。只有反向代理服務(wù)器是直接連接到互聯(lián)網(wǎng)的;和應(yīng)用服務(wù)器的通訊都是通過一個(gè)快速的內(nèi)部網(wǎng)絡(luò)完成的。

使用反向代理服務(wù)器可以將應(yīng)用服務(wù)器從等待用戶與 web 程序交互解放出來,這樣應(yīng)用服務(wù)器就可以專注于為反向代理服務(wù)器構(gòu)建網(wǎng)頁(yè),讓其能夠傳輸?shù)交ヂ?lián)網(wǎng)上。而應(yīng)用服務(wù)器就不需要等待客戶端的響應(yīng),其運(yùn)行速度可以接近于優(yōu)化后的性能水平。

添加反向代理服務(wù)器還可以給你的 web 服務(wù)器安裝帶來靈活性。比如,一個(gè)某種類型的服務(wù)器已經(jīng)超載了,那么就可以輕松的添加另一個(gè)相同的服務(wù)器;如果某個(gè)機(jī)器宕機(jī)了,也可以很容易替代一個(gè)新的。

因?yàn)榉聪虼韼淼撵`活性,所以反向代理也是一些性能加速功能的必要前提,比如:

  1. 負(fù)載均衡 (參見 Tip #2) – 負(fù)載均衡運(yùn)行在反向代理服務(wù)器上,用來將流量均衡分配給一批應(yīng)用。有了合適的負(fù)載均衡,你就可以添加應(yīng)用服務(wù)器而根本不用修改應(yīng)用。
  2. 緩存靜態(tài)文件 (參見 Tip #3) – 直接讀取的文件,比如圖片或者客戶端代碼,可以保存在反向代理服務(wù)器,然后直接發(fā)給客戶端,這樣就可以提高速度、分擔(dān)應(yīng)用服務(wù)器的負(fù)載,可以讓應(yīng)用運(yùn)行的更快。
  3. 網(wǎng)站安全反向代理服務(wù)器可以提高網(wǎng)站安全性,以及快速的發(fā)現(xiàn)和響應(yīng)攻擊,保證應(yīng)用服務(wù)器處于被保護(hù)狀態(tài)。如何提高web服務(wù)器性能

NGINX 軟件為用作反向代理服務(wù)器而專門設(shè)計(jì),也包含了上述的多種功能。NGINX 使用事件驅(qū)動(dòng)的方式處理請(qǐng)求,這會(huì)比傳統(tǒng)的服務(wù)器更加有效率。NGINX plus 添加了更多高級(jí)的反向代理特性,比如應(yīng)用的健康度檢查,專門用來處理請(qǐng)求路由、高級(jí)緩沖和相關(guān)支持。

NGINX Worker Process helps increase application performance

Tip #2: 添加負(fù)載平衡

添加一個(gè)負(fù)載均衡服務(wù)器 是一個(gè)相當(dāng)簡(jiǎn)單的用來提高性能和網(wǎng)站安全性的的方法。與其將核心 Web 服務(wù)器變得越來越大和越來越強(qiáng),不如使用負(fù)載均衡將流量分配到多個(gè)服務(wù)器。即使程序?qū)懙牟缓茫蛘咴跀U(kuò)容方面有困難,僅是使用負(fù)載均衡服務(wù)器就可以很好的提高用戶體驗(yàn)。

負(fù)載均衡服務(wù)器首先是一個(gè)反向代理服務(wù)器(參見Tip #1)——它接受來自互聯(lián)網(wǎng)的流量,然后轉(zhuǎn)發(fā)請(qǐng)求給另一個(gè)服務(wù)器。特別是負(fù)載均衡服務(wù)器支持兩個(gè)或多個(gè)應(yīng)用服務(wù)器,使用分配算法將請(qǐng)求轉(zhuǎn)發(fā)給不同服務(wù)器。 最簡(jiǎn)單的負(fù)載均衡方法是輪轉(zhuǎn)法round robin,每個(gè)新的請(qǐng)求都會(huì)發(fā)給列表里的下一個(gè)服務(wù)器。其它的復(fù)制均衡方法包括將請(qǐng)求發(fā)給活動(dòng)連接最少的服務(wù)器。NGINX plus 擁有將特定用戶的會(huì)話分配給同一個(gè)服務(wù)器的能力。

負(fù)載均衡可以很好的提高性能是因?yàn)樗梢员苊饽硞€(gè)服務(wù)器過載而另一些服務(wù)器卻沒有需要處理的流量。它也可以簡(jiǎn)單的擴(kuò)展服務(wù)器規(guī)模,因?yàn)槟憧梢蕴砑佣鄠€(gè)價(jià)格相對(duì)便宜的服務(wù)器并且保證它們被充分利用了。

可以進(jìn)行負(fù)載均衡的協(xié)議包括 HTTP、HTTPS、SPDY、HTTP/2、WebSocket、FastCGI、SCGI、uwsgi、 memcached 等,以及幾種其它的應(yīng)用類型,包括基于 TCP 的應(yīng)用和其它的第4層協(xié)議的程序。分析你的 web 應(yīng)用來決定你要使用哪些以及哪些地方性能不足。

相同的服務(wù)器或服務(wù)器群可以被用來進(jìn)行負(fù)載均衡,也可以用來處理其它的任務(wù),如 SSL 末端服務(wù)器,支持客戶端的 HTTP/1.x 和 HTTP/2 請(qǐng)求,以及緩存靜態(tài)文件。

Tip #3: 緩存靜態(tài)和動(dòng)態(tài)的內(nèi)容

緩存可以通過加速內(nèi)容的傳輸速度來提高 web 應(yīng)用的性能。它可以采用以下幾種策略:當(dāng)需要的時(shí)候預(yù)處理要傳輸?shù)膬?nèi)容,保存數(shù)據(jù)到速度更快的設(shè)備,把數(shù)據(jù)存儲(chǔ)在距離客戶端更近的位置,或者將這幾種方法結(jié)合起來使用。

有兩種不同類型數(shù)據(jù)的緩存:

  1. 靜態(tài)內(nèi)容緩存。不經(jīng)常變化的文件,比如圖像(JPEG、PNG) 和代碼(CSS,JavaScript),可以保存在外圍服務(wù)器上,這樣就可以快速的從內(nèi)存和磁盤上提取。
  2. 動(dòng)態(tài)內(nèi)容緩存。很多 web 應(yīng)用會(huì)針對(duì)每次網(wǎng)頁(yè)請(qǐng)求生成一個(gè)新的 HTML 頁(yè)面。在短時(shí)間內(nèi)簡(jiǎn)單的緩存生成的 HTML 內(nèi)容,就可以很好的減少要生成的內(nèi)容的數(shù)量,而且這些頁(yè)面足夠新,可以滿足你的需要。

舉個(gè)例子,如果一個(gè)頁(yè)面每秒會(huì)被瀏覽10次,你將它緩存 1 秒,90%請(qǐng)求的頁(yè)面都會(huì)直接從緩存提取。如果你分開緩存靜態(tài)內(nèi)容,甚至新生成的頁(yè)面可能都是由這些緩存構(gòu)成的。

下面由是 web 應(yīng)用發(fā)明的三種主要的緩存技術(shù):

  1. 縮短數(shù)據(jù)與用戶的網(wǎng)絡(luò)距離。把一份內(nèi)容的拷貝放的離用戶更近的節(jié)點(diǎn)來減少傳輸時(shí)間。
  2. 提高內(nèi)容服務(wù)器的速度。內(nèi)容可以保存在一個(gè)更快的服務(wù)器上來減少提取文件的時(shí)間。
  3. 從過載服務(wù)器上移走數(shù)據(jù)。機(jī)器經(jīng)常因?yàn)橐瓿赡承┢渌娜蝿?wù)而造成某個(gè)任務(wù)的執(zhí)行速度比測(cè)試結(jié)果要差。將數(shù)據(jù)緩存在不同的機(jī)器上可以提高緩存資源和非緩存資源的性能,而這是因?yàn)橹鳈C(jī)沒有被過度使用。

對(duì) web 應(yīng)用的緩存機(jī)制可以在 web 應(yīng)用服務(wù)器內(nèi)部實(shí)現(xiàn)。首先,緩存動(dòng)態(tài)內(nèi)容是用來減少應(yīng)用服務(wù)器加載動(dòng)態(tài)內(nèi)容的時(shí)間。其次,緩存靜態(tài)內(nèi)容(包括動(dòng)態(tài)內(nèi)容的臨時(shí)拷貝)是為了更進(jìn)一步的分擔(dān)應(yīng) 用服務(wù)器的負(fù)載。而且緩存之后會(huì)從應(yīng)用服務(wù)器轉(zhuǎn)移到對(duì)用戶而言更快、更近的機(jī)器,從而減少應(yīng)用服務(wù)器的壓力,減少提取數(shù)據(jù)和傳輸數(shù)據(jù)的時(shí)間。

改進(jìn)過的緩存方案可以極大的提高應(yīng)用的速度。對(duì)于大多數(shù)網(wǎng)頁(yè)來說,靜態(tài)數(shù)據(jù),比如大圖像文件,構(gòu)成了超過一半的內(nèi)容。如果沒有緩存,那么這可能會(huì)花費(fèi)幾秒的時(shí)間來提取和傳輸這類數(shù)據(jù),但是采用了緩存之后不到1秒就可以完成。

舉一個(gè)在實(shí)際中緩存是如何使用的例子, NGINX 和 NGINX Plus 使用了兩條指令來設(shè)置緩存機(jī)制:proxy_cache_pathproxy_cache。你可以指定緩存的位置和大小、文件在緩存中保存的最長(zhǎng)時(shí)間和其它一些參數(shù)。使用第三條(而且是相當(dāng)受歡迎的一條)指令 proxy_cache_use_stale,如果提供新鮮內(nèi)容的服務(wù)器忙碌或者掛掉了,你甚至可以讓緩存提供較舊的內(nèi)容,這樣客戶端就不會(huì)一無所得。從用戶的角度來看這可以很好的提高你的網(wǎng)站或者應(yīng)用的可用時(shí)間。

NGINX plus 有個(gè)高級(jí)緩存特性,包括對(duì)緩存清除的支持和在儀表盤上顯示緩存狀態(tài)信息。

要想獲得更多關(guān)于 NGINX 的緩存機(jī)制的信息可以瀏覽 NGINX Plus 管理員指南中的《參考文檔》《NGINX 內(nèi)容緩存》。

注意:緩存機(jī)制分布于應(yīng)用開發(fā)者、投資決策者以及實(shí)際的系統(tǒng)運(yùn)維人員之間。本文提到的一些復(fù)雜的緩存機(jī)制從 DevOps 的角度來看很具有價(jià)值,即對(duì)集應(yīng)用開發(fā)者、架構(gòu)師以及運(yùn)維操作人員的功能為一體的工程師來說可以滿足它們對(duì)站點(diǎn)功能性、響應(yīng)時(shí)間、安全性和商業(yè)結(jié)果(如完 成的交易數(shù))等需要。

如何提高web服務(wù)器性能

新客優(yōu)惠
特價(jià) 酷睿i3系列
性價(jià)比熱銷推薦,年銷量第一
1180/月起
USA-IDC為您提供免備案服務(wù)器 0元試用
立即聯(lián)系在線客服,即可申請(qǐng)免費(fèi)產(chǎn)品試用服務(wù)