Nginx性能調(diào)優(yōu)

本文翻譯自Tuning NGINX for Performance

Nginx以高性能負(fù)載均衡緩存web服務(wù)器出名搔扁,支撐著世界上繁忙網(wǎng)站中的40%践啄。大多數(shù)使用場景下,Nginx和Linux系統(tǒng)的默認(rèn)配置表現(xiàn)較好她紫,但是仍有必要做一些調(diào)優(yōu)以期達(dá)到最佳性能硅堆。這篇文章討論當(dāng)調(diào)優(yōu)系統(tǒng)時需要考慮的一些Nginx和Linux配置。這些配置有很多贿讹,但是在本文里我們只涉及適合大多數(shù)用戶的配置渐逃。那些沒有涉及到的配置,只有那些對Nginx和Linux有深入理解的人民褂,或者Nginx專家服務(wù)團(tuán)隊推薦茄菊,才會考慮到。Nginx專家服務(wù)赊堪,已經(jīng)和世界上一些繁忙網(wǎng)站合作來調(diào)優(yōu)Nginx以達(dá)到最大限度的性能面殖,并且可以對任何需要充分發(fā)揮系統(tǒng)能力的客戶提供支持。

簡介

這里假定讀者對Nginx架構(gòu)和配置概念有個基本了解雹食。本文不會重復(fù)Nginx文檔的內(nèi)容畜普,而是概述各種配置選項并提供相關(guān)文檔鏈接。

調(diào)優(yōu)時群叶,有一條較好的準(zhǔn)則是吃挑,一次只改一個配置項,如果改后沒有性能上的提升街立,就退回為原先的值舶衬。

我們先討論Linux調(diào)優(yōu),因為有些值會影響在Nginx配置中可以用的值赎离。

Linux配置

現(xiàn)代Linux內(nèi)核(2.6+)能夠很好的調(diào)節(jié)各種配置逛犹,有些配置您可能想更改。如果操作系統(tǒng)配置太低梁剔,那么會在內(nèi)核日志中看到錯誤信息虽画,因此需要調(diào)節(jié)這些配置。Linux配置項很多荣病,本文只提及那些在普通工作負(fù)載下最可能需要調(diào)優(yōu)的配置項码撰。如果需要這些配置的詳細(xì)信息,請參考Linux文檔个盆。

Backlog隊列

以下設(shè)置與連接及其如何排隊直接相關(guān)脖岛。如果傳入的連接率很高而性能水平參差不齊朵栖,比如一些連接似乎被暫停了,那么更改這些配置可能會有用柴梆。

  • net.core.somaxconn 該項設(shè)置等待被Nginx接受的連接的排隊大小陨溅。由于Nginx接受連接速度非常快绍在,這個值通常不需要非常大门扇,但是默認(rèn)值是非常低的,所以如果你有一個高流量網(wǎng)站揣苏,增加這個值是個好主意悯嗓。如果設(shè)置過低,那么你能在內(nèi)核日志中看到錯誤信息卸察,這時你應(yīng)該增加這個值直到?jīng)]有錯誤信息。注意:如果你將其設(shè)置為大于512的值铅祸,你應(yīng)該同時用listen指令的backlog參數(shù)匹配這個值來更改Nginx的配置坑质。
  • net.core.netdev_max_backlog 該項設(shè)置在交由CPU處理之前網(wǎng)卡緩沖數(shù)據(jù)包的速率。對于擁有高帶寬的機器临梗,這個值可能需要增加涡扼。查看網(wǎng)卡文檔尋求相關(guān)建議,或者檢查內(nèi)核日志相關(guān)錯誤信息盟庞。

文件描述符

文件描述符是一種操作系統(tǒng)資源吃沪,用來處理諸如連接和打開文件的事情。對每一個連接什猖,Nginx可以用上多達(dá)兩個文件描述符票彪。例如,如果Nginx用作代理不狮,則其中一個用于客戶端連接降铸,另一個用于連接到被代理的服務(wù)器。如果使用了HTTP keepalive摇零,則連接描述符的使用會少得多推掸。對于有大量連接的系統(tǒng),如下設(shè)置可能需要進(jìn)行調(diào)整:

  • sys.fs.file_max 這是系統(tǒng)范圍內(nèi)的文件描述符限制驻仅。
  • nofile 這是用戶級別的文件描述符限制谅畅,在/etc/security/limits.conf文件中配置

臨時端口

當(dāng)Nginx被當(dāng)作代理使用時,每一個到upstream服務(wù)器的連接都使用一個臨時端口噪服。

  • net.ipv4.ip_local_port_range 這個用來指定可以使用的起止端口號毡泻。如果你看到端口耗盡,你可以增加這個范圍芯咧。常見的設(shè)置為1024到65000牙捉。
  • net.ipv4.tcp_fin_timeout 這個用于指定一個不再被使用的端口多久之后可以被另一連接再次使用竹揍。通常,這個值默認(rèn)為60秒邪铲,但是可以安全地減少到30甚至15秒芬位。

Nginx配置

下面是一些可能影響性能的Nginx指令。如前所述带到,我們僅討論那些推薦大多數(shù)用戶調(diào)整的指令昧碉。這里未提及到的任何指令,如果沒有Nginx團(tuán)隊的指導(dǎo)揽惹,不推薦更改被饿。

工作進(jìn)程

Nginx可以運行多個工作進(jìn)程,每個都能處理大量連接搪搏。你可以用如下指令控制工作進(jìn)程個數(shù)以及連接如何被處理:

  • worker_processes 這個控制Nginx運行的工作進(jìn)程個數(shù)狭握。大多數(shù)情況下,一個CPU核心跑一個工作進(jìn)程能夠工作得很好疯溺÷勐可以將該指令設(shè)為auto來達(dá)到與CPU核心數(shù)匹配的工作進(jìn)程數(shù)。有時候囱嫩,可以增加這個值恃疯,比如工作進(jìn)程需要處理大量磁盤IO操作的時候。這個值默認(rèn)為1墨闲。
  • worker_connections 這個表示每個工作進(jìn)程同時能夠處理的最大連接數(shù)今妄。默認(rèn)值是512,但是大多數(shù)系統(tǒng)能處理更大的值鸳碧。這個值該設(shè)為多少取決于服務(wù)器硬件配置以及流量的特性盾鳞,可以通過測試來發(fā)現(xiàn)。

Keepalives

持久連接可以減少打開和關(guān)閉連接所需要的CPU和網(wǎng)絡(luò)開銷杆兵,因而對性能有重大影響雁仲。Nginx終止所有客戶端連接,并具有到upstream服務(wù)器的單獨連接琐脏。Nginx支持客戶端和upstream服務(wù)器的持久連接攒砖。如下指令涉及客戶端持久連接:

  • keepalive_requests 這表示客戶端能在單個持久連接上發(fā)送多少請求。默認(rèn)值是100日裙,可以設(shè)置成更高的值吹艇,這在負(fù)載生成器從單個客戶端發(fā)送大量請求的測試場景中非常有用。
  • keepalive_timeout 表示一個空閑持久連接保持打開狀態(tài)多長時間昂拂。

如下指令涉及upstream持久連接:

  • keepalive 這個指定每個工作進(jìn)程連接到upstream服務(wù)器的空閑持久連接數(shù)量受神。這個指令沒有默認(rèn)值。

為了啟用到upstream的持久連接格侯,需要增加如下指令:

  • proxy_http_version 1.1;
  • proxy_set_header Connection "";

Access日志

記錄每個請求需要花費CPU和IO周期鼻听,減少這種影響的一種方法是啟用access日志緩沖财著。這將導(dǎo)致Nginx緩沖一系列日志條目,然后一次性寫入文件而不是單個單個寫入撑碴。通過指定access_log指令的"buffer=size"選項可以打開access日志緩沖撑教,該設(shè)置指定要使用的緩沖區(qū)的大小。你還可以使用"flush=time"選項告訴Nginx多長時間后把緩沖區(qū)中的條目寫入文件醉拓。定義了這兩個選項后伟姐,當(dāng)緩沖區(qū)放不下下一條日志,或者緩沖區(qū)中的條目超過了flush參數(shù)指定的時間亿卤,Nginx會將緩沖區(qū)中的條目寫入日志文件愤兵。當(dāng)工作進(jìn)程重新打開日志文件或者關(guān)閉時,緩沖區(qū)中的條目也會被寫入文件排吴。也可以完全禁用access日志記錄秆乳。

Sendfile

Sendfile是一個操作系統(tǒng)特性,可以在Nginx上啟用傍念。它通過在內(nèi)核中從一個文件描述符向另一個文件描述符復(fù)制數(shù)據(jù)矫夷,往往能達(dá)到零拷貝,因而可以提供更快的TCP數(shù)據(jù)傳輸憋槐。Nginx可以使用該機制將緩存或者磁盤上的內(nèi)容寫到socket,無需從內(nèi)核空間到用戶空間的上下文切換淑趾,因而非逞糇校快并且使用較少的CPU開銷。由于數(shù)據(jù)永遠(yuǎn)不會觸及用戶空間扣泊,所以不可能把需要訪問數(shù)據(jù)的過濾器插入到處理鏈中近范,不能使用任何需要改變內(nèi)容的Nginx過濾器,比如gzip過濾器延蟹。Nginx默認(rèn)沒有啟用該機制评矩。

限制

Nginx和Nginx Plus允許設(shè)置各種限制,用來控制客戶端資源消耗阱飘,以防影響系統(tǒng)性能以及用戶體驗和安全斥杜。以下是一些相關(guān)指令:

  • limit_conn / limit_conn_zone 這些指令可以用來限制Nginx允許的連接數(shù),比如來自單個客戶端IP地址的連接數(shù)沥匈。這可以防止單個客戶端打開太多連接而消耗太多資源蔗喂。
  • limit_rate 這個用來限制客戶端在單個連接上允許使用的帶寬。這可以防止某些客戶端導(dǎo)致系統(tǒng)超載高帖,因而有利于為所有客戶端提供QoS保證缰儿。
  • limit_req / limit_req_zone 這些指令可以用來限制Nginx的請求處理速率。與limit_rate一起散址,可以防止某些客戶端導(dǎo)致系統(tǒng)超載乖阵,因而有利于為所有客戶端提供QoS保證宣赔。這些指令也可以用來增強安全性,尤其是對登錄頁面瞪浸,通過限制請求速率儒将,使得其對人類用戶是合適的,而會減慢試圖訪問你的應(yīng)用的程序默终。
  • max_conns 這個用來限制同時連接到upstream組中單個服務(wù)器的最大連接數(shù)椅棺。這可以防止upstream服務(wù)器超載。默認(rèn)值是0齐蔽,表示沒有限制两疚。
  • queue 如果設(shè)置了max_conns,那么queue指令用來決定當(dāng)一個請求由于upstream組中沒有可用服務(wù)器或者這些服務(wù)器達(dá)到max_conns限制而不能得到處理時會發(fā)生什么含滴。這個指令用來設(shè)定有多少請求將會排隊以及排多久诱渤。如果沒有設(shè)置這個指令,就不會有排隊行為谈况。

其它考慮

Nginx還有一些特性可以用來提高web應(yīng)用的性能勺美。這些特性不常出現(xiàn)在調(diào)優(yōu)討論中,但是有必要一提,因為它們的影響也可能比較可觀。我們將討論這些特性中的兩個洁段。

緩存

對于一個為一組web服務(wù)器或者應(yīng)用服務(wù)器作負(fù)載均衡的Nginx實例來說丑勤,啟用緩存可以顯著地降低響應(yīng)時間,同時能顯著減輕后端服務(wù)器的負(fù)載。緩存本身就是一個主題,這里不會討論。Nginx緩存配置的更多信息請參考:Nginx管理指南 - 緩存华蜒。

壓縮

壓縮響應(yīng)可以大大減小響應(yīng)的大小,減少帶寬占用豁遭。不過叭喜,這需要CPU資源來處理壓縮,所以最好在值得減少帶寬占用的情況下使用蓖谢。需要注意的是捂蕴,不能對已經(jīng)壓縮的東西(比如jpeg圖片)再次啟用壓縮。Nginx壓縮配置的更多信息請參考:Nginx管理指南 - 壓縮和解壓縮蜈抓。

更多信息

更多信息請參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末启绰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沟使,更是在濱河造成了極大的恐慌委可,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異着倾,居然都是意外死亡拾酝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門卡者,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒿囤,“玉大人,你說我怎么就攤上這事崇决〔姆蹋” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵恒傻,是天一觀的道長脸侥。 經(jīng)常有香客問我,道長盈厘,這世上最難降的妖魔是什么睁枕? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮沸手,結(jié)果婚禮上外遇,老公的妹妹穿的比我還像新娘。我一直安慰自己契吉,他們只是感情好跳仿,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捐晶,像睡著了一般塔嬉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上租悄,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音恩袱,去河邊找鬼泣棋。 笑死,一個胖子當(dāng)著我的面吹牛畔塔,可吹牛的內(nèi)容都是我干的潭辈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼澈吨,長吁一口氣:“原來是場噩夢啊……” “哼把敢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谅辣,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤修赞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柏副,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡勾邦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了割择。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眷篇。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荔泳,靈堂內(nèi)的尸體忽然破棺而出蕉饼,到底是詐尸還是另有隱情,我是刑警寧澤玛歌,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布昧港,位于F島的核電站,受9級特大地震影響沾鳄,放射性物質(zhì)發(fā)生泄漏慨飘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一译荞、第九天 我趴在偏房一處隱蔽的房頂上張望瓤的。 院中可真熱鬧,春花似錦吞歼、人聲如沸圈膏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稽坤。三九已至,卻和暖如春糯俗,著一層夾襖步出監(jiān)牢的瞬間尿褪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工得湘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杖玲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓淘正,卻偏偏與公主長得像摆马,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸿吆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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

  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx囤采?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,700評論 24 1,002
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理惩淳,服務(wù)發(fā)現(xiàn)蕉毯,斷路器,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • 上一篇《WEB請求處理一:瀏覽器請求發(fā)起處理》,我們講述了瀏覽器端請求發(fā)起過程恕刘,通過DNS域名解析服務(wù)器IP缤谎,并建...
    七寸知架構(gòu)閱讀 81,039評論 21 356
  • 1. Nginx的模塊與工作原理 Nginx由內(nèi)核和模塊組成,其中褐着,內(nèi)核的設(shè)計非常微小和簡潔坷澡,完成的工作也非常簡單...
    rosekissyou閱讀 10,222評論 5 124
  • 昨夜 你是受了多大的委屈 未眠 天微亮就大聲哭泣 吵醒了狂風(fēng) 發(fā)著起床氣 上班的路人 補課的學(xué)生 無辜的卷入這場紛...
    顧知己閱讀 365評論 0 2