一、连接数管理的核心配置(限制并发连接)
Nginx通过ngx_http_limit_conn_module模块实现连接数限制,需先定义共享内存区域(存储连接计数),再在具体上下文中设置限制规则。
http块中添加limit_conn_zone指令,指定计数键(如客户端IP、虚拟主机名)和共享内存大小(建议以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流)。