前面講了如何配置Nginx虛擬主機,如何配置服務日誌等很多基礎的內容,大家可以去這裡看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category/1529997.html 。
今天要說的是Nginx伺服器高效能優化的配置,如何使Nginx輕鬆實現10萬併發訪問量。
通常來說,一個正常的 Nginx Linux 伺服器可以達到 500,000 – 600,000 次/秒 的請求處理效能,如果Nginx伺服器經過優化的話,則可以穩定地達到 904,000 次/秒 的處理效能,大大提高Nginx的併發訪問量。
這裡需要特別說明的是:
1、本文中所有列出來的配置都是在我的測試環境驗證的,你需要根據你伺服器的情況進行配置。
2、Nginx的優化需要進行進行壓力測試,這裡壓力測試用的是Apache ab測試工具,不熟悉的可以看看我之前的文章:《如何使用apache ab效能測試工具進行壓力測試》
一、優化思路
分析:nginx要成功響應請求,會有如下兩個限制:
1、nginx接受的tcp連線多,能否建立起來?
2、nginx響應過程,要開啟許多檔案,能否開啟?
所以,只要我們針對上面兩個限制進行優化,就能大幅提升Nginx的效率。
二、優化步驟
我們知道Nginx的工作流程如下圖所示:
一、步驟:
1. 找到Nginx伺服器瓶頸。
2. 優化配置。
3. 重新壓力測試
注意:在配置修改之後務必要進行壓力測試,這樣可以觀測到具體是哪個配置修訂的優化效果最明顯。通過這種有效測試方法可以為你節省大量時間。
二、找出Nginx的瓶頸
1. 開啟Apache ab壓力測試工具,輸入如下命令:ab -n 200000 -c 5000 http://localhost:8080/index.html。
2. 檢視Nginx 狀態資訊
在瀏覽器中輸入nginx的地址:http://127.0.0.1/status,檢視nginx的狀態資訊。
注意檢視connections,waiting等引數資訊。從而確定如何優化相關引數。
Nginx 狀態資訊開啟的方法,這裡就不細說了,不清楚的可以看我之前的文章,《Nginx總結(八)啟用Nginx Status及狀態引數詳解》
三、優化配置
根據上面的方法總結起來,一般來說nginx 配置檔案中對優化比較有作用的為以下幾項:
Nginx優化配置項:
1)優化 workprocess,cpu
worker_processes 8; // 根據CPU核數配置
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
2)事件處理模型優化
nginx的連線處理機制在於不同的作業系統會採用不同的I/O模型,Linux下,nginx使用epoll的I/O多路複用模型,在freebsd使用kqueue的IO多路複用模型,在solaris使用/dev/pool方式的IO多路複用模型,在windows使用的icop等等。
要根據系統型別不同選擇不同的事務處理模型,我們使用的是Centos,因此將nginx的事件處理模型調整為epoll模型。
events { worker_connections 10240; // use epoll; }
說明:在不指定事件處理模型時,nginx預設會自動的選擇最佳的事件處理模型服務。
3)設定work_connections 連線數
worker_connections 10240;
4)每個程式的最大檔案開啟數
worker_rlimit_nofile 65535; # 一般等於ulimit -n系統值
5)keepalive timeout會話保持時間
keepalive_timeout 60;
6)GZIP壓縮效能優化
gzip on; #表示開啟壓縮功能
gzip_min_length 1k; #表示允許壓縮的頁面最小位元組數,頁面位元組數從header頭的Content-Length中獲取。預設值是0,表示不管頁面多大都進行壓縮,建議設定成大於1K。如果小於1K可能會越壓越大
gzip_buffers 4 32k; #壓縮快取區大小
gzip_http_version 1.1; #壓縮版本
gzip_comp_level 6; #壓縮比率, 一般選擇4-6,為了效能
gzip_types text/css text/xml application/javascript; #指定壓縮的型別 gzip_vary on; #vary header支援
7)proxy超時設定
proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k
8)高效傳輸模式
sendfile on; # 開啟高效檔案傳輸模式。
tcp_nopush on; #需要在sendfile開啟模式才有效,防止網路阻塞,積極的減少網路報文段的數量。將響應頭和正文的開始部分一起傳送,而不一個接一個的傳送。
Linux系統核心層面:
Nginx要達到最好的效能,出了要優化Nginx服務本身之外,還需要在nginx的伺服器上的核心引數。
這些引數追加到/etc/sysctl.conf,然後執行sysctl -p 生效。
1)調節系統同時發起的tcp連線數
net.core.somaxconn = 262144
2)允許等待中的監聽
net.core.somaxconn = 4096
3) tcp連線快速回收
4) tcp連線重用
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
5)不抵禦洪水攻擊
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144 #該引數用於設定系統中最多允許存在多少TCP套接字不被關聯到任何一個使用者檔案控制程式碼上,主要目的為防止Ddos攻擊
6)最大檔案開啟數
ulimit -n 30000
最後
以上,就把Nginx伺服器高效能優化的配置介紹完了,大家可以根據我提供的方法,每個引數挨個設定一遍,看看相關的效果。這些都是一點點試出來的,這樣才能更好的理解各個引數的意義。