Nginx是一個高效能的HTTP和反向代理伺服器,它在全球範圍內被廣泛使用,因其高效能、穩定性、豐富的功能以及低資源消耗而受到青睞。今天V哥從5個方面來介紹 Nginx 效能調優的具體策略,希望對兄弟們有幫助,廢話不多說,馬上開整。
1. 系統層面:
- 調整核心引數:例如,增加系統檔案描述符的限制、TCP連線佇列的大小等。
- 網路最佳化:可以使用TCP Fast Open、選擇更高效的網路協議等。
2. Nginx配置:
- Worker程序數:通常設定為等於伺服器的CPU核心數。
- 連線數:透過調整worker_connections引數,可以增加每個Worker程序可以開啟的連線數。
- 使用HTTP/2:HTTP/2提供了更好的效能,包括頭部壓縮和伺服器推送等功能。
3. 快取利用:
- 啟用檔案快取:Nginx可以將靜態檔案快取在伺服器本地,減少磁碟I/O操作。
- 使用代理快取:例如,使用Nginx作為反向代理伺服器時,可以快取後端伺服器的響應內容。
4. 壓縮:
- 啟用Gzip壓縮可以減少資料傳輸量,提高響應速度。
5. 負載均衡策略:
- 根據伺服器的效能和負載情況,選擇合適的負載均衡策略,如輪詢、最少連線數、IP雜湊等。
下面 V 哥針對每個點結合業務場景來詳細介紹,老鐵們坐穩了,要發車了。
1. 系統層面
Nginx效能調優可以從多個層面進行,這裡我們重點討論系統層面的調優步驟。系統層面的調優主要是對作業系統進行最佳化,以更好地支援Nginx的高併發處理能力。
1. 核心引數調整
核心引數的調整可以透過修改/etc/sysctl.conf檔案來實現,這些引數會影響網路棧的行為。
- net.core.somaxconn:這個引數設定了一個系統範圍內所有監聽Socket的未完成連線佇列的最大長度。調高這個值可以避免在高峰期出現"connection refused"的錯誤。
sysctl -w net.core.somaxconn=65535
- net.ipv4.tcp_max_syn_backlog:這個引數設定了TCP連線建立時,SYN佇列的最大長度。在高負載情況下,增加這個值可以防止SYN洪水攻擊。
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
- net.ipv4.ip_local_port_range:這個引數定義了本地埠範圍,增加這個範圍可以允許更多的併發連線。
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
- net.ipv4.tcp_fin_timeout:這個引數決定了系統回收TCP連線的時間。減小這個值可以加快回收速度,釋放資源。
sysctl -w net.ipv4.tcp_fin_timeout=30
- net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_tw_recycle:這兩個引數控制了TCP連線的TIME_WAIT狀態。開啟它們可以更快地重用和回收處於TIME_WAIT狀態的連線。
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=1
2. 檔案描述符限制
增加系統允許的檔案描述符數量,以便Nginx可以開啟更多的連線。
- 使用者級限制:修改/etc/security/limits.conf檔案,增加Nginx使用者(通常是www-data或nginx)的nofile限制。
nginx soft nofile 65535
nginx hard nofile 65535
- 系統級限制:修改/proc/sys/fs/file-max檔案,增加整個系統的最大檔案描述符數。
echo 65535 > /proc/sys/fs/file-max
3. 網路棧最佳化
- 禁用Syn Cookies:在高峰期,可以臨時禁用Syn Cookies,以提高TCP連線的建立速度。
sysctl -w net.ipv4.tcp_syncookies=0
- 調整TCP Keepalive:透過調整net.ipv4.tcp_keepalive_time等引數,可以最佳化長連線的管理。
sysctl -w net.ipv4.tcp_keepalive_time=600
4. 硬體和架構最佳化
- 使用SSD儲存:使用固態硬碟可以顯著提高I/O效能,尤其是對於需要頻繁讀寫檔案的Nginx伺服器。
- 網路硬體:使用高頻寬和低延遲的網路硬體,如萬兆乙太網,可以提高資料傳輸速度。
- 負載均衡:如果伺服器面臨極高的負載,可以考慮使用硬體負載均衡器來分擔Nginx的壓力。
5. 作業系統選擇和最佳化
- 選擇合適的作業系統:不同的作業系統對網路效能的支援不同,選擇一個適合高併發網路服務的作業系統是很有幫助的。
- 關閉不必要的系統服務:減少系統執行的程序和服務,可以釋放更多的系統資源給Nginx使用。
在進行系統層面的調優時,需要注意平衡效能提升和系統穩定性之間的關係。過度的最佳化可能會導致系統不穩定,甚至出現資源耗盡的情況。因此,建議在調優過程中進行充分的測試,並根據伺服器的具體情況進行調整。
2. Nginx配置
Nginx的效能調優可以透過修改其配置檔案nginx.conf來實現。以下是一些具體的調優步驟和建議:
1. Worker程序數
Nginx使用多程序模型,通常情況下,Worker程序的數量應該設定為等於伺服器的CPU核心數。這樣可以最大化利用多核CPU的效能。
worker_processes auto; # 或者指定具體的程序數,如 worker_processes 4;
2. Worker連線數
每個Worker程序可以同時處理的最大連線數由worker_connections指令設定。這個值應該根據伺服器的記憶體大小和系統負載來合理設定。
events {
worker_connections 4096; # 根據伺服器能力適當調整
}
3. 使用HTTP/2
如果客戶端支援,可以啟用HTTP/2,它提供了更好的效能,包括頭部壓縮和伺服器推送等功能。
listen 443 ssl http2;
4. 檔案描述符限制
增加Nginx可以開啟的檔案描述符數量,以處理更多的併發連線。
worker_rlimit_nofile 65535;
5. 啟用Gzip壓縮
壓縮可以減少資料傳輸量,提高響應速度。
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
6. 快取配置
配置瀏覽器快取,減少重複請求。
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public";
}
7. 靜態資源處理
對於靜態資源,可以使用sendfile快速傳輸檔案。
location /static/ {
sendfile on;
tcp_nopush on;
tcp_nodelay off;
}
8. 負載均衡
如果有多臺後端伺服器,可以使用Nginx的負載均衡功能。
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
keepalive 64; # 保持活動的連線數
}
server {
location / {
proxy_pass http://backend;
}
}
9. 最佳化SSL/TLS
如果使用SSL/TLS,可以最佳化相關配置以提高效能。
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
10. 日誌配置
減少不必要的日誌記錄,可以減少磁碟I/O和CPU使用。
access_log off; # 或者將日誌寫入記憶體檔案系統
在進行Nginx配置調優時,應該逐步進行,每次更改後都要進行測試,以確保更改確實提高了效能,並且沒有引入新的問題。此外,不同的應用場景可能需要不同的最佳化策略,因此最好根據實際情況進行調整。
3. 快取利用
Nginx快取利用是提高效能的重要手段,它可以透過減少伺服器負載、降低響應時間和減少網路頻寬使用來顯著提升使用者體驗。以下是快取利用的具體調優步驟:
1. 啟用Nginx內建快取
Nginx內建了多種快取機制,如檔案系統快取、記憶體快取等。可以透過配置nginx.conf來啟用這些快取。
- 檔案系統快取(HTTP快取)
在HTTP模組中,可以使用proxy_cache指令啟用代理快取。
http {
# 定義快取區域
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
location / {
proxy_cache my_cache; # 使用定義的快取區域
proxy_cache_valid 200 302 10m; # 對200和302響應快取10分鐘
proxy_cache_valid 404 1m; # 對404響應快取1分鐘
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; # 在指定情況下使用過期快取
}
}
}
- 記憶體快取(FastCGI快取)
如果使用FastCGI(如與PHP-FPM配合),可以使用fastcgi_cache指令啟用快取。
http {
# 定義FastCGI快取區域
fastcgi_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
server {
location ~ \.php$ {
fastcgi_cache my_cache; # 使用定義的快取區域
fastcgi_cache_key $request_uri; # 定義快取鍵
fastcgi_cache_valid 200 30m; # 對200響應快取30分鐘
}
}
}
2. 配置瀏覽器快取
透過設定HTTP頭,可以指示瀏覽器快取靜態資源。
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 設定資源的過期時間
add_header Cache-Control "public"; # 指示資源可以被瀏覽器和代理快取
}
3. 使用CDN
內容分發網路(CDN)可以快取靜態資源,並將其分發到全球各地的節點,使用者可以從最近的節點獲取內容,從而減少延遲。
4. 配置反向代理快取
如果Nginx作為反向代理伺服器,可以配置它來快取後端伺服器的響應。
location / {
proxy_pass http://backend;
proxy_cache my_cache; # 使用定義的快取區域
proxy_cache_valid 200 30m; # 對200響應快取30分鐘
}
5. 監控和調整快取效能
- 使用Nginx的統計模組(如ngx_http_stub_status_module)來監控快取命中率和快取大小。
- 根據監控資料調整快取大小和過期時間,以最佳化效能。
6. 清理快取
定期清理快取,以釋放空間和提高快取效率。可以使用Nginx的快取清理功能或編寫指令碼來實現。
在進行快取調優時,需要注意以下幾點:
- 快取大小和過期時間需要根據實際情況進行調整,以找到最佳平衡點。
- 監控快取命中率,以確保快取配置有效地提高了效能。
- 確保快取內容的一致性,特別是在動態內容快取時。
透過合理利用快取,可以顯著提高Nginx的效能,減少伺服器負載,並提高使用者體驗。
4. 壓縮
Nginx中的壓縮功能可以透過Gzip模組來實現,它可以在伺服器端對響應資料進行壓縮,以減少傳輸資料的大小,從而提高載入速度,尤其是在頻寬有限的情況下。以下是壓縮的具體調優步驟:
1. 啟用Gzip壓縮
首先,確保在Nginx中啟用了Gzip模組。這通常是透過在nginx.conf檔案的http塊中新增以下指令來完成的:
http {
gzip on; # 啟用Gzip壓縮
}
2. 設定壓縮級別
gzip_comp_level指令用於設定壓縮級別,級別越高,壓縮率越大,但CPU消耗也越高。通常設定為1到9之間的值,其中1是最快的壓縮,9是最高壓縮率。推薦設定為6,這是一個效能和壓縮率的平衡點。
http {
gzip_comp_level 6; # 設定壓縮級別
}
3. 選擇要壓縮的內容型別
使用gzip_types指令指定要壓縮的MIME型別。通常,文字檔案(如HTML、CSS、JavaScript)和XML檔案可以從壓縮中受益。
http {
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
4. 設定最小壓縮大小
使用gzip_min_length指令設定觸發壓縮的最小檔案大小。對於小檔案,壓縮可能不會帶來太多好處,而且會增加CPU負擔。
http {
gzip_min_length 256; # 只有大於256位元組的響應才會被壓縮
}
5. 禁用IE6的壓縮
老版本的IE瀏覽器(IE6及以下)可能不支援Gzip壓縮,可以透過gzip_disable指令禁用對這些瀏覽器的壓縮。
http {
gzip_disable "MSIE [1-6]\."; # 禁用IE6及以下版本的Gzip壓縮
}
6. 配置瀏覽器快取
雖然壓縮可以減少伺服器頻寬使用,但它會增加CPU負載。為了減輕伺服器壓力,可以配置瀏覽器快取,讓瀏覽器儲存壓縮後的內容,減少重複請求。
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 設定資源的過期時間
add_header Cache-Control "public"; # 指示資源可以被瀏覽器和代理快取
}
7. 測試和監控
- 在應用這些配置後,使用工具如curl或線上Gzip檢測服務來測試壓縮是否生效。
- 監控伺服器的CPU使用情況和響應時間,以確保壓縮帶來的效能提升大於CPU負載的增加。
透過合理配置Gzip壓縮,可以在不顯著增加伺服器負載的情況下,顯著減少網路傳輸資料的大小,提高使用者體驗。在進行壓縮調優時,需要根據伺服器的CPU能力和網路條件來平衡壓縮級別和最小壓縮大小,以達到最佳的效能。
5. 負載均衡策略
Nginx作為高效能的HTTP和反向代理伺服器,提供了多種負載均衡策略,可以幫助分散流量,提高網站的可用性和效能。以下是負載均衡策略的具體調優步驟:
1. 選擇合適的負載均衡策略
Nginx支援多種負載均衡策略,包括:
- 輪詢(Round Robin):這是預設的策略,請求按時間順序逐一分配到不同的伺服器,如果伺服器當機,自動剔除。
- 最少連線(Least Connections):分配到當前連線數最少的伺服器。
- IP雜湊(IP Hash):根據請求的來源IP地址,將請求分配到固定的伺服器,可以在一定程度上保持使用者的會話狀態。
- 權重(Weight):指定不同伺服器的權重,權重越高,分配的請求越多。
在nginx.conf的upstream塊中定義負載均衡策略:
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com;
server backend3.example.com backup; # 備用伺服器
ip_hash; # 使用IP雜湊策略
}
2. 配置健康檢查
使用health_check模組可以對後端伺服器進行健康檢查,以確保流量只被定向到健康的伺服器。
server {
location / {
proxy_pass http://backend;
health_check interval=10 fails=3 passes=2;
}
}
3. 使用持久連線
對於HTTP/1.1客戶端,可以使用持久連線(Keepalive)來減少建立和關閉連線的次數。
upstream backend {
server backend1.example.com;
keepalive 32; # 保持活動的連線數
}
4. 調整超時時間
適當調整超時時間,以確保Nginx能夠快速響應後端伺服器的變化。
proxy_connect_timeout 5s; # 設定與後端伺服器建立連線的超時時間
proxy_read_timeout 60s; # 設定從後端伺服器讀取響應的超時時間
proxy_send_timeout 5s; # 設定向後端伺服器傳送請求的超時時間
5. 限制連線數
為了避免單個客戶端佔用過多資源,可以限制每個客戶端的連線數。
limit_conn_zone $binary_remote_addr zone=mylimit:10m;
limit_conn mylimit 5; # 每個IP地址最多允許5個同時連線
6. 監控和調整
- 使用Nginx的統計模組(如ngx_http_stub_status_module)來監控負載均衡的效能。
- 根據監控資料調整負載均衡策略和伺服器權重,以最佳化效能。
7. 考慮使用第三方負載均衡解決方案
對於大型應用或需要更多高階功能的場景,可以考慮使用商業負載均衡器或雲服務提供的負載均衡解決方案。
透過合理配置負載均衡策略,可以有效分散流量,提高網站的可用性和效能。在進行負載均衡調優時,需要根據伺服器的具體情況和實際需求來選擇合適的策略,並進行持續的監控和調整。
最後
以上 V 哥總結的5個方面關於 Nginx效能調優的策略,實際應用中需要結合實際專案的情況來測試,希望對你有幫助,歡迎關注威哥愛程式設計,技術路上我們一起成長。