天天看點

nginx 配置參數優化

nginx作為高性能web伺服器,即使不特意調整配置參數也可以處理大量的并發請求。

以下的配置參數是借鑒網上的一些調優參數,僅作為參考,不見得适于你的線上業務。

worker程序

  • worker_processes

    該參數表示啟動幾個工作程序,建議和本機CPU核數保持一緻,每一核CPU處理一個程序。

  • worker_rlimit_nofile

它表示Nginx最大可用的檔案描述符個數,需要配合系統的最大描述符,建議設定為102400。

還需要在系統裡執行ulimit -n 102400才可以。

也可以直接修改配置檔案/etc/security/limits.conf修改

增加:

* soft nofile 655350 

* hard nofile 655350

  • worker_connections

該參數用來配置每個Nginx worker程序最大處理的連接配接數,這個參數也決定了該Nginx伺服器最多能處理多少用戶端請求

(worker_processes * worker_connections),建議把該參數設定為10240,不建議太大。

http和tcp連接配接

  • use epoll

使用epoll模式的事件驅動模型,該模型為Linux系統下最優方式。

  • multi_accept on

使每個worker程序可以同時處理多個用戶端請求。

  • sendfile on

使用核心的FD檔案傳輸功能,可以減少user mode和kernel mode的切換,進而提升伺服器性能。

  • tcp_nopush on

當tcp_nopush設定為on時,會調用tcp_cork方法進行資料傳輸。

使用該方法會産生這樣的效果:當應用程式産生資料時,核心不會立馬封裝包,而是當資料量積累到一定量時才會封裝,然後傳輸。

  • tcp_nodelay on

不緩存data-sends(關閉 Nagle 算法),這個能夠提高高頻發送小資料封包的實時性。

(關于Nagle算法)

【假如需要頻繁的發送一些小包資料,比如說1個位元組,以IPv4為例的話,則每個包都要附帶40位元組的頭,

也就是說,總計41個位元組的資料裡,其中隻有1個位元組是我們需要的資料。

為了解決這個問題,出現了Nagle算法。

它規定:如果包的大小滿足MSS,那麼可以立即發送,否則資料會被放到緩沖區,等到已經發送的包被确認了之後才能繼續發送。

通過這樣的規定,可以降低網絡裡小包的數量,進而提升網絡性能。】

  • keepalive_timeout

定義長連接配接的逾時時間,建議30s,太短或者太長都不一定合适,當然,最好是根據業務自身的情況來動态地調整該參數。

  • keepalive_requests

定義當用戶端和服務端處于長連接配接的情況下,每個用戶端最多可以請求多少次,可以設定很大,比如50000.

  • reset_timeout_connection on

設定為on的話,當用戶端不再向服務端發送請求時,允許服務端關閉該連接配接。

  • client_body_timeout

用戶端如果在該指定時間内沒有加載完body資料,則斷開連接配接,機關是秒,預設60,可以設定為10。

  • send_timeout

這個逾時時間是發送響應的逾時時間,即Nginx伺服器向用戶端發送了資料包,但用戶端一直沒有去接收這個資料包。

如果某個連接配接超過send_timeout定義的逾時時間,那麼Nginx将會關閉這個連接配接。機關是秒,可以設定為3。

buffer和cache(以下配置都是針對單個請求)

  • client_body_buffer_size

當用戶端以POST方法送出一些資料到服務端時,會先寫入到client_body_buffer中,如果buffer寫滿會寫到臨時檔案裡,建議調整為128k。

  • client_max_body_size

浏覽器在發送含有較大HTTP body的請求時,其頭部會有一個Content-Length字段,client_max_body_size是用來限制Content-Length所示值的大小的。

這個限制body的配置不用等Nginx接收完所有的HTTP包體,就可以告訴使用者請求過大不被接受。會傳回413狀态碼。

例如,使用者試圖上傳一個1GB的檔案,Nginx在收完標頭後,發現Content-Length超過client_max_body_size定義的值,

就直接發送413(Request Entity Too Large)響應給用戶端。

将該數值設定為0,則禁用限制,建議設定為10m。

  • client_header_buffer_size

設定用戶端header的buffer大小,建議4k。

  • large_client_header_buffers

對于比較大的header(超過client_header_buffer_size)将會使用該部分buffer,兩個數值,第一個是個數,第二個是每個buffer的大小。

建議設定為4 8k

  • open_file_cache

該參數會對以下資訊進行緩存:

打開檔案描述符的檔案大小和修改時間資訊;

存在的目錄資訊;

搜尋檔案的錯誤資訊(檔案不存在無權限讀取等資訊)。

格式:open_file_cache max=size inactive=time;

max設定緩存檔案的數量,inactive設定經過多長時間檔案沒被請求後删除緩存。

建議設定 open_file_cache max=102400 inactive=20s;

  • open_file_cache_valid

指多長時間檢查一次緩存的有效資訊。建議設定為30s。

  • open_file_cache_min_uses

open_file_cache指令中的inactive參數時間内檔案的最少使用次數,

如,将該參數設定為1,則表示,如果檔案在inactive時間内一次都沒被使用,它将被移除。

建議設定為2。

壓縮

對于純文字的内容,Nginx是可以使用gzip壓縮的。使用壓縮技術可以減少對帶寬的消耗。

由ngx_http_gzip_module子產品支援

配置如下:

gzip on; //開啟gzip功能
  gzip_min_length 1024; //設定請求資源超過該數值才進行壓縮,機關位元組
  gzip_buffers 16 8k; //設定壓縮使用的buffer大小,第一個數字為數量,第二個為每個buffer的大小
  gzip_comp_level 6; //設定壓縮級别,範圍1-9,9壓縮級别最高,也最耗費CPU資源
  gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些類型的檔案需要壓縮
  gzip_disable "MSIE 6\."; //IE6浏覽器不啟用壓縮      

測試:

"Accept-Encoding: gzip, deflate" http://www.aminglinux.com/1.css      

日志

  • 錯誤日志級别調高,比如crit級别,盡量少記錄無關緊要的日志。
  • 對于通路日志,如果不要求記錄日志,可以關閉,
  • 靜态資源的通路日志關閉

靜态檔案過期

對于靜态檔案,需要設定一個過期時間,這樣可以讓這些資源緩存到用戶端浏覽器,

在緩存未失效前,用戶端不再向服務期請求相同的資源,進而節省帶寬和資源消耗。

配置示例如下:

js)$ 
  {
  expires 1d; //1d表示1天,也可以用24h表示一天。      

作為代理伺服器

Nginx絕大多數情況下都是作為代理或者負載均衡的角色。
  因為其他文章已經介紹過以下參數的含義,在這裡隻提供對應的配置參數:
  http
  {
      proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g;
      ...;
      server
      {
      proxy_buffering on;
      proxy_buffer_size 4k;
      proxy_buffers 2 4k;
      proxy_busy_buffers_size 4k;
      proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
      proxy_max_temp_file_size 20M;
      proxy_temp_file_write_size 8k;
    
      location /
      {
          proxy_cache my_zone;
          ...;
      }
      }
  }      

SSL優化

  • 适當減少worker_processes數量,因為ssl功能需要使用CPU的計算。
  • 使用長連接配接,因為每次建立ssl會話,都會耗費一定的資源(加密、解密)
  • 開啟ssl緩存,簡化服務端和用戶端的“握手”過程。
//緩存為10M
  ssl_session_timeout 10m; //會話逾時時間為10分鐘      

繼續閱讀