作者:為之漫筆
來源: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)濟(jì)活動(dòng)的比例日益提高港粱,就連發(fā)展中國家和地區(qū)的經(jīng)濟(jì)活動(dòng)都已經(jīng)有5%以上在線進(jìn)行了(相關(guān)數(shù)據(jù)請(qǐng)參考本文后面的資源)螃成。在這個(gè)超級(jí)鏈接、隨時(shí)在線的現(xiàn)代世界,用戶的期望也遠(yuǎn)非昔日可比。如果你的網(wǎng)站不能馬上響應(yīng)手形,你的應(yīng)用不能立即運(yùn)行耻姥,用戶轉(zhuǎn)身就會(huì)投奔你的競(jìng)爭(zhēng)對(duì)手。
亞馬遜大約10年前的一項(xiàng)研究表明们豌,頁面加載時(shí)間減少1/10秒,能夠使其營(yíng)收增長(zhǎng)1%。另一項(xiàng)近期的調(diào)查也顯示罩阵,一多半受訪站點(diǎn)所有者提到因?yàn)樽约簯?yīng)用的性能不佳導(dǎo)致了收入減少或者用戶流失。
一個(gè)網(wǎng)站到底多快才行启摄?頁面加載每花1秒鐘稿壁,就有大約4%的用戶走掉。排名最靠前的電商站點(diǎn)的首次交互時(shí)間為1至3秒歉备,這個(gè)區(qū)間的轉(zhuǎn)換率最高傅是。顯而易見,Web應(yīng)用性能的重要性與日俱增。
提升性能其實(shí)不難落午,難的是怎么看到結(jié)果谎懦。本文給出能夠提升大約10倍網(wǎng)站性能的10個(gè)建議供大家參考。如此全面地涵蓋各種性能優(yōu)化技術(shù)溃斋,這還是頭一回界拦,但這些建議可能需要NGINX的一點(diǎn)支持。除了性能梗劫,這些建議也會(huì)涉及提升安全性享甸。
建議一:使用反向代理服務(wù)器讓應(yīng)用更快更安全
如果你的Web應(yīng)用只跑在一臺(tái)機(jī)器上,那要提升其性能非常簡(jiǎn)單:換一臺(tái)更快的梳侨,多配幾個(gè)處理器蛉威,多加幾條內(nèi)存,磁盤陣列也要高速的走哺。換了以后蚯嫌,這臺(tái)機(jī)器上跑的WordPress服務(wù)器、Node.js或Java應(yīng)用速度都會(huì)加快丙躏。(要是應(yīng)用還會(huì)訪問另一臺(tái)數(shù)據(jù)庫服務(wù)器择示,那也簡(jiǎn)單:找兩臺(tái)更快的機(jī)器,用更快的網(wǎng)絡(luò)連起來就行了)
麻煩在于晒旅,機(jī)器速度并不是問題栅盲。很多時(shí)候Web應(yīng)用慢,是因?yàn)橐诟鞣N任務(wù)之間切換废恋,一會(huì)兒要處理數(shù)千個(gè)連接上的用戶請(qǐng)求谈秫,一會(huì)兒要向磁盤讀寫文件,一會(huì)兒又要運(yùn)行應(yīng)用的代碼鱼鼓,一會(huì)兒又要去干別的拟烫。應(yīng)用服務(wù)器因此可能出現(xiàn)各種狀況,耗盡內(nèi)存迄本、交換文件硕淑,或者讓很多請(qǐng)求等待一個(gè)硬盤I/O之類的任務(wù)。
除了升級(jí)硬件岸梨,其實(shí)你還可以選擇另外一種完全不同的方法:加一臺(tái)反向代理服務(wù)器喜颁,分擔(dān)上述一些任務(wù)。反向代理服務(wù)器位于運(yùn)行應(yīng)用的機(jī)器之前曹阔,負(fù)責(zé)處理來自外網(wǎng)的請(qǐng)求半开。反向代理服務(wù)器直接連到互聯(lián)網(wǎng),它與應(yīng)用服務(wù)器通信使用的是快速的內(nèi)部網(wǎng)絡(luò)赃份。
反向代理服務(wù)器可以讓應(yīng)用服務(wù)器專注于構(gòu)建頁面寂拆,然后交給反向代理向外網(wǎng)發(fā)送奢米,而不必理會(huì)用戶與應(yīng)用的交互。由于不必等待客戶端的響應(yīng)纠永,應(yīng)用服務(wù)器的運(yùn)行速度能達(dá)到接近最優(yōu)的水平鬓长。
增加反向代理服務(wù)器同時(shí)也可以為Web服務(wù)器增添靈活性。比如尝江,假設(shè)執(zhí)行某種任務(wù)的服務(wù)器過載了涉波,那隨時(shí)可以再增加一臺(tái)同類服務(wù)器;而如果這臺(tái)服務(wù)器掛了炭序,替換它也很容易啤覆。
鑒于這種靈活性,反向代理服務(wù)器往往也是其他性能優(yōu)化手段的先決條件惭聂,比如:
- 負(fù)載均衡(參見“建議二”)窗声,反向代理服務(wù)器上運(yùn)行負(fù)載均衡服務(wù),把流量平均分配給幾臺(tái)應(yīng)用服務(wù)器辜纲。有了負(fù)載均衡笨觅,添加應(yīng)用服務(wù)器根本不需要修改應(yīng)用。
- 緩存靜態(tài)文件(參見“建議三”)耕腾,圖片或代碼之類的可以直接請(qǐng)求的文件见剩,都可以保存在反向代理服務(wù)器中,以便直接發(fā)給客戶端幽邓。這樣不僅可以更快地響應(yīng)請(qǐng)求炮温,還能減輕應(yīng)用服務(wù)器的負(fù)擔(dān)火脉,加快其運(yùn)行速度牵舵。
- 保證站點(diǎn)安全,可以配置反向代理服務(wù)器提升其安全級(jí)別倦挂,通過它監(jiān)控來快速識(shí)別和響應(yīng)攻擊畸颅,從而保存應(yīng)用服務(wù)器安全。
建議二:增加負(fù)載均衡服務(wù)器
增加負(fù)載均衡服務(wù)器相對(duì)簡(jiǎn)單,但卻能顯著提升站點(diǎn)性能和安全性呀非。通過它把流量分配給多個(gè)服務(wù)器坚俗,就可以不必升級(jí)Web服務(wù)器了镜盯。就算應(yīng)用本身寫得不太好,或者難以擴(kuò)展猖败,負(fù)載均衡都可以在不做其他改變的情況下提升用戶體驗(yàn)速缆。
負(fù)載均衡服務(wù)器首先是一個(gè)反向代理服務(wù)器(參見“建議一”),負(fù)責(zé)把來自互聯(lián)網(wǎng)的請(qǐng)求轉(zhuǎn)發(fā)給其他服務(wù)器恩闻。這里關(guān)鍵在于負(fù)載均衡服務(wù)器可以支持兩臺(tái)以上的應(yīng)用服務(wù)器艺糜,使用一種選擇算法在不同的服務(wù)器間分配請(qǐng)求。最簡(jiǎn)單的負(fù)載均衡算法是循環(huán)調(diào)度幢尚,即把新請(qǐng)求依次轉(zhuǎn)發(fā)給可用服務(wù)器中的下一臺(tái)服務(wù)器倦踢。其他算法還有把請(qǐng)求發(fā)給活動(dòng)連接最少的服務(wù)器。NGINX Plus支持一種功能侠草,就是把用戶會(huì)話保持在同一臺(tái)服務(wù)器上辱挥,叫做會(huì)話保持。
負(fù)載均衡服務(wù)器可以避免一臺(tái)服務(wù)器過載而其他服務(wù)器過閑边涕,從而極大提升性能晤碘。同時(shí),有了它還可以讓W(xué)eb服務(wù)器擴(kuò)容更簡(jiǎn)單功蜓,因?yàn)榭梢赃x用比較便宜的服務(wù)器园爷,同時(shí)保證物盡其用。
可以通過負(fù)載均衡調(diào)度的協(xié)議包括HTTP式撼、HTTPS童社、SPDY、HTTP/2著隆、WebSocket扰楼、FastCGI、SCGI美浦、uwsgi弦赖、memcached,以及其他一些應(yīng)用形式浦辨,包括基于TCP的應(yīng)用和其他第四層的協(xié)議蹬竖。為此,首先要分析Web應(yīng)用流酬,看性能短板在哪里币厕,然后再確定使用哪一個(gè)。
同一臺(tái)服務(wù)器或用于負(fù)載均衡的服務(wù)器也可以承擔(dān)其他任務(wù)芽腾,比如SSL終止旦装、視客戶端不同支持HTTP/1/x或HTTP/2、緩存靜態(tài)文件晦嵌。
NGINX經(jīng)常被用來做負(fù)載均衡同辣,更多信息請(qǐng)參考我們以前發(fā)的介紹性文章拷姿、有關(guān)配置的文章、電子書和相關(guān)的在線視頻旱函,當(dāng)然還有文檔响巢。我們的商業(yè)版本NGINX Plus支持更多的負(fù)載均衡功能,如基于服務(wù)器響應(yīng)時(shí)間路由負(fù)載和支持微軟NTLM協(xié)議的負(fù)載均衡棒妨。
建議三:緩存靜態(tài)及動(dòng)態(tài)內(nèi)容
緩存能提升Web應(yīng)用性能踪古,因?yàn)榭梢愿斓匕褍?nèi)容交付給客戶端。緩存的策略包括預(yù)處理內(nèi)容券腔、在較快的設(shè)備上存儲(chǔ)內(nèi)容伏穆、把內(nèi)容保存在靠近客戶端的地方,以及同時(shí)運(yùn)用這些策略纷纫。
緩存有兩種枕扫。
- 靜態(tài)內(nèi)容緩存,不常變化的文件辱魁,如圖片(JPEG烟瞧、PNG)和代碼(CSS、JavaScript)染簇,可以保存在邊緣服務(wù)器中参滴,以便快速從內(nèi)容或磁盤中獲取。
- 動(dòng)態(tài)內(nèi)容緩存锻弓,很多Web應(yīng)用會(huì)為每個(gè)頁面請(qǐng)求生成全新的HTML砾赔,把生成的每個(gè)HTML都緩存一小段時(shí)間,可能顯著減少需要生成的頁面總數(shù)青灼,同時(shí)又可以保證交付的內(nèi)容足夠新鮮暴心。
假設(shè)一個(gè)頁面每秒被查看10次,而你緩存它1秒聚至,那么90%針對(duì)這個(gè)頁面的請(qǐng)求都將來自在緩存酷勺。如果你單獨(dú)緩存靜態(tài)內(nèi)容本橙,那么即使全新生成的頁面扳躬,很可能大部分都來自緩存的內(nèi)容。
緩存Web應(yīng)用生成內(nèi)容的技術(shù)主要分三種甚亭。
- 把內(nèi)容放到離用戶近的地方贷币。離用戶近,傳輸時(shí)間少亏狰。
- 把內(nèi)容放到較快的機(jī)器上役纹。機(jī)器快,檢索速度快暇唾。
- 把內(nèi)容從過度使用的機(jī)器中拿走促脉。有時(shí)候機(jī)器會(huì)比在專注執(zhí)行特定任務(wù)時(shí)慢很多辰斋,那是因?yàn)樘嗳蝿?wù)讓它們分心。這時(shí)候把內(nèi)容拿到其他機(jī)器上瘸味,不僅對(duì)緩存的內(nèi)容有好處宫仗,對(duì)非緩存的內(nèi)容同樣有利,因?yàn)橥泄芩鼈兊闹鳈C(jī)的負(fù)擔(dān)減輕了旁仿。
Web應(yīng)用的緩存可以在Web應(yīng)用服務(wù)器內(nèi)部或外部實(shí)現(xiàn)藕夫。首先,考慮緩存動(dòng)態(tài)內(nèi)容枯冈,以減輕應(yīng)用服務(wù)器的負(fù)載毅贮。其次,緩存用于靜態(tài)內(nèi)容(包括那些動(dòng)態(tài)生成內(nèi)容的臨時(shí)副本)尘奏,進(jìn)一步減輕應(yīng)用服務(wù)器的負(fù)擔(dān)滩褥。然后,考慮把緩存轉(zhuǎn)移到其他更快或更靠近用戶的機(jī)器炫加,給應(yīng)用服務(wù)器減負(fù)铸题,縮短傳輸時(shí)間。
用好緩存能顯著加快應(yīng)用的響應(yīng)速度琢感。對(duì)很多網(wǎng)頁來說丢间,大圖片之類的靜態(tài)數(shù)據(jù),往往占據(jù)一半以上的內(nèi)容驹针。不用緩存烘挫,查詢和傳輸這類數(shù)據(jù)可能會(huì)花好幾秒鐘,而用緩存柬甥,則可能只要花幾分之一秒饮六。
可以舉一個(gè)例子來說明怎么使用緩存,NGINX和NGINX Plus通過兩個(gè)指令來設(shè)置緩存:proxy_cache_path和proxy_cache指定緩存的位置和大小苛蒲、最長(zhǎng)緩存時(shí)間以及其他參數(shù)卤橄。使用第三個(gè)(也是很受歡迎的)指令proxy_cache_use_stale,甚至可以告訴緩存在本來應(yīng)該提供新鮮內(nèi)容的服務(wù)器太忙或宕機(jī)時(shí)臂外,提供原來的舊文件窟扑,對(duì)客戶端來說,拿到內(nèi)容總比拿不到強(qiáng)漏健。從用戶角度看嚎货,這樣也可以樹立你的站點(diǎn)或應(yīng)用非常穩(wěn)定的形象。
NGINX Plus支持高級(jí)緩存功能蔫浆,包括緩存凈化(caching purging)和通過控制板以可視化的形式展示緩存狀態(tài)殖属,實(shí)現(xiàn)實(shí)時(shí)監(jiān)控。
要了解NGINX中關(guān)于緩存的更多信息瓦盛,可以看看參考文檔和NGINX Plus Admin Guide中的NGINX Content Caching洗显。
注意: 緩存涉及開發(fā)外潜、決策和運(yùn)維,完善的緩存策略挠唆,比如本文提到的這些橡卤,能夠體現(xiàn)從DevOps角度考慮的價(jià)值。也說是說损搬,開發(fā)人員碧库、架構(gòu)師、運(yùn)維人員此時(shí)攜手巧勤,共同保障一個(gè)網(wǎng)站的功能嵌灰、響應(yīng)時(shí)間、安全和業(yè)務(wù)目標(biāo)颅悉。
建議四:壓縮數(shù)據(jù)
壓縮同樣能極大提升性能沽瞭。圖片、視頻剩瓶、音樂等文件都有非常成熟和高效的壓縮標(biāo)準(zhǔn)(JPEG和PNG驹溃、MPEG-4、MP3)延曙,任何一個(gè)標(biāo)準(zhǔn)都可以把文件大小縮小一個(gè)數(shù)量級(jí)甚至更多豌鹤。
文本文件,包括HTML(純文本和HTML標(biāo)簽)枝缔、CSS和JavaScript代碼布疙,經(jīng)常在不壓縮的情況下傳輸。壓縮這些數(shù)據(jù)對(duì)提升Web應(yīng)用的感知性能有時(shí)候特別明顯愿卸,尤其是移動(dòng)用戶的網(wǎng)絡(luò)很慢又不穩(wěn)定的情況下灵临。
因?yàn)槲谋緮?shù)據(jù)通過對(duì)于頁面交互能夠起到必要的支援作用,而多媒體數(shù)據(jù)則更多是錦上添花的作用趴荸。聰明的內(nèi)容壓縮可以把HTML儒溉、JavaScript、CSS等文本內(nèi)容的縮小30%以上发钝,因此能夠相應(yīng)地減少加載時(shí)間顿涣。
如果你使用SSL,壓縮又可以減少必須經(jīng)過SSL編碼的數(shù)據(jù)量笼平,從而補(bǔ)償了壓縮這些數(shù)據(jù)的CPU時(shí)間园骆。
壓縮數(shù)據(jù)的方法非常多。比如寓调,建議六中關(guān)于HTTP/2的部分就描述了一個(gè)新穎的壓縮思路,特別適合首部數(shù)據(jù)壓縮锄码。還有一個(gè)關(guān)于文本壓縮的例子夺英,就是可以在NGINX中開啟GZIP壓縮晌涕。預(yù)壓縮文本數(shù)據(jù)之后,可以使用gzip_static指令直接發(fā)送.gz文件痛悯。
建議五:優(yōu)化SSL/TLS
盡管采用率越來越高,但SSL/TLS造成的性能損失也困擾著很多網(wǎng)站扭仁。SSL/TLS拖慢網(wǎng)站的原因有兩個(gè)垮衷。
1、每次打開新連接的初次握手都必須創(chuàng)建加密密鑰乖坠,而瀏覽器使用HTTP/1.x對(duì)每個(gè)2搀突、服務(wù)器建立多個(gè)連接的方式進(jìn)一步加劇了這個(gè)問題。
服務(wù)器端加密數(shù)據(jù)和客戶端解密數(shù)據(jù)的操作同樣也是開銷熊泵。
為了鼓勵(lì)人們使用SSL/TLS仰迁,HTTP/2和SPDY(參見建議六)的作者將這兩個(gè)協(xié)議設(shè)計(jì)為只讓瀏覽器針對(duì)一次會(huì)話建立一個(gè)連接。這樣就把SSL導(dǎo)致性能降低的兩個(gè)主要原因之一消滅掉了顽分。然而徐许,說到優(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ǎn)單總結(jié)一下梯皿,涉及的技術(shù)主要有如下幾種。
- 會(huì)話緩存县恕。使用ssl_session_cache指令開啟緩存东羹,緩存每次SSL/STL連接時(shí)用到的參數(shù)。
- 會(huì)話票或ID忠烛。把特定SSL/TLS會(huì)話的信息保存為一個(gè)會(huì)話票或ID属提,以便連接重用,而不必重新握手。
- OCSP封套冤议。通過緩存SSL/TLS證書信息減少握手時(shí)間斟薇。
NGINX和NGINX Plus都可以來終止SSL/TLS,即處理客戶端信息的加密和解密恕酸,同時(shí)與其他服務(wù)器保持明文通信堪滨。在NGINX或NGINX Plus中設(shè)置處理SSL/TLS終止可以采取這幾個(gè)步驟。而對(duì)于在接受TCP連接的服務(wù)器上使用NGINX Plus而言蕊温,可以參考這里的設(shè)置步驟袱箱。
建議六:實(shí)現(xiàn)HTTP/2或SPDY
已經(jīng)使用SSL/TLS的站點(diǎn),如果再使用HTTP/2或SPDY則很可能提升性能义矛,因?yàn)橐粋€(gè)連接只要一次握手发笔。尚未使用SSL/TLS、HTTP/2和SPDY的站點(diǎn)切換到SSL/TLS(通常會(huì)降低性能)症革,從響應(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)鍵在于只用一個(gè)連接,而非多個(gè)連接缩滨。這一個(gè)連接是多路復(fù)用的势就,因此可以同時(shí)承載多個(gè)請(qǐng)求和響應(yīng)。
只維持一個(gè)連接脉漏,可以省掉多個(gè)連接所需的設(shè)置和管理消耗苞冯。而且一個(gè)連接對(duì)SSL特別重要,因?yàn)榭梢詫SL/TLS建立安全連接所需的握手時(shí)間降至最少侧巨。
SPDY協(xié)議要求使用SSL/TLS舅锄,HTTP/2并沒有正式要求,但目前所有支持HTTP/2的瀏覽器都只會(huì)在啟用SSL/TLS的情況下才會(huì)使用它司忱。換句話說皇忿,支持HTTP/2的瀏覽器只有在網(wǎng)站使用SSL且服務(wù)器接受HTTP/2流量的情況下才會(huì)使用HTTP/2。否則坦仍,瀏覽器會(huì)基于HTTP/1.x通信鳍烁。
實(shí)現(xiàn)了SPDY或HTTP/2之后,域名分片繁扎、資源合并幔荒、圖片精靈等之前針對(duì)HTTP的性能優(yōu)化措施就用不著了。因此也可以簡(jiǎn)化代碼和部署。關(guān)于HTTP/2會(huì)帶來哪些變化铺峭,可以參考我們的這個(gè)白皮書墓怀。NGINX很早就開始支持SPDY汽纠,而且今天使用SPDY的大多數(shù)站點(diǎn)都在運(yùn)行NGINX卫键。NGINX同樣率先支持了HTTP/2,2015年9月虱朵,NGINX開源和NGINX Plus開始支持 HTTP/2莉炉。
隨著時(shí)間推移,NGINX希望大多數(shù)站點(diǎn)啟用SSL并遷移到HTTP/2碴犬。這樣不僅可以讓網(wǎng)站更安全絮宁,而且隨著新的優(yōu)化技術(shù)不斷涌現(xiàn),也可以通過簡(jiǎn)單的代碼實(shí)現(xiàn)更高的性能服协。
建議七:升級(jí)軟件
提升應(yīng)用性能的一個(gè)簡(jiǎn)單的方法绍昂,就是根據(jù)可靠性及性能選擇軟件。此外偿荷,高質(zhì)量組件的開發(fā)者更可能不斷提升性能和修復(fù)問題窘游,因此使用最新的穩(wěn)定版本是劃算。新發(fā)布的版本會(huì)得到開發(fā)者和用戶更多的關(guān)注跳纳,同時(shí)也會(huì)利用新的編譯器優(yōu)化技術(shù)忍饰,包括針對(duì)新硬件的調(diào)優(yōu)。
相對(duì)舊版本寺庄,新發(fā)布的穩(wěn)定版本明顯性能更高艾蓝。堅(jiān)持升級(jí),也可以保證在調(diào)優(yōu)斗塘、問題修復(fù)和安全警報(bào)方面與時(shí)俱進(jìn)赢织。
不升級(jí)軟件也會(huì)妨礙利用新能力。比如馍盟,HTTP/2目前要求OpenSSL 1.0.1于置。從2016年下半年開始,HTTP/2會(huì)要求OpenSSL 1.0.2朽合,該版本發(fā)布于2015年1月俱两。
NGINX用戶可以從NGINX開源軟件的最新版本或NGINX Plus開始,它們支持套接字共享曹步、線程池(參見下文)宪彩,而且都會(huì)持續(xù)優(yōu)化性能。因此讲婚,檢查一下自己的軟件尿孔,盡量把它們升級(jí)到最新的版本。
建議八:調(diào)優(yōu)Linux
Linux是今天大多數(shù)Web服務(wù)器的底層操作系統(tǒng),作為一切基礎(chǔ)設(shè)施的基礎(chǔ)活合,Linux對(duì)提升性能至關(guān)重要雏婶。默認(rèn)情況下,很多Linux系統(tǒng)都比較保守白指,僅以桌面辦公為需求留晚,以占用少量資源為調(diào)優(yōu)目標(biāo)。對(duì)于Web應(yīng)用而言告嘲,為達(dá)到性能最佳错维,肯定需要重新調(diào)優(yōu)。
Linux優(yōu)化因Web服務(wù)器而異橄唬。以NGINX為例赋焕,可以從以下幾方面考慮。
存量隊(duì)列仰楚。如果發(fā)現(xiàn)有一些連接得不到處理隆判,可以增大net.core.somaxconn,即等待NGINX處理的最大連接數(shù)僧界。如果這個(gè)連接數(shù)限制過小侨嘀,應(yīng)該可以看到錯(cuò)誤消息,可以逐步提高這個(gè)值捎泻,直到錯(cuò)誤消息不再出現(xiàn)飒炎。
- 文件描述符。NGINX對(duì)每個(gè)連接最多使用兩個(gè)文件描述符笆豁。如果系統(tǒng)服務(wù)于很多連接郎汪,可能需要增大sys.fs.file_max這個(gè)對(duì)描述符的系統(tǒng)級(jí)限制,以及nofile這個(gè)用戶文件描述符限制闯狱,以支持增大后的負(fù)載煞赢。
- 臨時(shí)端口。在作為代理使用時(shí)哄孤,NGINX會(huì)為每個(gè)上游服務(wù)器創(chuàng)建臨時(shí)端口照筑。可以設(shè)置net.ipv4.ip_local_port_range瘦陈,增大端口值的范圍凝危,以增加可用的端口量。此外晨逝,還可以減小net.ipv4.tcp_fin_timeout的值蛾默,它控制非活動(dòng)端口釋放重用的等待時(shí)間,加快周轉(zhuǎn)捉貌。
- 對(duì)NGINX而言支鸡,請(qǐng)參考NGINX性能調(diào)優(yōu)指南冬念,了解如何不費(fèi)吹灰之力將你的Linux系統(tǒng)優(yōu)化為能夠支持更大的吞吐量。
建議九:調(diào)優(yōu)Web服務(wù)器
無論使用什么Web服務(wù)器牧挣,都需要針對(duì)應(yīng)用對(duì)其調(diào)優(yōu)急前。以下建議適用于任何Web服務(wù)器,但會(huì)給出只有NGINX的設(shè)置說明瀑构。
- 訪問日志裆针。不要每個(gè)請(qǐng)求的日志都馬上寫到磁盤,可以在內(nèi)存里做個(gè)緩存检碗,然后批量定入据块。對(duì)NGINX而言码邻,將buffer=size參數(shù)添加到access_log指令折剃,等內(nèi)存緩沖區(qū)寫滿后再把日志寫到磁盤。如果你添加了flush=time參數(shù)像屋,那么緩沖區(qū)的內(nèi)容也會(huì)按照指定時(shí)間寫入磁盤怕犁。
- 緩沖。緩沖用于在內(nèi)存里保存部分響應(yīng)己莺,直到緩沖區(qū)被填滿奏甫,可以實(shí)現(xiàn)對(duì)客戶端更有效的響應(yīng)。無法寫入內(nèi)存的響應(yīng)會(huì)被寫到磁盤凌受,從而降低性能阵子。在NGINX的緩沖啟用時(shí),可以使用proxy_buffer_size和proxy_buffers指令來管理它胜蛉。
- 客戶端活動(dòng)連接挠进。活動(dòng)連接可以減少時(shí)間消耗誊册,特別是在使用SSL/TLS的情下领突。對(duì)NGINX而言,可以針對(duì)客戶端提高keepalive_requests的數(shù)值案怯,默認(rèn)值為100君旦;也可以增大keepalive_timeout的值,讓活動(dòng)連接持續(xù)時(shí)間更長(zhǎng)嘲碱,從而讓后續(xù)請(qǐng)求得到更快響應(yīng)金砍。
- 上游活動(dòng)連接。上游連接麦锯,即連接到應(yīng)用服務(wù)器恕稠、數(shù)據(jù)庫服務(wù)器的連接,同樣可以從活動(dòng)連接的設(shè)置中獲得好處离咐。對(duì)上游連接來說谱俭,可以增加活動(dòng)連接奉件,也就是每個(gè)工作進(jìn)程可用的空閑活動(dòng)連接的數(shù)量。這樣可以增進(jìn)連接重用昆著,減少重開連接县貌。關(guān)于活動(dòng)連接的更多信息,請(qǐng)參考這篇博客凑懂。
- 限制煤痕。限制客戶端使用的資源可以提升性能和安全性。對(duì)NGINX而言接谨,limit_conn和limit_conn_zone指令限制指定源的連接數(shù)摆碉,而limit_rate限制帶寬。這些設(shè)置可以防止合法用戶“侵吞”資源脓豪,同時(shí)也有助于防止攻擊巷帝。limit_req和limit_req_zone指令限制客戶端請(qǐng)求。對(duì)于到上游服務(wù)器的連接扫夜,可以在上游配置區(qū)的服務(wù)器指令中使用max_conns參數(shù)楞泼,它限制對(duì)上游服務(wù)器的連接,防止過載笤闯。相關(guān)的隊(duì)列指令會(huì)創(chuàng)建一個(gè)隊(duì)列堕阔,在max_conns限制到達(dá)后將指定的請(qǐng)求數(shù)保存指定的時(shí)間。
- 工作進(jìn)程颗味。工作進(jìn)程負(fù)責(zé)處理請(qǐng)求超陆。NGINX采用基于事件的模型和OS相關(guān)的機(jī)制有效地在工作進(jìn)程間分配請(qǐng)求。建議將worker_processes的值設(shè)置為每個(gè)CPU一個(gè)工作進(jìn)程浦马。如果需要时呀,大多數(shù)系統(tǒng)都支持提高worker_connections的值(默認(rèn)為512)【韬可以通過試驗(yàn)找到最適合你系統(tǒng)的這個(gè)值退唠。
- 套接字分片。通常荤胁,一個(gè)套接字監(jiān)聽器向所有工作進(jìn)程分發(fā)新連接瞧预。套按字分片則為每個(gè)工作進(jìn)程都創(chuàng)建一個(gè)套接字監(jiān)聽器,由內(nèi)核在套接字監(jiān)聽器可用時(shí)為其指定連接仅政。這樣可以減少鎖爭(zhēng)用垢油,提升多核系統(tǒng)上的性能。要啟用套接字分片圆丹,在listen指令中包含reuseport參數(shù)滩愁。
- 線程池。一個(gè)費(fèi)時(shí)的操作會(huì)阻塞任何計(jì)算機(jī)進(jìn)程辫封。對(duì)Web服務(wù)器軟件來說硝枉,磁盤訪問可能阻礙很多較快的操作廉丽,比如內(nèi)存中的計(jì)算和復(fù)制。在使用線程池的情況下妻味,慢操作會(huì)被指定給一組獨(dú)立的任務(wù)正压,而主處理循環(huán)會(huì)繼續(xù)運(yùn)行較快的操作。磁盤操作完成后责球,結(jié)果會(huì)返回到主處理循環(huán)焦履。在NGINX中,read()系統(tǒng)調(diào)用和sendfile()被轉(zhuǎn)載到了線程池雏逾。
提示 修改任何操作系統(tǒng)及周邊設(shè)備的設(shè)置時(shí)嘉裤,每次只修改一項(xiàng),然后測(cè)試性能栖博。如果該項(xiàng)修改導(dǎo)致了問題屑宠,或者并未提升性能,再改回去笛匙。
建議十:監(jiān)控實(shí)時(shí)動(dòng)態(tài)以發(fā)現(xiàn)問題和瓶頸
保存應(yīng)用高性能的關(guān)鍵是實(shí)時(shí)監(jiān)控應(yīng)用性能侨把。必須實(shí)時(shí)監(jiān)控特定設(shè)備及相應(yīng)Web基礎(chǔ)設(shè)施中應(yīng)用的動(dòng)態(tài)。
監(jiān)控站點(diǎn)活動(dòng)多數(shù)情況下是被動(dòng)的妹孙,它只告訴你發(fā)生了什么,至于如何發(fā)現(xiàn)和解決問題获枝,則是你自己的事情蠢正。
監(jiān)控可以捕獲以下幾種問題:
1、服務(wù)器停機(jī)
2省店、服務(wù)器不穩(wěn)嚣崭,漏處理連接
3、服務(wù)器出現(xiàn)大面積緩存失效
4懦傍、服務(wù)器發(fā)送的內(nèi)容不對(duì)
New Relic或Dynatrace等全局性的性能監(jiān)控工具雹舀,可以幫我們監(jiān)控遠(yuǎn)程加載頁面的時(shí)間,而NGINX則可以幫你監(jiān)控應(yīng)用交付這一端粗俱。應(yīng)用的性能數(shù)據(jù)可以告訴你優(yōu)化手段什么時(shí)候真正給用戶帶去了不同的體驗(yàn)说榆,以及什么時(shí)候需要擴(kuò)容以滿足越來越多的流量。
為了幫助用戶盡快發(fā)現(xiàn)問題寸认,NGINX Plus增加了應(yīng)用程序體檢功能签财,會(huì)報(bào)告經(jīng)常重復(fù)出現(xiàn)的問題。NGINX Plus還具備session draining特性偏塞,會(huì)在已有任務(wù)完成前阻止新連接唱蒸,以及慢啟動(dòng)容量,從而讓恢復(fù)的服務(wù)器在負(fù)載均衡集群中達(dá)到應(yīng)有的速度灸叼。使用得當(dāng)?shù)那闆r下神汹,健康體檢會(huì)在問題顯著影響用戶體驗(yàn)之前幫你定位問題庆捺,而session draining和慢啟動(dòng)則讓你替換服務(wù)器時(shí)不影響感知的性能和在線時(shí)間。這張圖展示了NGINX Plus內(nèi)置的實(shí)時(shí)活動(dòng)監(jiān)控的控制板屁魏,涵蓋了服務(wù)器疼燥、TCP連接和緩存。性能提升因Web應(yīng)用不同會(huì)有巨大差異蚁堤。實(shí)際的提升取決于預(yù)算醉者、時(shí)間,以及現(xiàn)有實(shí)現(xiàn)的與理想性能的差距披诗。那么怎么讓你的應(yīng)用獲得10倍的性能提升呢撬即?
為了幫大家理解每項(xiàng)優(yōu)化建議的潛能,下面再針對(duì)之前的建議給出一些實(shí)施方針呈队,希望大家各取所需剥槐。
- 反向代理服務(wù)器及負(fù)載均衡。沒有負(fù)載均衡或池負(fù)載均衡宪摧,可能導(dǎo)致極低的性能粒竖。添加一個(gè)反向代理服務(wù)器,比如NGINX几于,可以減少Web應(yīng)用在內(nèi)存和磁盤之間的往返蕊苗。負(fù)載均衡可以把任務(wù)從過載的服務(wù)器轉(zhuǎn)移到空閑的服務(wù)器,也便于擴(kuò)展沿彭。這些改變能極大地提升性能朽砰,與原有的部署方式最差的時(shí)候相比,10倍性能提升是很輕松的事喉刘,即使不到10倍那也在總體上有了質(zhì)的飛躍瞧柔。
- 緩存動(dòng)態(tài)和靜態(tài)內(nèi)容。如果你的Web服務(wù)器同時(shí)又充當(dāng)了應(yīng)用服務(wù)器睦裳,那么通過緩存動(dòng)態(tài)內(nèi)容就可以達(dá)到高峰期10倍的性能提升造锅。緩存靜態(tài)內(nèi)容也可以有幾倍的性能提升。
- 壓縮數(shù)據(jù)廉邑。使用JPEG哥蔚、PNG、MPEG-4以及MP3等壓縮格式能顯著提升性能鬓催。如果這些手段都用上了肺素,那么壓縮的文本數(shù)據(jù)(代碼及HTML)可以將初始頁面加載時(shí)間提升兩倍。
- 優(yōu)化SSL/TLS宇驾。安全握手對(duì)性能有很大影響倍靡,因此對(duì)其進(jìn)行優(yōu)化可以讓初次響應(yīng)加快兩倍,對(duì)于文本內(nèi)容較多的網(wǎng)站尤其如此课舍。優(yōu)化SSL/TLS下的媒體文件帶來的性能提升很小塌西。
- 實(shí)施HTTP/2和SPDY他挎。在使用SSL/TLS的情況下,這兩個(gè)協(xié)議有可能提升網(wǎng)站的整體性能捡需。
- 調(diào)優(yōu)Linux和Web服務(wù)器办桨。使用優(yōu)化的緩沖策略、使用活動(dòng)連接站辉,將耗時(shí)的任務(wù)轉(zhuǎn)載至獨(dú)立的線程池呢撞,可以顯著提升性能。比如線程池可以將磁盤操作密集性任務(wù)的性能提升至少一個(gè)數(shù)量級(jí)饰剥。