高併發場景中nginx的優化方案

本文主要從如下幾點講解如何優化Nginx,以加強高並場景中Nginx的吞吐量。javascript

  1. 調整worker_processes和worker_connections參數
  2. 關閉access.log日誌打印
  3. 使用Gzip壓縮
  4. 緩存靜態文件
  5. TCP Fast Open

Nginx的優化主要是基於nginx.conf文件中的屬性作修改,因此比較簡單,可是因爲服務器配置、環境以及所承載的服務的不一樣,致使配置的屬性參數並不必定要按照本文中所給的作修改,最好的建議是根據本身服務器的狀況,逐一修改參數並作測試。css

優化Nginx以前,請確保備份了nginx.conf文件。html

1. 調整worker_processes和worker_connections

worker_processes和worker_connections的優化,是爲了確保nginx同一時間最大鏈接數達到最優

1) worker_processes

worker_processes指Nginx的工做進程,這個值是直接受到服務器CPU核數量影響的(固然也有其餘影響),Nginx默認配置爲auto,意思是會自動檢測CPU核作修改,建議worker_processes的值直接修改成CPU的核數。java

Linux系統可經過命令lscpu查看cpu核數,假如爲4,則:worker_processes: 4nginx

2) worker_connections

worker_connections指單個進程能併發處理的最大鏈接數,包含了全部的Nginx連接(不單單來源於web客戶端),默認值是
768,在一些(瞬間)併發量較高的場景中,這個值是遠遠不夠用的。web

Nginx官方示例中給定單個進程的worker_connections設置是1024,能夠根據worker_processes的值作調整。
即:worker_connections = worker_processes * 1024json

建議按照服務器的實際狀況來調整worker_connections的值。緩存

3) worker_rlimit_nofile、use epoll、multi_accept on

除了worker_processes和worker_connections,還須要關注如下幾個概念:服務器

  • worker_rlimit_nofile
  • use epoll
  • multi_accept on

worker_rlimit_nofile: 表明worker進程的最大打開文件數限制。若是沒設置的話,這個值爲操做系統的限制。設置後你的操做系統和Nginx能夠處理比「ulimit -a」更多的文件,因此把這個值設高,這樣Nginx就不會有「too many open files」問題了
use epoll: use指Nginx的連接處理方式,Linux服務器能夠配置爲epoll,其餘參數的使用可參看連接
multi_accept on: 告訴Nginx收到一個新鏈接通知後接受盡量多的鏈接cookie

其中,worker_rlimit_nofile默認值是2000,能夠將這個值增大到worker_processes*worker_connections,具體可更根據服務器狀況調整,可是要注意worker_connections的值不能超過worker_rlimit_nofile

參考示例:

...
worker_processes 4;
worker_rlimit_nofile 16384;
...
events {
    use epoll;
    multi_accept on;
    worker_connections 4096;
}
...

2. 關閉access.log日誌打印

關閉access.log操做比較簡單,只須要將對應的代碼註釋掉,而後添加 access_log off;

參考示例:

# access_log /var/log/nginx/access.log;
access_log off;

假如Nginx只是作代理服務,建議去掉access.log的打印。

3. 使用Gzip壓縮

Nginx的Gzip模塊提供了對http傳輸數據(諸如:文本、json、js、css、xml等)的壓縮,默認配置中gzip是關閉了的,開啓須要去掉Gzip壓縮命令的註釋便可。

參考示例:

gzip on;
gzip_min_length 1024;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/json application/xml;
gzip_disable msie6;

gzip_min_length: gzip壓縮的http響應的最小長度。經過讀取Content-Length中數值判斷是否須要被壓縮,建議設置爲1k以上,小於1k的數據可能會越壓越大
gzip_proxied: Nginx做爲反向代理的時候使用,具體用法能夠直接使用官方默認的配置。
gzip_types: 壓縮數據類型,能夠根據本身的服務刪減
gzip_disable: 爲指定的客戶端禁用gzip功能。能夠設置成IE6或者更低版本以使咱們的方案可以普遍兼容。

更多Gzip設置能夠參考連接

4. 緩存靜態文件

PC互聯網時代,不少站長都會選擇生成靜態網頁存放到服務器對應路徑的方式來組織本身的網站,不少內容諸如html、js、css、圖片文件,很長時間纔會更新一次,那麼考慮使用Nginx緩存或者CDN緩存是一個很好的方式,能夠大幅度下降網絡帶寬的請求。

Nginx文件緩存,主要是針對/etc/nginx/sites-enabled文件夾下的host文件修改。

參考示例:

location ~*  \.(jpg|jpeg|png|gif|ico|css|js)$ {
   expires 365d;
}

以上示例,針對圖片、css、js作365天的緩存,更多用法能夠參考連接

5. TCP Fast Open

TCP Fast Open(簡稱:TFO)是TCP的一個擴展,TCP三次握手的第一步,發送方會向接收方發送一個SYN包,而TCP Fast Ope所作的事情就是在SYN包裏增長TFO cookie,來驗證以前鏈接過的客戶端,從而達到在三次握手最終的ACK包收到以前就開始發送數據。

具體配置可參看https://www.keycdn.com/support/tcp-fast-open/

參考文章:

  1. http://blog.51cto.com/liuqunying/1420556
  2. http://nginx.org/en/docs/ngx_core_module.html
  3. http://nginx.org/en/docs/events.html
  4. http://nginx.org/en/docs/http/ngx_http_gzip_module.html
  5. https://blog.csdn.net/jessonlv/article/details/8016284
  6. https://www.oschina.net/translate/nginx-setup
  7. https://serversforhackers.com/c/nginx-caching
  8. https://www.keycdn.com/support/tcp-fast-open/
相關文章
相關標籤/搜索