首頁 > 軟體

nginx有哪些常規調優手段詳解

2023-01-20 14:03:13

前言

大部分web應用都使用了nginx做負載均衡伺服器,下面總結了nginx.conf中一些可以微調的設定。需要注意一點,這不是一個全面的微調指南。這是一個簡單的預覽——那些可以通過微調來提高效能設定的概述。你的情況可能不同。

nginx設定說明

nginx.conf中主要分高層設定、Events模組、HTTP 模組三個模組。下面依次介紹個模組可以微調的設定。

高層設定

user admin;                               #定義Nginx執行的使用者
error_log ar/loginx/error.log info;       #全域性錯誤紀錄檔定義型別,[ debug | info | notice | warn | error | crit ]
access_log off;                           #定義本虛擬主機的存取紀錄檔
pid ar/runinx.pid;                        #程序檔案
worker_processes auto;                    #nginx程序數
worker_rlimit_nofile 65535;               #一個nginx程序開啟的最多檔案描述符數目

可以微調的設定:

  • worker_processes:建議設定為等於CPU總核心數。
  • worker_rlimit_nofile:理論值應該是最多開啟檔案數(系統的值ulimit -n)與nginx程序數相除,但是nginx分配請求並不均勻,所以建議與ulimit -n的值保持一致。

Events模組

events {
use epoll;                   #設定用於複用使用者端執行緒的輪詢方法,[ kqueue | rtsig | epoll | /dev/poll |    select | poll ]
worker_connections 65535;    #單個程序最大連線數(最大連線數=連線數*程序數)
multi_accept on;             #開啟後告訴nginx收到一個新連線通知後接受盡可能多的連線
}

可以微調的設定:

  • use:如果你使用Linux 2.6+,你應該使用epoll。如果你使用BSD,你應該使用kqueue。
  • worker_connections:設定可由一個worker程序同時開啟的最大連線數。如果設定了上面提到的worker_rlimit_nofile,我們可以將這個值設得很高。記住,最大客戶數也由系統的可用socket連線數限制(~ 64K),所以設定不切實際的高沒什麼好處。

HTTP 模組

HTTP模組控制著nginx http處理的所有核心特性,內容比較多,這裡分批說明。

http{
server_tokens off;                        #開啟或關閉在錯誤資訊的「Server」響應頭中輸出nginx版本號
include mime.types;                       #副檔名與檔案型別對映表
default_type application/octet-stream;    #預設檔案型別
charset utf-8;                            #預設編碼
server_names_hash_bucket_size 128;        #伺服器名字的hash表大小
client_header_buffer_size 32k;            #設定讀取使用者端請求頭部的緩衝容量
large_client_header_buffers 4 64k;        #設定讀取使用者端請求超大請求的緩衝最大number(數量)和每塊緩衝的size(容量)
client_max_body_size 8m;                  #設定請求快取
sendfile on;                              #開啟高效檔案傳輸模式
autoindex on;                             #開啟目錄列表存取,合適下載伺服器,預設關閉。
tcp_nopush on;                            #開啟或者關閉nginx在FreeBSD上使用TCP_NOPUSH通訊端選項
tcp_nodelay on;                           #開啟或關閉nginx使用TCP_NODELAY選項的功能
keepalive_timeout 120;                    #長連線超時時間,單位是秒
reset_timedout_connection on;             #開啟或關閉重置超時連線的功能
...
}

可以微調的設定:

  • sendfile:指定nginx是否呼叫sendfile函數來輸出檔案,對於普通應用設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,以平衡磁碟與網路I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。
  • tcp_nopush: 選項僅在使用sendfile的時候才開啟。告訴nginx在一個封包裡傳送所有標頭檔案,而不一個接一個的傳送。
  • tcp_nodelay:這個選項僅在將連線轉變為長連線的時候才被啟用。告訴nginx不要快取資料,而是一段一段的傳送——當需要及時傳送資料時,就應該給應用設定這個屬性,這樣傳送一小塊資料資訊時就不能立即得到返回值。
  • reset_timedout_connection:重置連線是這樣執行的:關閉通訊端以前,設定SO_LINGER選項的超時值為0, 那麼當關閉通訊端時,nginx向用戶端傳送TCP RST,並且釋放此通訊端佔用的所有記憶體。 這樣可以避免某個已關閉的通訊端長時間處於FIN_WAIT1狀態,並佔用記憶體緩衝區。應該注意的事,超時的長連線仍然是正常關閉。
  • client_header_buffer_size:設定讀取使用者端請求頭部的緩衝容量。 對於大多數請求,1K的緩衝足矣。 但如果請求中含有的cookie很長,或者請求來自WAP的使用者端,可能請求頭不能放在1K的緩衝中。 如果從請求行,或者某個請求頭開始不能完整的放在這塊空間中,那麼nginx將按照 large_client_header_buffers指令的設定分配更多更大的緩衝來存放。
  • large_client_header_buffers:HTTP請求行的長度不能超過一塊緩衝的容量,否則nginx返回錯誤414 (Request-URI Too Large)到使用者端。 每個請求頭的長度也不能超過一塊緩衝的容量,否則nginx返回錯誤400 (Bad Request)到使用者端。 緩衝僅在必需是才分配,預設每塊的容量是8K位元組。 即使nginx處理完請求後與使用者端保持入長連線,nginx也會釋放這些緩衝。

gzip模組設定

gzip on;                                                                    #開啟gzip壓縮輸出
gzip_min_length 1k;                                                         #最小壓縮長度
gzip_buffers 4 16k;                                                         #壓縮緩衝區
gzip_http_version 1.0;                                                      #壓縮版本
gzip_comp_level 2;                                                          #壓縮等級
gzip_types text/plain application/x-javascript text/css application/xml;    #壓縮型別。
limit_zone crawler $binary_remote_addr 10m;                                 #開啟限制IP連線數的時候需要使用
upstream 127.0.0.1 {                                                        #負載均衡
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}

可以微調的設定:

  • upstream:upstream負載均衡,weight是權重,可以根據機器設定定義權重。weigth參數列示權值,權值越高被分配到的機率越大。

虛擬主機的設定

server{
listen 80;                                                      #監聽埠
server_name www.cainiao.com cainiao.com;                        #域名可以有多個,用空格隔開
 
location / {                                                    #對 "/" 啟用反向代理
proxy_pass 127.0.0.1:8080;                                      #設定後端伺服器的協定和地址
#root /home/admin/pac; #請求根目錄
#index index.html index.htm; #主頁
 
#後端的Web伺服器可以通過X-Forwarded-For獲取使用者真實IP
proxy_set_header X-Real-IP $remote_addr;       
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
#以下是一些反向代理的設定,可選。
proxy_set_header Host $host;
client_max_body_size 10m;                                       #允許使用者端請求的最大單檔案位元組數
client_body_buffer_size 128k;                                   #緩衝區代理緩衝使用者端請求的最大位元組數,
proxy_connect_timeout 90;                                       #nginx跟後端伺服器連線超時時間(代理連線超時)
proxy_send_timeout 90;                                          #後端伺服器資料回傳時間(代理傳送超時)
proxy_read_timeout 90;                                          #連線成功後,後端伺服器響應時間(代理接收超時)
proxy_buffer_size 4k;                                           #設定代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小
proxy_buffers 4 32k;                                            #proxy_buffers緩衝區,網頁平均在32k以下的設定
proxy_busy_buffers_size 64k;                                    #高負荷下緩衝大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;                                 #設定快取資料夾大小,大於這個值,將從upstream伺服器傳
}
}

附錄: nginx組態檔詳解

//定義一個使用者以及對應的組

user admin admin 

//定義nginx worker 程序的數量,設定為auto,就是預設和CPU個數一致

work_processess  auto     

//與上面的指令協同工作。他可以讓你的worker程序影響CPU核心,數位序列和work程序一樣多

work_cpu_affinity auto    


//nginx錯誤紀錄檔,有debug,warn, error等五個等級

error_log  /home/admin/web/logs/error.log warn  

//用於存放nginx守護行程的PID檔案路徑, 裡面記錄了主程序的pid號

pid  /home/admin/nginx/logs/nginx-search.pid; 

//定義每個work程序的核心檔案大小

worker_rlimit_core  1024M

 //定義一個worker程序可以同時處理的檔案數量

worker_rlimit_nofile 100000 

 //與events模組一起提供的指令可以用來設定網路機制,指令引數對nginx效能產生影響

events{       
    //定義一個worker程序能夠同時連線的數量
     worker_connectins 10240; 
     use epoll;  
  }


//該區段嵌入組態檔的根部,在該區段允許定義指令和嵌入HTTP相關模組

-http{

      //隱藏nginx的版本號, 出現400 500 頁面時候不會顯示nginx伺服器的版本號,避免漏洞

       server_token off;  

      //檔案包含指令; mime.type檔案裡面儲存了nginx的MIME型別; 裡面其實也是一個types{...}

        include mime.type

      // 該指令允許你在MIME型別和副檔名之間建立聯絡, 可以補充mime.type檔案沒有對應關係

       types{ 

             application/x-compress  .Z;  
             application/x-gzip      .gz .tgz;

             application/x-httpd-php .php .html;

         }

        //定義預設的MIME型別,如果副檔名與mime.type中型別都不匹配,就將該值寫進content-type

      default_type text/plain;

       //如果該指令被啟用,Nginx將使用sendFile 核心來呼叫檔案傳遞。如果禁用,那麼nginx將自己處理檔案傳遞

      sendfile            on;  

      //該選項只用於sendfile已啟動的情況。若為on, 那麼nginx將嘗試單個TCP封包中傳送整個HTTP響應頭

       tcp_nopush       on; 
 

       //keep-alive能夠使使用者端到伺服器的連結在一定時間內持續有效,在這個時間內,使用者端對伺服器的存取不需要再次建立連結

      keepalive_timeout 0; 

       client_header_timeout   30s; 

       //指定持有使用者端請求主體的快取大小,如果超過這個大小,那麼主體將被寫到磁碟

       client_body_buffer_size 32k; 


      /**gzip是一種壓縮技術。經過gzip壓縮後頁面大小可以變為原來的30%甚至更小**/

       //開啟gzip模組  off為關閉

          gzip                    on;   

        //識別http的協定版本

        gzip_http_version       1.0;  

        //gzip壓縮比,1壓縮比最小,9壓縮比最大,相應的速度也會變慢

        gzip_comp_level         6; 

       // 設定允許壓縮的頁面最小位元組數,預設為0,頁面多大都壓縮

        gzip_min_length         1024; 

       //啟用或者禁用gzip壓縮,針對代理伺服器上接收到的相應體

        gzip_proxied            any;  

      //有的瀏覽器支援壓縮,有的不支援,為了避免浪費,根據HTTP頭來判斷是否需要壓縮

        gzip_vary               on;

       gzip_disable            msie6; //???

       //設定系統獲取幾個單位的快取用於儲存gzip的壓縮結果資料流

        gzip_buffers            64 8k; 

        //匹配mime型別進行壓縮,無論是否制定「text/html」型別總會被壓縮

        gzip_types              text/xml text/plain text/css application/javascript application/x-              javascript application/rss+xml;  


        //定義檔案的根目錄,該目錄包含你希望為存取者提供的內容

        root   /home/admin/web/htdocs; 

        //定義一個預設的頁面,如果請求中沒有指定檔名,nginx就會使用該頁面提供服務。

         index    index.html index.php index.htm; 
      //proxy_set_header nginx作為反向代理伺服器,將請求轉發給後端真實伺服器,如果不行host的重寫,所有的真是伺服器都會誤認為是nginx伺服器傳送的請求。 proxy_set_header就是用於將使用者端真實的host, ip資訊,傳送給後端伺服器。      http://www.ithov.com/linux/109626_3.shtml

       proxy_set_header        Host $host;

         //在這裡X-Real-IP是一個自定義的變數名,名字可以隨意取,在web端可以用request.getAttribute("X-Real-IP")  獲取IP  
      proxy_set_header        X-Real-IP $remote_addr;

      proxy_set_header        Web-Server-Type nginx;  

        // 如果需要修改從被代理伺服器傳來的應答頭中的」Location」和」Refresh」欄位,可以用指令設定。  

      proxy_redirect          off;   
      proxy_buffers           128 8k;  
      proxy_intercept_errors  on;
 

      //開啟或者禁用404沒有找到HTTP錯誤。例如,如果紀錄檔中充滿了404錯誤,卻由於   robots.txt檔案,那麼你可以將這個選項關閉掉;

      log_not_found       off;
     

      // 用於定義發生制定的錯誤程式碼時候,使用errror_page來定義伺服器的行為。最簡單的形式是使用一個錯誤程式碼改變URI

     error_page  403 404 405   http://www.jd.com/home/error.php;

      error_page    500 501 502   http://www.jd.com/home/error2.php;

      expires_by_types modified +3y image/gif image/jpeg image/jpg text/css application/x-shockwave-flash;    

       //限制被定義的zone的請求總數,$binary_remote_addr用於區分使用者端, rate表示每秒的請求數(r/s)或者每分鐘請求數(r/m)
       limit_req_zone      $binary_remote_addr     zone=one:100m   rate=5r/s;


      #virtual servers 

      server{

          //指定用於提供web服務站點監聽的通訊端所使用的IIP和埠  

          listen  80;  

          //在server區段指定一個或者多個主機名(hostname),  Nginx接收到HTTP請求以後,會與所有server區段相比較,然後找到與使用者端請求header中Host匹配的server區段。如果沒有與使用者端匹配的server區段,nginx會選擇第一個server區段。該指令接受萬用字元  

          server_name wenda.taobao.com q.etao.com wenda.etao.com;
 

          // 定義一個紀錄檔模板用於描述存取紀錄檔中一條包含的內容,該模板由access_log指令使用  

          log_format   eformat      '     remoteaddr r e m o t e a d d r request_time_usec     remoteuser[ r e m o t e u s e r [ time_local] '      '"requestmethodhttp://   r e q u e s t m e t h o d h t t p : / / hostrequesturi"   r e q u e s t u r i " status $body_bytes_sent '  

 '"    httpreferer"" h t t p r e f e r e r "" http_user_agent"';

          //該指令定了存取紀錄檔檔案的路徑

          access_log          "pipe: /opt/taobao/install/cronolog/sbin/cronolog /home/admin/web/logs/search/%Y/%m/%d/access-%Y-%m-%d_%H.log" eformat;  
 

          //定義檔案的根目錄,該目錄包含你希望為存取者提供的內容  

          root                /home/admin/web/htdocs/;   

           //limit_req_one 同上,burst定義了最大可能的突發請求, 在一定程度上,burst定義的值就是隻能同時接受最大數量的請求值  

          limit_req zone=one burst=5 nodelay; 

 

           //set_by_lua指令支援通過一小段使用者Lua程式碼來計算出一個結果,然後複製給Nginx 變數,和set指令相似

           //Lua程式碼中,通過ngx.var.VARIABLE來讀取Nginx的變數; 下面的一段程式碼是用於修復comons-fileupload-1.0版本的漏洞

           set_by_lua     invalid_ct 'local ct = ngx.var.http_content_type  if ct and #ct >= 2049 then return 1 else return 0 end';            if (   invalid_ct 'local ct = ngx.var.http_content_type  if ct and #ct >= 2049 then return 1 else return 0 end';            if ( invalid_ct = '1') { return 400; }

 

                //根據host 進行跳轉的判斷  

             if ($host = 'q.jd.com'){

                  //該指令允許你對當前請求的URI 進行重寫,因此對使用者端的請求會被重新設定

                  //格式為  rewrite  regexp replacement 【flag】 ;;  flag 包含:last, break,redirect, permanent

                  // regexp 是URI正規表示式,他的目的是匹配後面的replacement  

                  //permanent 返回301 重定向響應,被替代的URI作為location頭的值(瀏覽器顯示跳轉之後URL地址)

                 rewrite ^/(.*)    http://wenda.jd.com/  http://wenda.jd.com/1 permanent;  
          }

 

          location ~ .(do|htm|vhtml|service|jhtml)$ {
                      //在設定proxy_pass的時候需要注意:http://dmouse.iteye.com/blog/1880474
                      //符合location 樣式跳轉地址; 這個指令設定被代理伺服器的地址和被對映的URI,地址可以使用主機名或IP加埠號的形式。
                      proxy_pass   http://127.0.0.1:8000;

                       //拒絕存取的IP欄位
             			deny 113.59.*.*; 
             }

}

更多參考

更詳細的模組引數請參考:http://nginx.org/cn/docs/

核心模組:http://nginx.org/cn/docs/http/ngx_http_core_module.html

總結

到此這篇關於nginx有哪些常規調優手段詳解的文章就介紹到這了,更多相關nginx常規調優手段內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com