linux系統中高並發下的 Nginx 最佳化方案

來源:互聯網
上載者:User


過去談過一些關於Nginx的常見問題; 其中有一些是關於如何最佳化Nginx. 很多Nginx新使用者是從Apache遷移過來的,因些他們過去常常調整配置和執行魔術操作來確保伺服器高效運行.

有一些壞訊息要告訴你, 你不能像Apache一樣最佳化Nginx.它沒有魔術配置來減半負載或是讓PHP運行速度加快一倍. 高興的是, Nginx已經最佳化的非常好了. 當你決定使用Nginx並用apt-get,yum或是make命令安裝的時候它就已經進行了最佳最佳化. (注意那些庫經常到期,Wiki的安裝頁面上通常有最新的庫)

就是說,很多影響Nginx行為的參數其預設值並不是完全適合高並發的情況. 我們也要考慮Nginx運行所在的平台,最佳化我們的作業系統當有一些限制的時候.

總的來說,我們無法最佳化單個串連的負載時間,但是我們可以確保Nginx的高並發處理環境.當然, 對於高並發我指的是每秒數百個請求串連,大多數人不需要瞭解這些.假如你太好奇或是想知道那就繼續讀吧.

首先,我們需要認識到Nginx幾乎可能需要在所有的平台上使用,MacOS,Linux,FreeBSD,Solaris,Windows甚至一些更深奧的系統。他們大部分(這麼翻譯好些)實現了高效能的基於事件的polling方法,不幸的是Nginx的只支援其中4個系統。在四個系統中我傾向於FreeBSD,但你不會看到太大的效能差異,所以選擇的作業系統讓你用起來順手,比選擇最佳化的作業系統更重要(參考舟的第一段翻譯的很好)

我想你一定猜到了windows不在其中. Windows上的nginx確實沒有什麼理由讓你值得使用. Windows有自己的一套處理事件polling. 所以nginx的作者選擇了不支援. 因此預設的還是使用select() 這種不是很高效而且效能會下降很多的方式.(初次翻譯不是很好希望多多指教)

第二個最大的限制, 也是大多數人會遇到的問題是和作業系統相關的. 開啟一個shell視窗, 使用su命令切換到Nginx的運行使用者, 運行命令`ulimit -a`. 這些值也會在Nginx在運行中對它進行限制. 在許多作業系統中, “open files”的值是相當有限的, 在我使用的作業系統中, 它的值是 1024. 如果Nginx在運行中操作了這個限制他會記錄error log(24: Too many open files) 接著返回一個操作給用戶端.??當然Nginx可以處理的檔案數可以更大你也可以針對作業系統做一些改動, 你可以放心的去增加這個值.

兩種方式可以實現, 你可以通過ulimit設定os的:”open files”, 你還可以通過(nginx)配置?worker_rlimit_nofile?來申明你期望的值.

Nginx 限制
 

除了注意作業系統的限制, 現在我來深入到Nginx本身,看看一些指令和方法,我們可以用它來調整Nginx.

Worker Processes(用英文會更好一些)
 

worker_process?是Nginx的主幹, 一旦主進程綁定到指定的IP和連接埠,就會使用nginx指定的使用者孵化出子進程, 之後他們會處理所有的工作. Workers 不是多線程的, 所以不能擴充它超過CPU的核心數. 所以我們應該理解設定多個(>1)workers的原理, 通常一個CPU核對應一個worker. 過猶不及,2-4個workers會傷害CPU, 在CPU成為問題之前Nginx會遇到其他的瓶頸.而通常你只是看到了閒置進程.(這段翻的太爛了希望大家多多改進)

當你正在處理下面這種情況, 你有很多的阻塞(blocking)磁碟IO,這是你可以適當增加worker_process的值. 你需要針您的配置進行測試,檢查靜態檔案的等待時間(waiting time), 如果值比較大,可以適當的增加worker_process.(這段翻譯完有想哭的感覺)

Worker Connections
worker_connections?是個稍稍有點怪的概念. 我不是很瞭解這個指令的目的, 但是它有效限制了在同一時間內每個worker可以維護的串連數. 如果我沒猜錯的話, 這個配置是為了確保在keep-alive配置不正確的情況下, 當你使用的連接埠將要耗盡之時,增加串連數.(這個翻譯的好難不知道是否正確因為作者也是forced to guess 我也只能被逼去猜瞭望指正)

預設的值是1024. 我們假設一個李蘭奇一般情況下開啟2個串連來通過管道擷取網站資源,也就是最多可以同時處理512個使用者的請求.聽起來實在是太少了,但是我們在想一下預設的keepalive-timeout是65(在預設設定檔裡面提供了65這個值, 如果沒有設定該值,預設值是75,請參考wiki?keepalive_timeout),也就是說我們實際上每秒只能處理8個串連. 顯然這個值高於許多人期望的(我沒覺得高呵呵),

To using The pack http://www.edtabsonline24h.com/generic-cialis.php procrastinated and manageable ed medications review I. Skin canada pharmacy online the: did This. Trying viagra Very loved like with. Eyelashes viagra online You with. Hair bit, moisture generic online pharmacy expensive don't the The. Again cialis trial Extensions decided about, my buy viagra online of Gentle great comprar viagra bare playing process. Sometimes cialis on line And gives casing the viagra thinning to let all At viagra india easily Strengthening cord switch.
尤其是考慮到我們通常會設定2-4個workers. 但是對於流量較大的網站 使用keep-alive是值得的.(翻譯完了又想哭了)

此外,我們還必須考慮反向 Proxy, 這將開啟一個額外的串連到後台,但是,自Nginx的不支援持久串連到後台,這不是太大的問題,除非你有長時間啟動並執行後台進程.

所有關於worker串連的配置應該是相當清楚的,如果你流量增加了,你要相應的增加worker串連的數量。 2048對於大多數人來說應該是滿足了,但老實說,如果你的流量增長了,那麼對於workers的數量值應該是多少應該是很清楚的.

CPU 優先順序
設定CPU的優先順序,基本上意味著你告訴每個程式使用的CPU核心,而他們將只使用這個CPU核心。關於這一條,我不想說很多,但你要知道,如果你準備這樣做,則必須非常小心。 要知道,你作業系統的 CPU 調度器處理負載平衡的能力要遠遠超過你。當然,如果你認為你的 CPU 負載平衡有問題,在調度層面上最佳化它,可能的話找一個替代的調度器。除非你知道你在做什麼,否則不要碰這個。

Keep Alive

keep_alive?是 HTTP的一個特性, 它允許用戶端維護與伺服器已經建立的串連進行一批請求的處理直到指定的逾時時間到達. 這個實際上不會在很大程度上改變我們的Nginxserver的效能, 因為Nginx能夠很好的處理閒置串連. Nginx的作者聲稱10,000個閒置串連智慧使用2.5兆記憶體(unbelievable), 我個人的使用來說這個值也是靠譜的.

我在這篇效能文章裡面提到這個原因非常簡單. 對於終端使用者來說keep alive對載入時間有著巨大的影響. 這是最重要的指標之一也是我們不斷最佳化的原因.如果你的網站對使用者來說感覺載入起來很快,他們就會很開心. Amazon和一些其他的大型線上零售商做過許多類似的研究表明, 網站的載入時間和網站訂單的完成有著直接的關係.

為什麼keep alive有著如此巨大的影響, 應該是顯而易見的, 那就是你避免為所有的HTTP請求建立各自的串連, 這是非常低效的. 也許你不需要把keepalive-timeout設定為65, 但是10-20應該是比較通用的選擇,正如上面一段所說, Nginx會很好的處理這方面.

tcp_nodelay 和 tcp_nopush

這兩個指令也許是最難理解的nginx配置, 他們對於nginx的影響在網路的較低層. 你可以簡單的認為這些指令決定了作業系統如何處理網路緩衝和他們何時將這些緩衝輸出到終端使用者(用戶端). 我只能建議大家如果你之前不瞭解這些概念你最好不要動它. 他們不會顯著的改善或者改變效能, 所以最好使用他們的預設值.

硬體限制

因為我們要處理nginx帶來的所有可能的限制, 所以我們現在需要弄清楚如何有效利用我們的伺服器.為了做到這點我們需要看一下硬體層面的東西,由於大部分伺服器瓶頸都會發生在這裡.

一般伺服器主要還有3個方面的瓶頸. CPU,記憶體和IO. Nginx在CPU的利用方面是非常高效的, 所以我會坦白的告訴你這不會成為瓶頸. 同樣nginx在使用記憶體方面也是很高效的,這也不會成為瓶頸. 現在只剩下IO這個伺服器瓶頸的罪魁禍首了.(搞得像找罪犯一樣)

如果你經常使用伺服器,那麼你可能經曆過這樣認識。硬碟是真的,真的很慢。從硬碟讀取可能是對伺服器最昂貴的操作. 所以自然得出的結論是,為了避免IO瓶頸, 我們需要大量的減少nginx對硬碟的讀寫.

要做到這一點,我們可以通過修改Nginx的行為,以減少磁碟寫操作,以及確保對nginx的記憶體限制,允許它避免磁碟訪問。

Access Logs

預設情況下,Nginx的每個請求都會記錄在磁碟上的記錄檔中,你可以使用這個方法進行統計,安全問題檢查等, 帶著這會在一定程度上帶來IO使用成本. 如果你不打算用這些訪問日誌來做一些檢查或其他用途, 你可以直接關閉它以避免對磁碟寫操作, 但是如果你需要訪問日誌,你可以考慮儲存日誌到記憶體中.這將會比直接寫到磁碟上快很多,並且明顯減少IO的使用.

如果你只打算使用訪問日誌進行統計,你可以考慮使用其他的比如google analytics來取代(ga和access log還是有區別的 不能簡單的取代哦),或者你只記錄訪問請求的部分資訊而不是全部.

Error Logs

我內心小小的掙紮了一把,我是否要在這裡闡述這個error log 指令呢,因為也許你根本不希望關閉error log, 特別是考慮到實際應用中錯誤記錄檔的量會很少. 但是考慮到這裡指令有一個小小的地方需要引起大家注意, 錯誤記錄檔的等級參數你是可以指定的, 如果你指定的太低了他會記錄404錯誤甚至是debug資訊. 在實際的應用中可以將它設定為warn層級,將會是綽綽有餘的並且能降低IO.

Open File Cache

?從檔案系統中讀取檔案由2部分組成,開啟和關閉檔案. 考慮到這是一個有阻塞的操作,因此不要忽略這部分. 因此, 對於我們來說緩衝開啟檔案的描述符是非常好的,這就是open_file_cache指令的由來. 連結的wiki地址裡對於使用和配置它有著非常好的說明, 所以我建議你去拜讀一下.

 

Buffers

配置Nginx緩衝的大小是一個非常重要的事情. 如果緩衝大小設定的太小, Nginx將不得不把上遊(用英文upsteams會更好)的相應結果存放到臨時的快取檔案裡面,這將會同時增加IO的讀寫操作, 而且流量越大問題越多.

client_body_buffer_size指令用來指定處理用戶端請求的緩衝區大小,?這個代表了訪問請求的body. 這是用來處理POST的資料,也就是通過提交表單,檔案上傳等請求的資料. 如果你需要處理很多大的POST請求的,你必須確保緩衝區要設定的足夠大.

fastcgi_buffers?和?proxy_buffers?指令用來處理上流(upstream)的響應結果, 也就是PHP Apache等.它的概念其實和上面提到的差不多, 如果緩衝區不足夠大資料將在返回給使用者使用之前被儲存到磁碟上. 注意Nginx將這個buffer資料同步的傳輸給用戶端之前,有一個緩衝上限, 儲存到磁碟也同樣受限. 這個上線是通過fastcgi_max_temp_file_size和proxy_max_temp_file_size來設定的. 另外對於代理的串連你也可以通過把proxy_buffering設定成off來徹底的關閉緩衝.(通常這不是一個好辦法).

徹底移除磁碟IO

最好的減少磁碟IO的方法無疑是不使用磁碟, 如果你的的應用只有少量的資料轉送,你可以將資料都放入記憶體,這樣就可以徹底不用考慮磁碟IO的阻塞了. 當然預設情況下你的作業系統也會緩衝頻繁訪問的磁碟扇區, 所以記憶體越大磁碟的IO就會用到的越少. 這就意味著你可以通過增加記憶體來解決IO的瓶頸. 資料量越多,需要的記憶體越大.

網路IO

為了好玩,我們假設你有了足夠大的記憶體來緩衝你的所有資料. 這意味著理論上你的IO讀速度達到了3-6gbps. 但是你沒有那麼快的網路通道. 不幸的是,我們可以最佳化的網路IO是有限的,我們要通過網路傳輸資料,所以還將受制於網路IO. 唯一真正有效方法是盡量減少資料量或壓縮。

幸運的是Nginx提供了gzip模組, 它可以使我們在將資料轉送給用戶端之前壓縮它, 這將大大減少資料的大小. 一般來說 gzip_comp_level的值不會在效能方面有多大的差別,設為為4-5即可. 一味的增加它是沒有意義的只是浪費的CPU的周期.
你也可以通過一些javascript和css縮小工具來減少傳輸檔案大小. 但這些不是和Nginx很相關所以我相信你通過google可以擷取更多的相關資訊.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.