本文主要從以下幾點講解如何優化Nginx,以增強高並場景中Nginx的吞吐量。
- 調整worker_processes和worker_connections參數
- 關閉access.log日誌打印
- 使用Gzip壓縮
- 緩存靜態文件
- TCP Fast Open
Nginx的優化主要是基於nginx.conf文件中的屬性做修改,所以比較簡單,但是由於服務器配置、環境以及所承載的服務的不同,導致配置的屬性參數並不一定要按照本文中所給的做修改,最好的建議是根據自己服務器的情況,逐一修改參數並做測試。
優化Nginx之前,請確保備份了nginx.conf文件。
1. 調整worker_processes和worker_connections
worker_processes和worker_connections的優化,是爲了確保nginx同一時間最大連接數達到最優
1) worker_processes
worker_processes指Nginx的工作進程,這個值是直接受到服務器CPU核數量影響的(當然也有其他影響),Nginx默認配置爲auto,意思是會自動檢測CPU核做修改,建議worker_processes的值直接修改爲CPU的核數。
Linux系統可通過命令lscpu查看cpu核數,假如爲4,則:worker_processes: 4
2) worker_connections
worker_connections指單個進程能併發處理的最大連接數,包含了所有的Nginx鏈接(不僅僅來源於web客戶端),默認值是
768,在一些(瞬間)併發量較高的場景中,這個值是遠遠不夠用的。
Nginx官方示例中給定單個進程的worker_connections設置是1024,可以根據worker_processes的值做調整。
即:worker_connections = worker_processes * 1024
建議按照服務器的實際情況來調整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: 代表<span data-type="color" style="color:rgb(0, 0, 0)"><span data-type="background" style="background-color:rgb(255, 255, 255)">worker進程的最大打開文件數限制。如果沒設置的話,這個值爲操作系統的限制。設置後你的操作系統和Nginx可以處理比“ulimit -a”更多的文件,所以把這個值設高,這樣Nginx就不會有“too many open files”問題了</span></span>
__use epoll: use__指Nginx的鏈接處理方式,Linux服務器可以配置爲epoll,其他參數的使用可參看鏈接
multi_accept on: <span data-type="color" style="color:rgb(0, 0, 0)"><span data-type="background" style="background-color:rgb(255, 255, 255)">告訴Nginx收到一個新連接通知後接受儘可能多的連接</span></span>
其中,worker_rlimit_nofile默認值是2000,可以將這個值增大到worker_processes*worker_connections
,具體可更根據服務器情況調整,但是要注意,<span data-type="color" style="color:rgb(61, 70, 77)">worker_connections的值不能超過worker_rlimit_nofile</span><span data-type="color" style="color:rgb(61, 70, 77)">。</span>
參考示例:
...
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: <span data-type="color" style="color:rgb(37, 37, 37)">gzip壓縮的http響應的最小長度。通過讀取Content-Length中數值判斷是否需要被壓縮,建議設置爲1k以上,小於1k的數據可能會越壓越大</span>
gzip_proxied: Nginx作爲反向代理的時候使用,具體用法可以直接使用官方默認的配置。
gzip_types: 壓縮數據類型,可以根據自己的服務刪減
<span data-type="color" style="color:rgb(61, 70, 77)"><span data-type="background" style="background-color:rgb(255, 255, 255)">gzip_disable: </span></span><span data-type="color" style="color:rgb(61, 70, 77)"><span data-type="background" style="background-color:rgb(255, 255, 255)">爲指定的客戶端禁用gzip功能。可以設置成IE6或者更低版本以使我們的方案能夠廣泛兼容。</span></span>
更多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,來驗證之前連接過的客戶端,從而達到在三次握手最終的<span data-type="color" style="color:rgb(34, 34, 34)"><span data-type="background" style="background-color:rgb(255, 255, 255)">ACK包收到之前就開始發送數據。</span></span>
具體配置可參看https://www.keycdn.com/support/tcp-fast-open/
參考文章:
- http://blog.51cto.com/liuqunying/1420556
- http://nginx.org/en/docs/ngx_core_module.html
- http://nginx.org/en/docs/events.html
- http://nginx.org/en/docs/http/ngx_http_gzip_module.html
- https://blog.csdn.net/jessonlv/article/details/8016284
- https://www.oschina.net/translate/nginx-setup
- https://serversforhackers.com/c/nginx-caching
- https://www.keycdn.com/support/tcp-fast-open/