10倍提升應(yīng)用性能的10個建議

本文轉(zhuǎn)載自:眾成翻譯
譯者:為之漫筆
鏈接:http://www.zcfy.cc/article/22
原文:https://www.nginx.com/blog/10-tips-for-10x-application-performance/

提升Web應(yīng)用的性能從未像今天這樣刻不容緩普监。在線經(jīng)濟(jì)活動的比例日益提高架专,就連發(fā)展中國家和地區(qū)的經(jīng)濟(jì)活動都已經(jīng)有5%以上在線進(jìn)行了(相關(guān)數(shù)據(jù)請參考本文后面的資源)。在這個超級鏈接、隨時在線的現(xiàn)代世界栏赴,用戶的期望也遠(yuǎn)非昔日可比。如果你的網(wǎng)站不能馬上響應(yīng),你的應(yīng)用不能立即運(yùn)行,用戶轉(zhuǎn)身就會投奔你的競爭對手胁澳。

亞馬遜大約10年前的一項(xiàng)研究表明,頁面加載時間減少1/10秒米者,能夠使其營收增長1%韭畸。另一項(xiàng)近期的調(diào)查也顯示,一多半受訪站點(diǎn)所有者提到因?yàn)樽约簯?yīng)用的性能不佳導(dǎo)致了收入減少或者用戶流失蔓搞。

一個網(wǎng)站到底多快才行胰丁?頁面加載每花1秒鐘,就有大約4%的用戶走掉喂分。排名最靠前的電商站點(diǎn)的首次交互時間為1至3秒锦庸,這個區(qū)間的轉(zhuǎn)換率最高。顯而易見蒲祈,Web應(yīng)用性能的重要性與日俱增甘萧。

提升性能其實(shí)不難,難的是怎么看到結(jié)果讳嘱。本文給出能夠提升大約10倍網(wǎng)站性能的10個建議供大家參考幔嗦。如此全面地涵蓋各種性能優(yōu)化技術(shù),這還是頭一回沥潭,但這些建議可能需要NGINX的一點(diǎn)支持。除了性能嬉挡,這些建議也會涉及提升安全性钝鸽。

建議一:使用反向代理服務(wù)器讓應(yīng)用更快更安全

如果你的Web應(yīng)用只跑在一臺機(jī)器上汇恤,那要提升其性能非常簡單:換一臺更快的,多配幾個處理器拔恰,多加幾條內(nèi)存因谎,磁盤陣列也要高速的。換了以后颜懊,這臺機(jī)器上跑的WordPress服務(wù)器财岔、Node.js或Java應(yīng)用速度都會加快。(要是應(yīng)用還會訪問另一臺數(shù)據(jù)庫服務(wù)器河爹,那也簡單:找兩臺更快的機(jī)器匠璧,用更快的網(wǎng)絡(luò)連起來就行了。)

麻煩在于咸这,機(jī)器速度并不是問題夷恍。很多時候Web應(yīng)用慢,是因?yàn)橐诟鞣N任務(wù)之間切換媳维,一會兒要處理數(shù)千個連接上的用戶請求酿雪,一會兒要向磁盤讀寫文件,一會兒又要運(yùn)行應(yīng)用的代碼侄刽,一會兒又要去干別的指黎。應(yīng)用服務(wù)器因此可能出現(xiàn)各種狀況,耗盡內(nèi)存州丹、交換文件袋励,或者讓很多請求等待一個硬盤I/O之類的任務(wù)。

除了升級硬件当叭,其實(shí)你還可以選擇另外一種完全不同的方法:加一臺反向代理服務(wù)器茬故,分擔(dān)上述一些任務(wù)。反向代理服務(wù)器位于運(yùn)行應(yīng)用的機(jī)器之前蚁鳖,負(fù)責(zé)處理來自外網(wǎng)的請求磺芭。反向代理服務(wù)器直接連到互聯(lián)網(wǎng),它與應(yīng)用服務(wù)器通信使用的是快速的內(nèi)部網(wǎng)絡(luò)醉箕。

反向代理服務(wù)器可以讓應(yīng)用服務(wù)器專注于構(gòu)建頁面钾腺,然后交給反向代理向外網(wǎng)發(fā)送,而不必理會用戶與應(yīng)用的交互讥裤。由于不必等待客戶端的響應(yīng)放棒,應(yīng)用服務(wù)器的運(yùn)行速度能達(dá)到接近最優(yōu)的水平。

增加反向代理服務(wù)器同時也可以為Web服務(wù)器增添靈活性己英。比如间螟,假設(shè)執(zhí)行某種任務(wù)的服務(wù)器過載了,那隨時可以再增加一臺同類服務(wù)器;而如果這臺服務(wù)器掛了厢破,替換它也很容易荣瑟。

鑒于這種靈活性,反向代理服務(wù)器往往也是其他性能優(yōu)化手段的先決條件摩泪,比如:

  • 負(fù)載均衡(參見“建議二”)笆焰,反向代理服務(wù)器上運(yùn)行負(fù)載均衡服務(wù),把流量平均分配給幾臺應(yīng)用服務(wù)器见坑。有了負(fù)載均衡嚷掠,添加應(yīng)用服務(wù)器根本不需要修改應(yīng)用。
  • 緩存靜態(tài)文件(參見“建議三”)荞驴,圖片或代碼之類的可以直接請求的文件不皆,都可以保存在反向代理服務(wù)器中,以便直接發(fā)給客戶端戴尸。這樣不僅可以更快地響應(yīng)請求粟焊,還能減輕應(yīng)用服務(wù)器的負(fù)擔(dān),加快其運(yùn)行速度孙蒙。
  • 保證站點(diǎn)安全项棠,可以配置反向代理服務(wù)器提升其安全級別,通過它監(jiān)控來快速識別和響應(yīng)攻擊挎峦,從而保存應(yīng)用服務(wù)器安全香追。

NGINX專門為使用反向代理服務(wù)器做了設(shè)計(jì),使其天然支持上述優(yōu)化坦胶。由于使用事件驅(qū)動的處理機(jī)制透典,NGINX比傳統(tǒng)服務(wù)器效率更高。NGINX Plus則增加了更高端的反向代理功能顿苇,如應(yīng)用體檢峭咒、特有的請求路由、高級緩存和售后支持纪岁。

傳統(tǒng)服務(wù)器與NGINX Worker的比較

建議二:增加負(fù)載均衡服務(wù)器

增加負(fù)載均衡服務(wù)器相對簡單凑队,但卻能顯著提升站點(diǎn)性能和安全性。通過它把流量分配給多個服務(wù)器幔翰,就可以不必升級Web服務(wù)器了漩氨。就算應(yīng)用本身寫得不太好,或者難以擴(kuò)展遗增,負(fù)載均衡都可以在不做其他改變的情況下提升用戶體驗(yàn)叫惊。

負(fù)載均衡服務(wù)器首先是一個反向代理服務(wù)器(參見“建議一”),負(fù)責(zé)把來自互聯(lián)網(wǎng)的請求轉(zhuǎn)發(fā)給其他服務(wù)器做修。這里關(guān)鍵在于負(fù)載均衡服務(wù)器可以支持兩臺以上的應(yīng)用服務(wù)器霍狰,使用一種選擇算法在不同的服務(wù)器間分配請求抡草。最簡單的負(fù)載均衡算法是循環(huán)調(diào)度,即把新請求依次轉(zhuǎn)發(fā)給可用服務(wù)器中的下一臺服務(wù)器蚓耽。其他算法還有把請求發(fā)給活動連接最少的服務(wù)器渠牲。NGINX Plus支持一種功能旋炒,就是把用戶會話保持在同一臺服務(wù)器上步悠,叫做會話保持。

負(fù)載均衡服務(wù)器可以避免一臺服務(wù)器過載而其他服務(wù)器過閑瘫镇,從而極大提升性能鼎兽。同時,有了它還可以讓W(xué)eb服務(wù)器擴(kuò)容更簡單铣除,因?yàn)榭梢赃x用比較便宜的服務(wù)器谚咬,同時保證物盡其用。

可以通過負(fù)載均衡調(diào)度的協(xié)議包括HTTP尚粘、HTTPS择卦、SPDY、HTTP/2郎嫁、WebSocket秉继、FastCGI、SCGI泽铛、uwsgi尚辑、memcached,以及其他一些應(yīng)用形式盔腔,包括基于TCP的應(yīng)用和其他第四層的協(xié)議杠茬。為此,首先要分析Web應(yīng)用弛随,看性能短板在哪里瓢喉,然后再確定使用哪一個。

同一臺服務(wù)器或用于負(fù)載均衡的服務(wù)器也可以承擔(dān)其他任務(wù)舀透,比如SSL終止栓票、視客戶端不同支持HTTP/1/x或HTTP/2、緩存靜態(tài)文件盐杂。

NGINX經(jīng)常被用來做負(fù)載均衡逗载,更多信息請參考我們以前發(fā)的介紹性文章有關(guān)配置的文章链烈、電子書和相關(guān)的在線視頻厉斟,當(dāng)然還有文檔。我們的商業(yè)版本NGINX Plus支持更多的負(fù)載均衡功能强衡,如基于服務(wù)器響應(yīng)時間路由負(fù)載和支持微軟NTLM協(xié)議的負(fù)載均衡擦秽。

建議三:緩存靜態(tài)及動態(tài)內(nèi)容

緩存能提升Web應(yīng)用性能,因?yàn)榭梢愿斓匕褍?nèi)容交付給客戶端。緩存的策略包括預(yù)處理內(nèi)容感挥、在較快的設(shè)備上存儲內(nèi)容缩搅、把內(nèi)容保存在靠近客戶端的地方,以及同時運(yùn)用這些策略触幼。

緩存有兩種硼瓣。

  • 靜態(tài)內(nèi)容緩存,不常變化的文件置谦,如圖片(JPEG堂鲤、PNG)和代碼(CSS、JavaScript)媒峡,可以保存在邊緣服務(wù)器中瘟栖,以便快速從內(nèi)容或磁盤中獲取。
  • 動態(tài)內(nèi)容緩存谅阿,很多Web應(yīng)用會為每個頁面請求生成全新的HTML半哟,把生成的每個HTML都緩存一小段時間,可能顯著減少需要生成的頁面總數(shù)签餐,同時又可以保證交付的內(nèi)容足夠新鮮寓涨。

假設(shè)一個頁面每秒被查看10次,而你緩存它1秒贱田,那么90%針對這個頁面的請求都將來自在緩存缅茉。如果你單獨(dú)緩存靜態(tài)內(nèi)容,那么即使全新生成的頁面男摧,很可能大部分都來自緩存的內(nèi)容蔬墩。

緩存Web應(yīng)用生成內(nèi)容的技術(shù)主要分三種。

  • 把內(nèi)容放到離用戶近的地方耗拓。離用戶近拇颅,傳輸時間少。
  • 把內(nèi)容放到較快的機(jī)器上乔询。機(jī)器快樟插,檢索速度快。
  • 把內(nèi)容從過度使用的機(jī)器中拿走竿刁。有時候機(jī)器會比在專注執(zhí)行特定任務(wù)時慢很多黄锤,那是因?yàn)樘嗳蝿?wù)讓它們分心。這時候把內(nèi)容拿到其他機(jī)器上食拜,不僅對緩存的內(nèi)容有好處鸵熟,對非緩存的內(nèi)容同樣有利,因?yàn)橥泄芩鼈兊闹鳈C(jī)的負(fù)擔(dān)減輕了负甸。

Web應(yīng)用的緩存可以在Web應(yīng)用服務(wù)器內(nèi)部或外部實(shí)現(xiàn)流强。首先痹届,考慮緩存動態(tài)內(nèi)容,以減輕應(yīng)用服務(wù)器的負(fù)載打月。其次队腐,緩存用于靜態(tài)內(nèi)容(包括那些動態(tài)生成內(nèi)容的臨時副本),進(jìn)一步減輕應(yīng)用服務(wù)器的負(fù)擔(dān)奏篙。然后柴淘,考慮把緩存轉(zhuǎn)移到其他更快或更靠近用戶的機(jī)器,給應(yīng)用服務(wù)器減負(fù)报破,縮短傳輸時間悠就。

用好緩存能顯著加快應(yīng)用的響應(yīng)速度千绪。對很多網(wǎng)頁來說充易,大圖片之類的靜態(tài)數(shù)據(jù),往往占據(jù)一半以上的內(nèi)容荸型。不用緩存盹靴,查詢和傳輸這類數(shù)據(jù)可能會花好幾秒鐘,而用緩存瑞妇,則可能只要花幾分之一秒稿静。

可以舉一個例子來說明怎么使用緩存,NGINX和NGINX Plus通過兩個指令來設(shè)置緩存proxy_cache_pathproxy_cache指定緩存的位置和大小辕狰、最長緩存時間以及其他參數(shù)改备。使用第三個(也是很受歡迎的)指令proxy_cache_use_stale,甚至可以告訴緩存在本來應(yīng)該提供新鮮內(nèi)容的服務(wù)器太忙或宕機(jī)時蔓倍,提供原來的舊文件悬钳,對客戶端來說,拿到內(nèi)容總比拿不到強(qiáng)偶翅。從用戶角度看默勾,這樣也可以樹立你的站點(diǎn)或應(yīng)用非常穩(wěn)定的形象。

NGINX Plus支持高級緩存功能聚谁,包括緩存凈化(caching purging)和通過控制板以可視化的形式展示緩存狀態(tài)母剥,實(shí)現(xiàn)實(shí)時監(jiān)控。

要了解NGINX中關(guān)于緩存的更多信息形导,可以看看參考文檔和NGINX Plus Admin Guide中的NGINX Content Caching环疼。

注意: 緩存涉及開發(fā)、決策和運(yùn)維朵耕,完善的緩存策略炫隶,比如本文提到的這些,能夠體現(xiàn)從DevOps角度考慮的價值憔披。也說是說等限,開發(fā)人員爸吮、架構(gòu)師、運(yùn)維人員此時攜手望门,共同保障一個網(wǎng)站的功能形娇、響應(yīng)時間、安全和業(yè)務(wù)目標(biāo)筹误。

建議四:壓縮數(shù)據(jù)

壓縮同樣能極大提升性能桐早。圖片、視頻厨剪、音樂等文件都有非常成熟和高效的壓縮標(biāo)準(zhǔn)(JPEG和PNG哄酝、MPEG-4、MP3)祷膳,任何一個標(biāo)準(zhǔn)都可以把文件大小縮小一個數(shù)量級甚至更多陶衅。

文本文件,包括HTML(純文本和HTML標(biāo)簽)直晨、CSS和JavaScript代碼搀军,經(jīng)常在不壓縮的情況下傳輸。壓縮這些數(shù)據(jù)對提升Web應(yīng)用的感知性能有時候特別明顯勇皇,尤其是移動用戶的網(wǎng)絡(luò)很慢又不穩(wěn)定的情況下罩句。

因?yàn)槲谋緮?shù)據(jù)通過對于頁面交互能夠起到必要的支援作用,而多媒體數(shù)據(jù)則更多是錦上添花的作用敛摘。聰明的內(nèi)容壓縮可以把HTML门烂、JavaScript、CSS等文本內(nèi)容的縮小30%以上兄淫,因此能夠相應(yīng)地減少加載時間屯远。

如果你使用SSL,壓縮又可以減少必須經(jīng)過SSL編碼的數(shù)據(jù)量拖叙,從而補(bǔ)償了壓縮這些數(shù)據(jù)的CPU時間氓润。

壓縮數(shù)據(jù)的方法非常多。比如薯鳍,建議六中關(guān)于HTTP/2的部分就描述了一個新穎的壓縮思路咖气,特別適合首部數(shù)據(jù)壓縮。還有一個關(guān)于文本壓縮的例子挖滤,就是可以在NGINX中開啟GZIP壓縮崩溪。預(yù)壓縮文本數(shù)據(jù)之后,可以使用gzip_static指令直接發(fā)送.gz文件斩松。

建議五:優(yōu)化SSL/TLS

越來越多的網(wǎng)站在使用Secure Sockets Layer(SSL)及后來的Transport Layer Security(TLS)協(xié)議伶唯。SSL/TLS通過加密從源服務(wù)器發(fā)送給用戶的數(shù)據(jù)來提升網(wǎng)站安全性。Google會提升使用SSL/TLS的網(wǎng)站的搜索引擎排名惧盹,將有力地推動這一進(jìn)程乳幸。

盡管采用率越來越高瞪讼,但SSL/TLS造成的性能損失也困擾著很多網(wǎng)站。SSL/TLS拖慢網(wǎng)站的原因有兩個粹断。

  1. 每次打開新連接的初次握手都必須創(chuàng)建加密密鑰符欠,而瀏覽器使用HTTP/1.x對每個服務(wù)器建立多個連接的方式進(jìn)一步加劇了這個問題。
  2. 服務(wù)器端加密數(shù)據(jù)和客戶端解密數(shù)據(jù)的操作同樣也是開銷瓶埋。

為了鼓勵人們使用SSL/TLS希柿,HTTP/2和SPDY(參見建議六)的作者將這兩個協(xié)議設(shè)計(jì)為只讓瀏覽器針對一次會話建立一個連接。這樣就把SSL導(dǎo)致性能降低的兩個主要原因之一消滅掉了养筒。然而曾撤,說到優(yōu)化SSL/TLS性能,還是有很多事情可做晕粪。

優(yōu)化SSL/TLS的方法因Web服務(wù)器而異挤悉。以NGINX為例,NGINX使用OpenSSL兵多,運(yùn)行于普通機(jī)器上尖啡,能夠提供接近定制機(jī)器的性能。NGINX SSL performance詳細(xì)介紹了如何將SSL/TLS加密和解密的開銷降至最低剩膘。

此外,這里還有一篇文章盆顾,介紹了很多種提升SSL/TLS性能的方法怠褐。簡單總結(jié)一下,涉及的技術(shù)主要有如下幾種您宪。

  • 會話緩存奈懒。使用ssl_session_cache指令開啟緩存,緩存每次SSL/STL連接時用到的參數(shù)宪巨。
  • 會話票或ID磷杏。把特定SSL/TLS會話的信息保存為一個會話票或ID,以便連接重用捏卓,而不必重新握手极祸。
  • OCSP封套。通過緩存SSL/TLS證書信息減少握手時間怠晴。

NGINX和NGINX Plus都可以來終止SSL/TLS遥金,即處理客戶端信息的加密和解密,同時與其他服務(wù)器保持明文通信蒜田。在NGINX或NGINX Plus中設(shè)置處理SSL/TLS終止可以采取這幾個步驟稿械。而對于在接受TCP連接的服務(wù)器上使用NGINX Plus而言,可以參考這里的設(shè)置步驟冲粤。

建議六:實(shí)現(xiàn)HTTP/2或SPDY

已經(jīng)使用SSL/TLS的站點(diǎn)美莫,如果再使用HTTP/2或SPDY則很可能提升性能页眯,因?yàn)橐粋€連接只要一次握手。尚未使用SSL/TLS、HTTP/2和SPDY的站點(diǎn)切換到SSL/TLS(通常會降低性能)惊科,從響應(yīng)速度方面看笙瑟,可能是一次倒退。

谷歌2012年開始SPDY項(xiàng)目忿族,致力于在HTTP/1.x之上實(shí)現(xiàn)更快的速度。HTTP/2則是IETF最近批準(zhǔn)的基于SPDY的標(biāo)準(zhǔn)蝌矛。SPDY得到了廣泛支持道批,但很快就將被HTTP/2取代。

SPDY和HTTP/2的關(guān)鍵在于只用一個連接入撒,而非多個連接隆豹。這一個連接是多路復(fù)用的,因此可以同時承載多個請求和響應(yīng)茅逮。

只維持一個連接璃赡,可以省掉多個連接所需的設(shè)置和管理消耗。而且一個連接對SSL特別重要献雅,因?yàn)榭梢詫SL/TLS建立安全連接所需的握手時間降至最少碉考。

SPDY協(xié)議要求使用SSL/TLS,HTTP/2并沒有正式要求挺身,但目前所有支持HTTP/2的瀏覽器都只會在啟用SSL/TLS的情況下才會使用它侯谁。換句話說,支持HTTP/2的瀏覽器只有在網(wǎng)站使用SSL且服務(wù)器接受HTTP/2流量的情況下才會使用HTTP/2章钾。否則墙贱,瀏覽器會基于HTTP/1.x通信。

實(shí)現(xiàn)了SPDY或HTTP/2之后贱傀,域名分片惨撇、資源合并、圖片精靈等之前針對HTTP的性能優(yōu)化措施就用不著了府寒。因此也可以簡化代碼和部署魁衙。關(guān)于HTTP/2會帶來哪些變化,可以參考我們的這個白皮書椰棘。

NGINX很早就開始支持SPDY纺棺,而且今天使用SPDY的大多數(shù)站點(diǎn)都在運(yùn)行NGINX。NGINX同樣率先支持了HTTP/2邪狞,2015年9月祷蝌,NGINX開源和NGINX Plus開始支持 HTTP/2。

隨著時間推移帆卓,NGINX希望大多數(shù)站點(diǎn)啟用SSL并遷移到HTTP/2巨朦。這樣不僅可以讓網(wǎng)站更安全米丘,而且隨著新的優(yōu)化技術(shù)不斷涌現(xiàn),也可以通過簡單的代碼實(shí)現(xiàn)更高的性能糊啡。

建議七:升級軟件

提升應(yīng)用性能的一個簡單的方法拄查,就是根據(jù)可靠性及性能選擇軟件。此外棚蓄,高質(zhì)量組件的開發(fā)者更可能不斷提升性能和修復(fù)問題堕扶,因此使用最新的穩(wěn)定版本是劃算。新發(fā)布的版本會得到開發(fā)者和用戶更多的關(guān)注梭依,同時也會利用新的編譯器優(yōu)化技術(shù)稍算,包括針對新硬件的調(diào)優(yōu)。

相對舊版本役拴,新發(fā)布的穩(wěn)定版本明顯性能更高糊探。堅(jiān)持升級,也可以保證在調(diào)優(yōu)河闰、問題修復(fù)和安全警報(bào)方面與時俱進(jìn)科平。

不升級軟件也會妨礙利用新能力。比如姜性,HTTP/2目前要求OpenSSL 1.0.1瞪慧。從2016年下半年開始,HTTP/2會要求OpenSSL 1.0.2污抬,該版本發(fā)布于2015年1月汞贸。

NGINX用戶可以從NGINX開源軟件的最新版本NGINX Plus開始,它們支持套接字共享印机、線程池(參見下文),而且都會持續(xù)優(yōu)化性能门驾。因此射赛,檢查一下自己的軟件,盡量把它們升級到最新的版本奶是。

建議八:調(diào)優(yōu)Linux

Linux是今天大多數(shù)Web服務(wù)器的底層操作系統(tǒng)楣责,作為一切基礎(chǔ)設(shè)施的基礎(chǔ),Linux對提升性能至關(guān)重要聂沙。默認(rèn)情況下秆麸,很多Linux系統(tǒng)都比較保守,僅以桌面辦公為需求及汉,以占用少量資源為調(diào)優(yōu)目標(biāo)沮趣。對于Web應(yīng)用而言,為達(dá)到性能最佳坷随,肯定需要重新調(diào)優(yōu)房铭。

Linux優(yōu)化因Web服務(wù)器而異驻龟。以NGINX為例,可以從以下幾方面考慮缸匪。

  • 存量隊(duì)列翁狐。如果發(fā)現(xiàn)有一些連接得不到處理,可以增大net.core.somaxconn凌蔬,即等待NGINX處理的最大連接數(shù)露懒。如果這個連接數(shù)限制過小,應(yīng)該可以看到錯誤消息砂心,可以逐步提高這個值懈词,直到錯誤消息不再出現(xiàn)。
  • 文件描述符计贰。NGINX對每個連接最多使用兩個文件描述符钦睡。如果系統(tǒng)服務(wù)于很多連接,可能需要增大sys.fs.file_max這個對描述符的系統(tǒng)級限制躁倒,以及nofile這個用戶文件描述符限制荞怒,以支持增大后的負(fù)載。
  • 臨時端口秧秉。在作為代理使用時褐桌,NGINX會為每個上游服務(wù)器創(chuàng)建臨時端口∠笥可以設(shè)置net.ipv4.ip_local_port_range荧嵌,增大端口值的范圍,以增加可用的端口量砾淌。此外啦撮,還可以減小net.ipv4.tcp_fin_timeout的值,它控制非活動端口釋放重用的等待時間汪厨,加快周轉(zhuǎn)赃春。

對NGINX而言,請參考NGINX性能調(diào)優(yōu)指南劫乱,了解如何不費(fèi)吹灰之力將你的Linux系統(tǒng)優(yōu)化為能夠支持更大的吞吐量织中。

建議九:調(diào)優(yōu)Web服務(wù)器

無論使用什么Web服務(wù)器,都需要針對應(yīng)用對其調(diào)優(yōu)衷戈。以下建議適用于任何Web服務(wù)器狭吼,但會給出只有NGINX的設(shè)置說明。

  • 訪問日志殖妇。不要每個請求的日志都馬上寫到磁盤刁笙,可以在內(nèi)存里做個緩存,然后批量定入。對NGINX而言采盒,將buffer=_size_參數(shù)添加到access_log指令旧乞,等內(nèi)存緩沖區(qū)寫滿后再把日志寫到磁盤。如果你添加了**flush=_time_**參數(shù)磅氨,那么緩沖區(qū)的內(nèi)容也會按照指定時間寫入磁盤尺栖。
  • 緩沖。緩沖用于在內(nèi)存里保存部分響應(yīng)烦租,直到緩沖區(qū)被填滿延赌,可以實(shí)現(xiàn)對客戶端更有效的響應(yīng)。無法寫入內(nèi)存的響應(yīng)會被寫到磁盤叉橱,從而降低性能挫以。在NGINX的緩沖啟用時,可以使用proxy_buffer_sizeproxy_buffers指令來管理它窃祝。
  • 客戶端活動連接掐松。活動連接可以減少時間消耗粪小,特別是在使用SSL/TLS的情況下大磺。對NGINX而言,可以針對客戶端提高keepalive_requests的數(shù)值探膊,默認(rèn)值為100杠愧;也可以增大keepalive_timeout的值,讓活動連接持續(xù)時間更長逞壁,從而讓后續(xù)請求得到更快響應(yīng)流济。
  • 上游活動連接。上游連接腌闯,即連接到應(yīng)用服務(wù)器绳瘟、數(shù)據(jù)庫服務(wù)器的連接,同樣可以從活動連接的設(shè)置中獲得好處姿骏。對上游連接來說稽荧,可以增加活動連接,也就是每個工作進(jìn)程可用的空閑活動連接的數(shù)量工腋。這樣可以增進(jìn)連接重用,減少重開連接畅卓。關(guān)于活動連接的更多信息擅腰,請參考這篇博客
  • 限制翁潘。限制客戶端使用的資源可以提升性能和安全性趁冈。對NGINX而言,limit_connlimit_conn_zone指令限制指定源的連接數(shù),而limit_rate限制帶寬渗勘。這些設(shè)置可以防止合法用戶“侵吞”資源沐绒,同時也有助于防止攻擊。limit_reqlimit_req_zone指令限制客戶端請求旺坠。對于到上游服務(wù)器的連接乔遮,可以在上游配置區(qū)的服務(wù)器指令中使用max_conns參數(shù),它限制對上游服務(wù)器的連接取刃,防止過載蹋肮。相關(guān)的隊(duì)列指令會創(chuàng)建一個隊(duì)列,在max_conns限制到達(dá)后將指定的請求數(shù)保存指定的時間璧疗。
  • 工作進(jìn)程坯辩。工作進(jìn)程負(fù)責(zé)處理請求。NGINX采用基于事件的模型和OS相關(guān)的機(jī)制有效地在工作進(jìn)程間分配請求崩侠。建議將worker_processes的值設(shè)置為每個CPU一個工作進(jìn)程漆魔。如果需要,大多數(shù)系統(tǒng)都支持提高worker_connections的值(默認(rèn)為512)却音「穆眨可以通過試驗(yàn)找到最適合你系統(tǒng)的這個值。
  • 套接字分片僧家。通常雀摘,一個套接字監(jiān)聽器向所有工作進(jìn)程分發(fā)新連接。套按字分片則為每個工作進(jìn)程都創(chuàng)建一個套接字監(jiān)聽器八拱,由內(nèi)核在套接字監(jiān)聽器可用時為其指定連接阵赠。這樣可以減少鎖爭用,提升多核系統(tǒng)上的性能肌稻。要啟用套接字分片清蚀,在listen指令中包含reuseport參數(shù)。
  • 線程池爹谭。一個費(fèi)時的操作會阻塞任何計(jì)算機(jī)進(jìn)程枷邪。對Web服務(wù)器軟件來說,磁盤訪問可能阻礙很多較快的操作诺凡,比如內(nèi)存中的計(jì)算和復(fù)制东揣。在使用線程池的情況下,慢操作會被指定給一組獨(dú)立的任務(wù)腹泌,而主處理循環(huán)會繼續(xù)運(yùn)行較快的操作嘶卧。磁盤操作完成后,結(jié)果會返回到主處理循環(huán)凉袱。在NGINX中芥吟,read()系統(tǒng)調(diào)用和sendfile()被轉(zhuǎn)載到了線程池侦铜。

提示 修改任何操作系統(tǒng)及周邊設(shè)備的設(shè)置時,每次只修改一項(xiàng)钟鸵,然后測試性能钉稍。如果該項(xiàng)修改導(dǎo)致了問題,或者并未提升性能棺耍,再改回去贡未。

關(guān)于調(diào)優(yōu)NGINX的更多內(nèi)容,請參考這篇博客烈掠。

建議十:監(jiān)控實(shí)時動態(tài)以發(fā)現(xiàn)問題和瓶頸

保存應(yīng)用高性能的關(guān)鍵是實(shí)時監(jiān)控應(yīng)用性能羞秤。必須實(shí)時監(jiān)控特定設(shè)備及相應(yīng)Web基礎(chǔ)設(shè)施中應(yīng)用的動態(tài)。

監(jiān)控站點(diǎn)活動多數(shù)情況下是被動的左敌,它只告訴你發(fā)生了什么瘾蛋,至于如何發(fā)現(xiàn)和解決問題,則是你自己的事情矫限。

監(jiān)控可以捕獲以下幾種問題:

  1. 服務(wù)器停機(jī)
  2. 服務(wù)器不穩(wěn)哺哼,漏處理連接
  3. 服務(wù)器出現(xiàn)大面積緩存失效
  4. 服務(wù)器發(fā)送的內(nèi)容不對

New Relic或Dynatrace等全局性的性能監(jiān)控工具,可以幫我們監(jiān)控遠(yuǎn)程加載頁面的時間叼风,而NGINX則可以幫你監(jiān)控應(yīng)用交付這一端取董。應(yīng)用的性能數(shù)據(jù)可以告訴你優(yōu)化手段什么時候真正給用戶帶去了不同的體驗(yàn),以及什么時候需要擴(kuò)容以滿足越來越多的流量无宿。

為了幫助用戶盡快發(fā)現(xiàn)問題茵汰,NGINX Plus增加了應(yīng)用程序體檢功能,會報(bào)告經(jīng)常重復(fù)出現(xiàn)的問題孽鸡。NGINX Plus還具備session draining特性蹂午,會在已有任務(wù)完成前阻止新連接,以及慢啟動容量彬碱,從而讓恢復(fù)的服務(wù)器在負(fù)載均衡集群中達(dá)到應(yīng)有的速度豆胸。使用得當(dāng)?shù)那闆r下,健康體檢會在問題顯著影響用戶體驗(yàn)之前幫你定位問題巷疼,而session draining和慢啟動則讓你替換服務(wù)器時不影響感知的性能和在線時間晚胡。這張圖展示了NGINX Plus內(nèi)置的實(shí)時活動監(jiān)控的控制板,涵蓋了服務(wù)器嚼沿、TCP連接和緩存估盘。

結(jié)論:10倍性能提升

性能提升因Web應(yīng)用不同會有巨大差異。實(shí)際的提升取決于預(yù)算骡尽、時間忿檩,以及現(xiàn)有實(shí)現(xiàn)的與理想性能的差距。那么怎么讓你的應(yīng)用獲得10倍的性能提升呢爆阶?

為了幫大家理解每項(xiàng)優(yōu)化建議的潛能,下面再針對之前的建議給出一些實(shí)施方針,希望大家各取所需辨图。

  • 反向代理服務(wù)器及負(fù)載均衡班套。沒有負(fù)載均衡或池負(fù)載均衡,可能導(dǎo)致極低的性能故河。添加一個反向代理服務(wù)器吱韭,比如NGINX,可以減少Web應(yīng)用在內(nèi)存和磁盤之間的往返鱼的。負(fù)載均衡可以把任務(wù)從過載的服務(wù)器轉(zhuǎn)移到空閑的服務(wù)器理盆,也便于擴(kuò)展。這些改變能極大地提升性能凑阶,與原有的部署方式最差的時候相比猿规,10倍性能提升是很輕松的事,即使不到10倍那也在總體上有了質(zhì)的飛躍宙橱。
  • 緩存動態(tài)和靜態(tài)內(nèi)容姨俩。如果你的Web服務(wù)器同時又充當(dāng)了應(yīng)用服務(wù)器,那么通過緩存動態(tài)內(nèi)容就可以達(dá)到高峰期10倍的性能提升师郑。緩存靜態(tài)內(nèi)容也可以有幾倍的性能提升环葵。
  • 壓縮數(shù)據(jù)。使用JPEG宝冕、PNG张遭、MPEG-4以及MP3等壓縮格式能顯著提升性能。如果這些手段都用上了地梨,那么壓縮的文本數(shù)據(jù)(代碼及HTML)可以將初始頁面加載時間提升兩倍菊卷。
  • 優(yōu)化SSL/TLS。安全握手對性能有很大影響湿刽,因此對其進(jìn)行優(yōu)化可以讓初次響應(yīng)加快兩倍的烁,對于文本內(nèi)容較多的網(wǎng)站尤其如此。優(yōu)化SSL/TLS下的媒體文件帶來的性能提升很小诈闺。
  • 實(shí)施HTTP/2和SPDY渴庆。在使用SSL/TLS的情況下,這兩個協(xié)議有可能提升網(wǎng)站的整體性能雅镊。
  • 調(diào)優(yōu)Linux和Web服務(wù)器襟雷。使用優(yōu)化的緩沖策略、使用活動連接仁烹,將耗時的任務(wù)轉(zhuǎn)載至獨(dú)立的線程池耸弄,可以顯著提升性能。比如線程池可以將磁盤操作密集性任務(wù)的性能提升至少一個數(shù)量級卓缰。

希望大家自己多嘗試以上技術(shù)计呈,也希望大家分享自己在性能改進(jìn)方面的心得砰诵。如果有好的想法和實(shí)現(xiàn)方案,歡迎留言捌显。

參考資源與網(wǎng)絡(luò)數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茁彭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扶歪,更是在濱河造成了極大的恐慌理肺,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件善镰,死亡現(xiàn)場離奇詭異妹萨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)炫欺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門乎完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竣稽,你說我怎么就攤上這事囱怕。” “怎么了毫别?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵娃弓,是天一觀的道長。 經(jīng)常有香客問我岛宦,道長台丛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任砾肺,我火速辦了婚禮挽霉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘变汪。我一直安慰自己侠坎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布裙盾。 她就那樣靜靜地躺著实胸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪番官。 梳的紋絲不亂的頭發(fā)上庐完,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音徘熔,去河邊找鬼门躯。 笑死,一個胖子當(dāng)著我的面吹牛酷师,可吹牛的內(nèi)容都是我干的讶凉。 我是一名探鬼主播染乌,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缀遍!你這毒婦竟也來了慕匠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤域醇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蓉媳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體譬挚,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年酪呻,在試婚紗的時候發(fā)現(xiàn)自己被綠了减宣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡玩荠,死狀恐怖漆腌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阶冈,我是刑警寧澤闷尿,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站女坑,受9級特大地震影響填具,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匆骗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一劳景、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碉就,春花似錦盟广、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骏庸,卻和暖如春毛甲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背具被。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工玻募, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人一姿。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓七咧,卻偏偏與公主長得像跃惫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子艾栋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容