如何讓你的Nginx 提升10倍性能?

作者:為之漫筆
來源:www.zcfy.cc/article/10-tips-for-10x-application-performance-nginx-22.html
原文:https://www.nginx.com/blog/10-tips-for-10x-application-performance/

升Web應(yīng)用的性能從未像今天這樣刻不容緩吩翻。

在線經(jīng)濟活動的比例日益提高,就連發(fā)展中國家和地區(qū)的經(jīng)濟活動都已經(jīng)有5%以上在線進行了(相關(guān)數(shù)據(jù)請參考本文后面的資源)。在這個超級鏈接萄涯、隨時在線的現(xiàn)代世界晒奕,用戶的期望也遠非昔日可比闻书。如果你的網(wǎng)站不能馬上響應(yīng),你的應(yīng)用不能立即運行吴汪,用戶轉(zhuǎn)身就會投奔你的競爭對手惠窄。

亞馬遜大約10年前的一項研究表明,頁面加載時間減少1/10秒漾橙,能夠使其營收增長1%杆融。另一項近期的調(diào)查也顯示,一多半受訪站點所有者提到因為自己應(yīng)用的性能不佳導(dǎo)致了收入減少或者用戶流失霜运。

一個網(wǎng)站到底多快才行脾歇?頁面加載每花1秒鐘,就有大約4%的用戶走掉淘捡。排名最靠前的電商站點的首次交互時間為1至3秒藕各,這個區(qū)間的轉(zhuǎn)換率最高。顯而易見焦除,Web應(yīng)用性能的重要性與日俱增激况。

提升性能其實不難,難的是怎么看到結(jié)果膘魄。本文給出能夠提升大約10倍網(wǎng)站性能的10個建議供大家參考乌逐。如此全面地涵蓋各種性能優(yōu)化技術(shù),這還是頭一回创葡,但這些建議可能需要NGINX的一點支持浙踢。除了性能,這些建議也會涉及提升安全性灿渴。

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

image

果你的Web應(yīng)用只跑在一臺機器上洛波,那要提升其性能非常簡單:換一臺更快的胰舆,多配幾個處理器,多加幾條內(nèi)存蹬挤,磁盤陣列也要高速的缚窿。換了以后,這臺機器上跑的WordPress服務(wù)器闻伶、Node.js或Java應(yīng)用速度都會加快滨攻。(要是應(yīng)用還會訪問另一臺數(shù)據(jù)庫服務(wù)器,那也簡單:找兩臺更快的機器蓝翰,用更快的網(wǎng)絡(luò)連起來就行了)

麻煩在于光绕,機器速度并不是問題。很多時候Web應(yīng)用慢畜份,是因為要在各種任務(wù)之間切換诞帐,一會兒要處理數(shù)千個連接上的用戶請求,一會兒要向磁盤讀寫文件爆雹,一會兒又要運行應(yīng)用的代碼停蕉,一會兒又要去干別的。應(yīng)用服務(wù)器因此可能出現(xiàn)各種狀況钙态,耗盡內(nèi)存慧起、交換文件,或者讓很多請求等待一個硬盤I/O之類的任務(wù)册倒。

除了升級硬件蚓挤,其實你還可以選擇另外一種完全不同的方法:加一臺反向代理服務(wù)器,分擔(dān)上述一些任務(wù)驻子。反向代理服務(wù)器位于運行應(yīng)用的機器之前灿意,負責(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ōu)的水平犹褒。

增加反向代理服務(wù)器同時也可以為Web服務(wù)器增添靈活性兄纺。比如,假設(shè)執(zhí)行某種任務(wù)的服務(wù)器過載了化漆,那隨時可以再增加一臺同類服務(wù)器;而如果這臺服務(wù)器掛了钦奋,替換它也很容易座云。

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

  • 負載均衡(參見“建議二”)朦拖,反向代理服務(wù)器上運行負載均衡服務(wù)圃阳,把流量平均分配給幾臺應(yīng)用服務(wù)器。有了負載均衡璧帝,添加應(yīng)用服務(wù)器根本不需要修改應(yīng)用捍岳。
  • 緩存靜態(tài)文件(參見“建議三”),圖片或代碼之類的可以直接請求的文件睬隶,都可以保存在反向代理服務(wù)器中锣夹,以便直接發(fā)給客戶端。這樣不僅可以更快地響應(yīng)請求苏潜,還能減輕應(yīng)用服務(wù)器的負擔(dān)银萍,加快其運行速度。
  • 保證站點安全恤左,可以配置反向代理服務(wù)器提升其安全級別贴唇,通過它監(jiān)控來快速識別和響應(yīng)攻擊,從而保存應(yīng)用服務(wù)器安全飞袋。

NGINX專門為使用反向代理服務(wù)器做了設(shè)計戳气,使其天然支持上述優(yōu)化。由于使用事件驅(qū)動的處理機制巧鸭,NGINX比傳統(tǒng)服務(wù)器效率更高瓶您。NGINX Plus則增加了更高端的反向代理功能,如應(yīng)用體檢蹄皱、特有的請求路由览闰、高級緩存和售后支持。
image

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

image

加負載均衡服務(wù)器相對簡單巷折,但卻能顯著提升站點性能和安全性压鉴。通過它把流量分配給多個服務(wù)器,就可以不必升級Web服務(wù)器了锻拘。就算應(yīng)用本身寫得不太好油吭,或者難以擴展,負載均衡都可以在不做其他改變的情況下提升用戶體驗署拟。

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

負載均衡服務(wù)器可以避免一臺服務(wù)器過載而其他服務(wù)器過閑,從而極大提升性能。同時,有了它還可以讓W(xué)eb服務(wù)器擴容更簡單,因為可以選用比較便宜的服務(wù)器堕虹,同時保證物盡其用。

可以通過負載均衡調(diào)度的協(xié)議包括HTTP芬首、HTTPS赴捞、SPDY、HTTP/2衩辟、WebSocket螟炫、FastCGI、SCGI艺晴、uwsgi昼钻、memcached,以及其他一些應(yīng)用形式封寞,包括基于TCP的應(yīng)用和其他第四層的協(xié)議然评。為此,首先要分析Web應(yīng)用狈究,看性能短板在哪里碗淌,然后再確定使用哪一個。

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

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

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

存能提升Web應(yīng)用性能,因為可以更快地把內(nèi)容交付給客戶端导绷。緩存的策略包括預(yù)處理內(nèi)容犀勒、在較快的設(shè)備上存儲內(nèi)容、把內(nèi)容保存在靠近客戶端的地方,以及同時運用這些策略贾费。

緩存有兩種枚碗。

  • 靜態(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%針對這個頁面的請求都將來自在緩存。如果你單獨緩存靜態(tài)內(nèi)容蝎亚,那么即使全新生成的頁面九孩,很可能大部分都來自緩存的內(nèi)容。

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

  • 把內(nèi)容放到離用戶近的地方躺彬。離用戶近,傳輸時間少梅惯。
  • 把內(nèi)容放到較快的機器上宪拥。機器快,檢索速度快铣减。
  • 把內(nèi)容從過度使用的機器中拿走她君。有時候機器會比在專注執(zhí)行特定任務(wù)時慢很多,那是因為太多任務(wù)讓它們分心徙歼。這時候把內(nèi)容拿到其他機器上犁河,不僅對緩存的內(nèi)容有好處,對非緩存的內(nèi)容同樣有利魄梯,因為托管它們的主機的負擔(dān)減輕了桨螺。

Web應(yīng)用的緩存可以在Web應(yīng)用服務(wù)器內(nèi)部或外部實現(xiàn)。首先酿秸,考慮緩存動態(tài)內(nèi)容灭翔,以減輕應(yīng)用服務(wù)器的負載。其次,緩存用于靜態(tài)內(nèi)容(包括那些動態(tài)生成內(nèi)容的臨時副本)肝箱,進一步減輕應(yīng)用服務(wù)器的負擔(dān)哄褒。然后,考慮把緩存轉(zhuǎn)移到其他更快或更靠近用戶的機器煌张,給應(yīng)用服務(wù)器減負呐赡,縮短傳輸時間。

用好緩存能顯著加快應(yīng)用的響應(yīng)速度骏融。對很多網(wǎng)頁來說链嘀,大圖片之類的靜態(tài)數(shù)據(jù),往往占據(jù)一半以上的內(nèi)容档玻。不用緩存怀泊,查詢和傳輸這類數(shù)據(jù)可能會花好幾秒鐘,而用緩存误趴,則可能只要花幾分之一秒霹琼。

可以舉一個例子來說明怎么使用緩存,NGINX和NGINX Plus通過兩個指令來設(shè)置緩存:proxy_cache_path和proxy_cache指定緩存的位置和大小凉当、最長緩存時間以及其他參數(shù)枣申。使用第三個(也是很受歡迎的)指令proxy_cache_use_stale,甚至可以告訴緩存在本來應(yīng)該提供新鮮內(nèi)容的服務(wù)器太忙或宕機時纤怒,提供原來的舊文件糯而,對客戶端來說,拿到內(nèi)容總比拿不到強泊窘。從用戶角度看熄驼,這樣也可以樹立你的站點或應(yīng)用非常穩(wěn)定的形象。

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

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

注意: 緩存涉及開發(fā)、決策和運維憔鬼,完善的緩存策略龟劲,比如本文提到的這些,能夠體現(xiàn)從DevOps角度考慮的價值轴或。也說是說昌跌,開發(fā)人員、架構(gòu)師照雁、運維人員此時攜手蚕愤,共同保障一個網(wǎng)站的功能、響應(yīng)時間、安全和業(yè)務(wù)目標(biāo)萍诱。

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

image

縮同樣能極大提升性能悬嗓。圖片、視頻裕坊、音樂等文件都有非常成熟和高效的壓縮標(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)定的情況下。

因為文本數(shù)據(jù)通過對于頁面交互能夠起到必要的支援作用浴麻,而多媒體數(shù)據(jù)則更多是錦上添花的作用得问。聰明的內(nèi)容壓縮可以把HTML、JavaScript软免、CSS等文本內(nèi)容的縮小30%以上宫纬,因此能夠相應(yīng)地減少加載時間。

如果你使用SSL膏萧,壓縮又可以減少必須經(jīng)過SSL編碼的數(shù)據(jù)量漓骚,從而補償了壓縮這些數(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

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

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

1、每次打開新連接的初次握手都必須創(chuàng)建加密密鑰吩屹,而瀏覽器使用HTTP/1.x對每個2跪另、服務(wù)器建立多個連接的方式進一步加劇了這個問題。

服務(wù)器端加密數(shù)據(jù)和客戶端解密數(shù)據(jù)的操作同樣也是開銷煤搜。

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

優(yōu)化SSL/TLS的方法因Web服務(wù)器而異辽故。以NGINX為例,NGINX使用OpenSSL腐碱,運行于普通機器上誊垢,能夠提供接近定制機器的性能。NGINX SSL performance詳細介紹了如何將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è)置步驟。

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

經(jīng)使用SSL/TLS的站點实愚,如果再使用HTTP/2或SPDY則很可能提升性能兼呵,因為一個連接只要一次握手兔辅。尚未使用SSL/TLS、HTTP/2和SPDY的站點切換到SSL/TLS(通常會降低性能)击喂,從響應(yīng)速度方面看维苔,可能是一次倒退。

谷歌2012年開始SPDY項目懂昂,致力于在HTTP/1.x之上實現(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特別重要,因為可以將SSL/TLS建立安全連接所需的握手時間降至最少咽弦。

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

實現(xiàn)了SPDY或HTTP/2之后抑淫,域名分片绷落、資源合并、圖片精靈等之前針對HTTP的性能優(yōu)化措施就用不著了始苇。因此也可以簡化代碼和部署砌烁。關(guān)于HTTP/2會帶來哪些變化,可以參考我們的這個白皮書催式。
image

NGINX很早就開始支持SPDY函喉,而且今天使用SPDY的大多數(shù)站點都在運行NGINX。NGINX同樣率先支持了HTTP/2荣月,2015年9月管呵,NGINX開源和NGINX Plus開始支持 HTTP/2。

隨著時間推移哺窄,NGINX希望大多數(shù)站點啟用SSL并遷移到HTTP/2捐下。這樣不僅可以讓網(wǎng)站更安全账锹,而且隨著新的優(yōu)化技術(shù)不斷涌現(xiàn),也可以通過簡單的代碼實現(xiàn)更高的性能坷襟。

建議七:升級軟件

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

相對舊版本蹲蒲,新發(fā)布的穩(wěn)定版本明顯性能更高番甩。堅持升級,也可以保證在調(diào)優(yōu)届搁、問題修復(fù)和安全警報方面與時俱進缘薛。

不升級軟件也會妨礙利用新能力。比如卡睦,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)重要。默認情況下旨巷,很多Linux系統(tǒng)都比較保守廓块,僅以桌面辦公為需求,以占用少量資源為調(diào)優(yōu)目標(biāo)契沫。對于Web應(yīng)用而言带猴,為達到性能最佳,肯定需要重新調(diào)優(yōu)懈万。

Linux優(yōu)化因Web服務(wù)器而異拴清。以NGINX為例靶病,可以從以下幾方面考慮。

存量隊列口予。如果發(fā)現(xiàn)有一些連接得不到處理娄周,可以增大net.core.somaxconn,即等待NGINX處理的最大連接數(shù)沪停。如果這個連接數(shù)限制過小煤辨,應(yīng)該可以看到錯誤消息,可以逐步提高這個值木张,直到錯誤消息不再出現(xiàn)众辨。

  • 文件描述符。NGINX對每個連接最多使用兩個文件描述符舷礼。如果系統(tǒng)服務(wù)于很多連接鹃彻,可能需要增大sys.fs.file_max這個對描述符的系統(tǒng)級限制,以及nofile這個用戶文件描述符限制妻献,以支持增大后的負載蛛株。
  • 臨時端口。在作為代理使用時育拨,NGINX會為每個上游服務(wù)器創(chuàng)建臨時端口谨履。可以設(shè)置net.ipv4.ip_local_port_range熬丧,增大端口值的范圍笋粟,以增加可用的端口量。此外锹引,還可以減小net.ipv4.tcp_fin_timeout的值,它控制非活動端口釋放重用的等待時間唆香,加快周轉(zhuǎn)嫌变。
  • 對NGINX而言,請參考NGINX性能調(diào)優(yōu)指南躬它,了解如何不費吹灰之力將你的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ū)被填滿鞠眉,可以實現(xiàn)對客戶端更有效的響應(yīng)。無法寫入內(nèi)存的響應(yīng)會被寫到磁盤择诈,從而降低性能械蹋。在NGINX的緩沖啟用時,可以使用proxy_buffer_size和proxy_buffers指令來管理它吭从。
  • 客戶端活動連接朝蜘。活動連接可以減少時間消耗涩金,特別是在使用SSL/TLS的情下谱醇。對NGINX而言,可以針對客戶端提高keepalive_requests的數(shù)值步做,默認值為100副渴;也可以增大keepalive_timeout的值,讓活動連接持續(xù)時間更長全度,從而讓后續(xù)請求得到更快響應(yīng)煮剧。
  • 上游活動連接。上游連接将鸵,即連接到應(yīng)用服務(wù)器勉盅、數(shù)據(jù)庫服務(wù)器的連接,同樣可以從活動連接的設(shè)置中獲得好處顶掉。對上游連接來說草娜,可以增加活動連接,也就是每個工作進程可用的空閑活動連接的數(shù)量痒筒。這樣可以增進連接重用宰闰,減少重開連接。關(guān)于活動連接的更多信息簿透,請參考這篇博客移袍。
  • 限制。限制客戶端使用的資源可以提升性能和安全性老充。對NGINX而言葡盗,limit_conn和limit_conn_zone指令限制指定源的連接數(shù),而limit_rate限制帶寬啡浊。這些設(shè)置可以防止合法用戶“侵吞”資源戳粒,同時也有助于防止攻擊路狮。limit_req和limit_req_zone指令限制客戶端請求。對于到上游服務(wù)器的連接蔚约,可以在上游配置區(qū)的服務(wù)器指令中使用max_conns參數(shù)奄妨,它限制對上游服務(wù)器的連接,防止過載苹祟。相關(guān)的隊列指令會創(chuàng)建一個隊列砸抛,在max_conns限制到達后將指定的請求數(shù)保存指定的時間。
  • 工作進程树枫。工作進程負責(zé)處理請求直焙。NGINX采用基于事件的模型和OS相關(guān)的機制有效地在工作進程間分配請求。建議將worker_processes的值設(shè)置為每個CPU一個工作進程砂轻。如果需要奔誓,大多數(shù)系統(tǒng)都支持提高worker_connections的值(默認為512)∩裕可以通過試驗找到最適合你系統(tǒng)的這個值厨喂。
  • 套接字分片。通常庄呈,一個套接字監(jiān)聽器向所有工作進程分發(fā)新連接蜕煌。套按字分片則為每個工作進程都創(chuàng)建一個套接字監(jiān)聽器,由內(nèi)核在套接字監(jiān)聽器可用時為其指定連接诬留。這樣可以減少鎖爭用斜纪,提升多核系統(tǒng)上的性能。要啟用套接字分片文兑,在listen指令中包含reuseport參數(shù)盒刚。
  • 線程池。一個費時的操作會阻塞任何計算機進程绿贞。對Web服務(wù)器軟件來說因块,磁盤訪問可能阻礙很多較快的操作,比如內(nèi)存中的計算和復(fù)制樟蠕。在使用線程池的情況下贮聂,慢操作會被指定給一組獨立的任務(wù)靠柑,而主處理循環(huán)會繼續(xù)運行較快的操作寨辩。磁盤操作完成后,結(jié)果會返回到主處理循環(huán)歼冰。在NGINX中靡狞,read()系統(tǒng)調(diào)用和sendfile()被轉(zhuǎn)載到了線程池。
image

提示 修改任何操作系統(tǒng)及周邊設(shè)備的設(shè)置時隔嫡,每次只修改一項甸怕,然后測試性能甘穿。如果該項修改導(dǎo)致了問題,或者并未提升性能梢杭,再改回去温兼。

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

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

監(jiān)控站點活動多數(shù)情況下是被動的募判,它只告訴你發(fā)生了什么,至于如何發(fā)現(xiàn)和解決問題咒唆,則是你自己的事情届垫。

監(jiān)控可以捕獲以下幾種問題:
1、服務(wù)器停機
2全释、服務(wù)器不穩(wěn)装处,漏處理連接
3、服務(wù)器出現(xiàn)大面積緩存失效
4浸船、服務(wù)器發(fā)送的內(nèi)容不對

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

為了幫助用戶盡快發(fā)現(xiàn)問題项戴,NGINX Plus增加了應(yīng)用程序體檢功能形帮,會報告經(jīng)常重復(fù)出現(xiàn)的問題。NGINX Plus還具備session draining特性周叮,會在已有任務(wù)完成前阻止新連接辩撑,以及慢啟動容量,從而讓恢復(fù)的服務(wù)器在負載均衡集群中達到應(yīng)有的速度仿耽。使用得當(dāng)?shù)那闆r下合冀,健康體檢會在問題顯著影響用戶體驗之前幫你定位問題,而session draining和慢啟動則讓你替換服務(wù)器時不影響感知的性能和在線時間项贺。這張圖展示了NGINX Plus內(nèi)置的實時活動監(jiān)控的控制板君躺,涵蓋了服務(wù)器、TCP連接和緩存开缎。
image

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

為了幫大家理解每項優(yōu)化建議的潛能,下面再針對之前的建議給出一些實施方針伏钠,希望大家各取所需横漏。

  • 反向代理服務(wù)器及負載均衡。沒有負載均衡或池負載均衡熟掂,可能導(dǎo)致極低的性能缎浇。添加一個反向代理服務(wù)器,比如NGINX赴肚,可以減少Web應(yīng)用在內(nèi)存和磁盤之間的往返华畏。負載均衡可以把任務(wù)從過載的服務(wù)器轉(zhuǎn)移到空閑的服務(wù)器,也便于擴展尊蚁。這些改變能極大地提升性能亡笑,與原有的部署方式最差的時候相比,10倍性能提升是很輕松的事横朋,即使不到10倍那也在總體上有了質(zhì)的飛躍仑乌。
  • 緩存動態(tài)和靜態(tài)內(nèi)容。如果你的Web服務(wù)器同時又充當(dāng)了應(yīng)用服務(wù)器琴锭,那么通過緩存動態(tài)內(nèi)容就可以達到高峰期10倍的性能提升晰甚。緩存靜態(tài)內(nèi)容也可以有幾倍的性能提升。
  • 壓縮數(shù)據(jù)决帖。使用JPEG厕九、PNG、MPEG-4以及MP3等壓縮格式能顯著提升性能地回。如果這些手段都用上了扁远,那么壓縮的文本數(shù)據(jù)(代碼及HTML)可以將初始頁面加載時間提升兩倍。
  • 優(yōu)化SSL/TLS刻像。安全握手對性能有很大影響畅买,因此對其進行優(yōu)化可以讓初次響應(yīng)加快兩倍,對于文本內(nèi)容較多的網(wǎng)站尤其如此细睡。優(yōu)化SSL/TLS下的媒體文件帶來的性能提升很小谷羞。
  • 實施HTTP/2和SPDY。在使用SSL/TLS的情況下溜徙,這兩個協(xié)議有可能提升網(wǎng)站的整體性能湃缎。
  • 調(diào)優(yōu)Linux和Web服務(wù)器。使用優(yōu)化的緩沖策略蠢壹、使用活動連接嗓违,將耗時的任務(wù)轉(zhuǎn)載至獨立的線程池,可以顯著提升性能知残。比如線程池可以將磁盤操作密集性任務(wù)的性能提升至少一個數(shù)量級靠瞎。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市求妹,隨后出現(xiàn)的幾起案子乏盐,更是在濱河造成了極大的恐慌,老刑警劉巖制恍,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件父能,死亡現(xiàn)場離奇詭異,居然都是意外死亡净神,警方通過查閱死者的電腦和手機何吝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹃唯,“玉大人爱榕,你說我怎么就攤上這事∑禄牛” “怎么了黔酥?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洪橘。 經(jīng)常有香客問我跪者,道長,這世上最難降的妖魔是什么熄求? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任渣玲,我火速辦了婚禮,結(jié)果婚禮上弟晚,老公的妹妹穿的比我還像新娘忘衍。我一直安慰自己,他們只是感情好卿城,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布淑履。 她就那樣靜靜地躺著,像睡著了一般藻雪。 火紅的嫁衣襯著肌膚如雪秘噪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天勉耀,我揣著相機與錄音指煎,去河邊找鬼。 笑死便斥,一個胖子當(dāng)著我的面吹牛至壤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枢纠,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼像街,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镰绎,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤脓斩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畴栖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體随静,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年吗讶,在試婚紗的時候發(fā)現(xiàn)自己被綠了燎猛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡照皆,死狀恐怖重绷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膜毁,我是刑警寧澤论寨,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站爽茴,受9級特大地震影響葬凳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜室奏,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一火焰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胧沫,春花似錦昌简、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至南蹂,卻和暖如春犬金,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背六剥。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工晚顷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疗疟。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓该默,卻偏偏與公主長得像,于是被迫代替她去往敵國和親策彤。 傳聞我的和親對象是個殘疾皇子栓袖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361