Nginx 作為高併發 Web 服務器/反向代理的標桿,其性能上限很大程度上取決於配置優化與內核協同調優。本文系統梳理 Nginx 核心指令優化策略、關鍵 Linux 內核網絡參數調優原理與推薦值,並提供可直接落地的完整優化配置模板。
| 指令 | 推薦值/策略 | 核心作用與調優邏輯 |
|---|---|---|
worker_processes |
CPU 核心數(或 auto) |
每個 Worker 為單線程進程,綁定 CPU 核心避免上下文切換;過多導致調度開銷,過少浪費核心。 |
worker_cpu_affinity |
按核心數分配掩碼(如 8 核:00000001 00000010 ... 10000000) |
將 Worker 進程綁定到特定 CPU 核心,消除緩存未命中、鎖競爭,顯著提升多核吞吐。 |
worker_rlimit_nofile |
ulimit -n 值(如 102400) |
單進程最大打開文件描述符數(含連接、靜態文件、代理上游連接)。需與系統 fs.file-max、用戶 limits.conf 一致。 |
use epoll; |
事件模塊指定 epoll (Linux 2.6+) |
高性能 I/O 多路復用機制,O(1) 事件通知,支撐百萬級併發基石。 |
worker_connections |
102400 (配合 worker_rlimit_nofile) |
單 Worker 最大連接數。總併發上限 ≈ worker_processes × worker_connections(反向代理場景每連接佔 2 個 FD,實際上限減半)。 |
keepalive_timeout |
60s (視業務調整 15-120s) | 長連接超時時間。過短頻繁建連,過長佔用 Worker 連接槽。需配合上游 proxy_http_version 1.1; proxy_set_header Connection "";。 |
client_header_buffer_size |
4k (通常等於頁大小 getconf PAGESIZE) |
請求頭緩衝區。過小導致大頭(Cookie 多)分配 large_client_header_buffers,增加內存碎片。 |
open_file_cache |
max=100000 inactive=20s; |
緩存打開文件描述符、目錄、元信息。max ≈ 靜態文件總數;inactive 超時未訪問則移除。 |
open_file_cache_valid |
30s; |
檢查緩存有效性間隔。 |
open_file_cache_min_uses |
1; |
inactive 期間最少訪問次數,達標則保持緩存。 |
所有參數寫入 /etc/sysctl.conf,執行 sysctl -p 生效。下表為高併發 Web 典型推薦值及原理:
| 參數 | 推薦值 | 核心作用與調優邏輯 |
|---|---|---|
net.ipv4.tcp_max_tw_buckets |
6000 | TIME_WAIT 套接字最大數量,防止佔滿連接表。默認 180000 過大,小內存機器必降。 |
net.ipv4.tcp_tw_reuse |
1 | 允許將 TIME_WAIT 套接字重用於新連接(客戶端發起)。需時間戳支持(tcp_timestamps=1),但見下行權衡。 |
net.ipv4.tcp_tw_recycle |
0 (建議關閉) | **快速回收 TIME_WAIT**(NAT 環境極危險,導致同一公網 IP 後多客戶端連接失敗)。Linux 4.12+ 已移除此參數。 |
net.ipv4.tcp_timestamps |
0 (高併發短連接建議關) | 時間戳選項(12 字節開銷)。開啟可防序列號繞回(PAWS),支持 tcp_tw_reuse;關閉減少頭部開銷、CPU 計算。高併發短連接場景關閉收益更大。 |
net.ipv4.tcp_syncookies |
1 | SYN Flood 攻擊防護:SYN 隊列滿時啟用 Cookie 驗證,不分配內核結構,犧牲少量性能換穩定。 |
net.core.somaxconn |
262144 | 全局監聽隊列長度上限。Nginx listen backlog 受此限制,默認 128 極小,必須調大配合高併發建連。 |
net.core.netdev_max_backlog |
262144 | 網卡接收隊列長度。突發流量時包排隊緩衝,防止丟包觸發重傳。 |
net.ipv4.tcp_max_syn_backlog |
262144 | 半連接隊列長度(SYN_RECV 狀態)。防禦 SYN Flood、應對突發建連峰值。 |
net.ipv4.tcp_fin_timeout |
10-30 (非 1!) | 主動關閉方 FIN_WAIT_2 狀態超時。**極小值(1)導致大量套接字殘留**,風險大於收益。推薦 10-30 秒平衡資源釋放與協議合規。 |
net.ipv4.tcp_keepalive_time |
300-600 | TCP 保活探測間隔(默認 7200s 太長)。配合應用層心跳,檢測死連接。 |
net.ipv4.ip_local_port_range |
1024 65000 | 客戶端臨時端口範圍。擴大範圍支撐更多並發出站連接(反向代理、側車代理場景關鍵)。 |
net.ipv4.tcp_max_orphans |
262144 | 無進程持有的孤兒套接字上限(防 DoS)。超限直接重置,慎增,優先加內存。 |
net.ipv4.tcp_mem |
94500000 915000000 927000000 (頁為單位) | TCP 內存全局控制:min/pressure/max。超過 pressure 進入內存壓力模式,限制發送窗口。按內存大小按比例調整。 |
net.ipv4.tcp_rmem / tcp_wmem |
4096 87380 4194304 / 4096 16384 4194304 |
接收/發送緩衝區 min/default/max(字節)。max 4MB 支撐高 BDP(帶寬延遲積)長肥管道。 |
net.core.rmem_max / wmem_max |
16777216 (16MB) | 用戶態 setsockopt 可設置的緩衝區上限,需 ≥ tcp_*mem max。 |
user www www;
worker_processes auto; # 自動檢測 CPU 核心數
worker_cpu_affinity auto; # 1.9.10+ 支持自動綁核
worker_rlimit_nofile 102400;
events {
use epoll;
worker_connections 102400;
multi_accept on; # 一次 accept 盡可能多連接
}
http {
include mime.types;
default_type application/octet-stream;
# 連接優化
keepalive_timeout 60;
keepalive_requests 10000;
sendfile on;
tcp_nopush on; # 協同 sendfile,累積數據包再發送
tcp_nodelay on; # 關鍵小包立即發送(禁用 Nagle)
# 緩衝區優化
client_header_buffer_size 4k;
large_client_header_buffers 4 16k;
client_body_buffer_size 64k;
# 靜態文件緩存
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# Gzip 壓縮
gzip on;
gzip_vary on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 上游長連接
upstream backend {
server 127.0.0.1:8080 weight=3 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 weight=2 max_fails=3 fail_timeout=30s;
keepalive 512; # 到上游的長連接池
}
server {
listen 80 reuseport; # SO_REUSEPORT 分發連接 (內核 3.9+)
server_name example.com;
location / {
proxy_pass https://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
# 連接隊列與建連
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_syn_backlog = 262144
# TIME_WAIT 優化
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_fin_timeout = 15
# 緩衝區與內存
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_mem = 94500000 915000000 927000000
# 端口與保活
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
# 安全與防護
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 文件描述符
fs.file-max = 2097152
fs.nr_open = 2097152
www soft nofile 102400
www hard nofile 102400
www soft nproc 65535
www hard nproc 65535
ss -s / netstat -s:TCP 連接狀態分佈、重傳率、SYN 接收/發送統計。cat /proc/net/netstat:擴展 TCP 指標(TcpExtTCPFastOpenActive、TcpExtTCPSynRetrans 等)。nginx -T:檢查配置生效情況。prometheus + node_exporter + nginx_exporter:全鏈路監控告警。Nginx 優化是「應用層配置 + 內核參數 + 硬件資源」三位一體的系統工程。核心原則:
sendfile、epoll、CPU 綁核、reuseport。open_file_cache、keepalive、上游連接池。tcp_syncookies、tcp_max_orphans、rp_filter。按模板落地、壓測驗證、持續監控,即可將 Nginx 性能推向硬件極限。