一、連接數管理的核心配置(限制并發連接)
Nginx通過ngx_http_limit_conn_module
模塊實現連接數限制,需先定義共享內存區域(存儲連接計數),再在具體上下文中設置限制規則。
http
塊中添加limit_conn_zone
指令,指定計數鍵(如客戶端IP、虛擬主機名)和共享內存大?。ńㄗh以MB為單位)。例如,限制每個IP的連接數:limit_conn_zone $binary_remote_addr zone=perip:10m;
($binary_remote_addr
占用固定4字節,1MB可支持約16K~32K個不同鍵);若需限制整個虛擬主機的總連接數:limit_conn_zone $server_name zone=perserver:10m;
。server
或location
塊中添加limit_conn
指令,關聯共享內存區域并指定最大并發數。例如,限制每個IP最多10個并發連接:limit_conn perip 10;
;限制虛擬主機總連接不超過200:limit_conn perserver 200;
。limit_conn_log_level
指令設置超額日志級別(如notice
,避免過多info
日志干擾);通過limit_conn_status
指令自定義拒絕狀態碼(如429 Too Many Requests
,更符合HTTP語義)。例如:limit_conn_log_level notice;
、limit_conn_status 429;
。二、系統級資源限制調整(避免連接數被系統拒絕)
Nginx的連接數受限于系統對文件描述符(File Descriptor, FD)的限制,需同步調整系統參數:
ulimit -n
命令查看當前用戶的FD限制(如返回1024
,表示最多允許1024個并發連接)。ulimit -n 65536
命令臨時調整(僅對當前會話有效)。/etc/security/limits.conf
文件,添加以下內容(適用于所有用戶):* soft nofile 65536
(軟限制,可臨時超過)、* hard nofile 65536
(硬限制,不可超過);若使用systemd
管理Nginx,還需創建/etc/systemd/system/nginx.service.d/override.conf
文件,添加:[Service] LimitNOFILE=65536
,然后執行systemctl daemon-reload
使配置生效。events
塊中,設置worker_connections
(每個工作進程的最大連接數)和worker_rlimit_nofile
(工作進程的最大FD限制,需≥worker_connections
)。例如:worker_processes 4;
(根據CPU核心數調整)、worker_connections 10240;
、worker_rlimit_nofile 10240;
(避免出現“worker_connections exceed open file resource limit”警告)。三、連接狀態的監控與分析(及時發現問題)
http_stub_status_module
模塊(通過nginx -V
命令檢查),然后在配置文件中添加location
塊:location /status { stub_status on; allow 127.0.0.1; deny all; }
(僅允許本地訪問),重啟Nginx后訪問http://localhost/status
,可查看活動連接數(Active connections)、已接受/處理的連接總數等指標。netstat
或ss
命令統計連接數,例如:netstat -tun | awk '/tcp/ {print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
(查看TCP連接的客戶端IP分布及數量);ss -s
(快速查看總連接數、TIME_WAIT狀態連接數等)。四、進階場景配置(應對復雜需求)
limit_conn perip 10;
(每個IP最多10個連接)、limit_conn perserver 200;
(虛擬主機總連接不超過200)。location
塊中添加limit_conn_dry_run on;
,超額連接會被記錄到共享內存,但不會返回拒絕狀態碼,便于測試限流規則的合理性。listen 443 ssl http2;
,并設置limit_conn addr 5;
(每個IP最多5個HTTP/2流)。