當 Nginx 面臨高併發衝擊時,大量 TCP 連接進入 TIME_WAIT 狀態,數量動輒數萬,嚴重消耗系統資源,甚至導致服務器「假死」。通過調整 Linux 內核網絡參數,可顯著減少 TIME_WAIT 堆積,釋放端口資源,穩住高併發場景下的服務器性能。
/etc/sysctl.conf 核心參數編輯配置文件:
vi /etc/sysctl.conf
在文件末尾追加或修改以下參數(建議先備份原文件):
# 減少 FIN-WAIT-2 狀態保持時間,加快連接回收 net.ipv4.tcp_fin_timeout = 30 # 縮短 Keepalive 探測間隔,默認 2 小時改為 20 分鐘,及時發現死連接 net.ipv4.tcp_keepalive_time = 1200 # 開啟 SYN Cookies,防禦 SYN Flood 攻擊 net.ipv4.tcp_syncookies = 1 # 允許 TIME-WAIT sockets 重用於新 TCP 連接(需配合 timestamps) net.ipv4.tcp_tw_reuse = 1 # 快速回收 TIME-WAIT sockets(NAT 環境下慎用,可能導致連接斷裂) net.ipv4.tcp_tw_recycle = 1 # 擴大本地端口範圍,提供更多可用端口 net.ipv4.ip_local_port_range = 1024 65000 # 加大 SYN 隊列長度,應對突發連接請求 net.ipv4.tcp_max_syn_backlog = 8192 # 限制系統同時保持的 TIME_WAIT sockets 最大數量,超過即強制清理 net.ipv4.tcp_max_tw_buckets = 5000
| 參數 | 推薦值 | 作用與注意事項 |
|---|---|---|
| tcp_fin_timeout | 30 | 主動關閉方在 FIN-WAIT-2 狀態停留時間,縮短可加快端口釋放。 |
| tcp_keepalive_time | 1200 | 啟用 keepalive 後的探測間隔(秒),從 7200 降至 1200,更快清理僵死連接。 |
| tcp_syncookies | 1 | SYN 队列溢出時啟用 Cookie 機制,防範 SYN Flood,無副作用,強烈建議開啟。 |
| tcp_tw_reuse | 1 | 允許將 TIME-WAIT 套接字重用於新連接,需雙端開啟 tcp_timestamps(默認開啟),相對安全。 |
| tcp_tw_recycle | 1 | 快速回收 TIME-WAIT,**NAT 環境下會導致同一公網 IP 後多客戶端連接失敗**,生產環境建議設為 0。 |
| ip_local_port_range | 1024 65000 | 擴大臨時端口池,預設 32768-61000 過小,高併發易耗盡。 |
| tcp_max_syn_backlog | 8192 | SYN 接收隊列長度,默認 1024 過小,調大可緩衝突發流量。 |
| tcp_max_tw_buckets | 5000 | 系統級 TIME_WAIT 上限,超過即強制清除並記錄警告,防止佔滿內存。 |
/sbin/sysctl -p
執行後無報錯即表示參數已生效。可用 sysctl -a | grep tcp 驗證關鍵值。
內核調優解決傳輸層瓶頸,應用層仍需減少上游壓力。在 Nginx http 段配置 FastCGI 緩存:
# 定義緩存區:路徑、目錄層級、鍵區名稱與大小、非活動過期時間 fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; # 在 server 或 location 中啟用 fastcgi_cache TEST; fastcgi_cache_valid 200 302 10m; fastcgi_cache_valid 404 1m; fastcgi_cache_key $request_method$scheme$host$request_uri; add_header X-Cache $upstream_cache_status;
效果: 靜態化動態請求,大幅降低 PHP-FPM CPU 佔用,同時減少 502 錯誤發生概率。
0,依賴 tcp_tw_reuse + tcp_fin_timeout 組合。netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 中 TIME_WAIT 數量變化。worker_processes auto; worker_connections 65535; use epoll; multi_accept on; 等事件模型優化同等重要。/etc/sysctl.conf 修改重啟後仍有效,若用 sysctl -w 臨時修改則重啟失效。通過精準調整 8 個核心 TCP 參數,配合 Nginx FastCGI 緩存,可將高併發下的 TIME_WAIT 數量從數萬級壓制到幾千以內,端口複用效率提升 10 倍以上。這是每個 Linux 運維、後端工程師必須掌握的「內功心法」。記住:內核參數是地基,應用架構是樓房,地基不穩,樓蓋再高也會倒。