Nginx的優化調整方面

datapeng發表於2018-11-29

1 、網路層面

頻寬

頻寬對Nginx效能的影響是最為直接的,就算如何獨享10M的頻寬也肯定不如100M頻寬下Nginx的效能。另外,現在大部分公司的網站都擁有多個二級域名在提供服務,而這多個二級域名通常是共享一個出口頻寬的,這樣就造成Nginx來提供服務時,資源會受干擾。

網路質量

在中國的網際網路中,網路質量跟國外是沒法比的,經常出現的情況是客戶端到Nginx服務端總是會經過好幾個路由,但凡其中任何一個路由節點出現問題,會影響最終Nginx服務端的各種效能問題,例如資料重傳、資料超時等

Nginx 直連交換機收斂比

交換機收斂比通常指交換機接伺服器的下行流量跟交換機上行鏈路的比例,一般中型及中小型公司對IDC業務網路沒有過多的規劃,導致交換機收斂比通常是大於1的,也就意味著資料在交換機中是阻塞型轉發,會影響Nginx的資料轉發,尤其是作為反向代理時的影響更大。

Nginx 架構中網路部署方式

大部分網際網路公司通常會採用如下結構的網路:

這種結構對比網際網路公司而言,請求需要經過路由器、防火牆、IDS/IPS等好幾層的裝置最終才能由業務伺服器來響應請求,這期間請求沒經過一層都需要消耗一定的時間,通過累計這個時間就會被放大,而且防火牆的效能直接決定了Nginx可以承載的請求數。所以迫不得已要用防火牆的話,請使用30萬以上的防火牆來做,幾萬的防火牆效能其實達不到業務需求的。

2 、伺服器硬體層面

CPU

Nginx 的工作模型是master-worker方式,簡單來說,越多的worker也就意味著越多的承載力,CPU的核心數從某種程度來說決定了Nginx最佳的worker工作數量。

記憶體

記憶體的容量直接決定了Nginx可承載的最大連線數。

硬碟

Nginx 的使用過程中,容易產生IO的地方還是挺多的,比如各種臨時檔案、錯誤日誌、訪問日誌、快取等。而硬碟的傳輸速度可以影響到這些產生的IO,比如硬碟的轉速、硬碟的容量、硬碟的輸出頻寬等。

網路卡

這裡以戴爾伺服器舉例,戴爾伺服器預設配置的網路卡為Broadcom的,這種網路卡一般使用沒問題,但遇上Nginx在處理大量小包的情況下,預設配置的網路卡就會發生嚴重丟包的事情,核心層面的丟包會造成大量的資料重傳從而影響整個Nginx伺服器的效能。所以對於Nginx而言需要選擇合適的網路卡。

3 、作業系統層面

/etc/sysctl.conf 的配置

很多時候大部分的運維都是從網上覆制貼上sysctl.conf的配置,對於其中一些value的配置都是沒有任何依據,所以容易被出現的各種TCP狀態而擔心。而這些抄來的配置也從根本上影響著Nginx的執行。

系統資源限制

這裡的資源限制主要指檔案控制程式碼數的限制,檔案控制程式碼數的多少限制了Nginx可以支援的最大連線數,不合理的配置會造成Nginx出現大量的500、502錯誤。

IRQ Balance 服務

關於IRQ Balance服務,初衷是為了更好地利用CPU的資源來處理事務,但很多場景下,包括Nginx的應用,這個服務並不能起到利好的作用,反而會引起中斷的不平衡造成Nginx效能下降。

系統開放多餘的埠

嚴格來說,這種情況發生的機率還是比較低的。一般沒有做運維標準化的公司,在伺服器安裝系統時,預設就會開啟很多的服務,比如sendmail、postfix、ntpd、bind等等,這些服務一般監聽在所有的IP上,也就意味著Nginx部署在這種環境下,一旦有惡意攻擊者攻擊非Nginx的埠,就會造成整個伺服器資源被耗盡(DDoS的典型症狀),從而讓Nginx失去服務能力。

4 、Nginx層面

編譯進業務不需要的模組

有很多運維對於Nginx的安裝大部分都是用yum或者apt-get進行安裝,這種安裝基本上都會把一些不需要的模組編譯進去,在Nginx提供高併發時多少還是要消耗一定的記憶體資源,前面我們說了記憶體直接決定了Nginx能夠承載多少連線的能力。

糟糕的配置

很多人發揮不了Nginx的效能,主要原因就是對Nginx的配置不熟悉,對於Nginx的引數指令不瞭解,所以各種各樣的配置五花八門,這裡實在沒法一一列舉,詳情可以參看度娘,一搜一大片。

快取使用不合理

Nginx 的快取,本意是為了提升Nginx的處理能力,降低上游伺服器的壓力,而大部分運維也是從網上抄,於是帶來的結果就是快取的不合理配置造成響應延時過高、快取清理麻煩等問題。

5 、上游伺服器層面

Nginx 在大部分的應用場景要麼是通過http協議來反向代理上游伺服器,要麼是通過fastcgi協議來代理php應用,這兩類應用也是會對Nginx自身的效能帶來影響的。

PHP 應用

當前一般都是使用PHP-FPM來提供fastcgi協議的接入,PHP的版本以及PHP-FPM的配置都會造成Nginx反代php-fpm時,容易發生502、504的錯誤。

Java 應用

一般用於Java應用都逃不過Tomcat、jetty、resin,如果出現容器本身配置不合理、JVM不優化、Java容器選擇不合理,將直接影響Nginx做反代時的併發能力。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29371470/viewspace-2222119/,如需轉載,請註明出處,否則將追究法律責任。

相關文章