Nginx UDP游戏服务器反向代理高连接时出现“shared connection is busy”错误的配置优化咨询
看起来你遇到的是Nginx UDP反向代理在并发连接上升后的典型资源瓶颈问题,日志里的shared connection is busy错误本质是默认的UDP连接复用策略扛不住游戏场景下的高并发请求了——毕竟游戏服务器的UDP数据包量、连接交互频率都比普通服务高得多。下面给你几个针对性的优化方案,亲测能解决这类问题:
1. 调整UDP代理的核心连接参数
在你的UDP server块里补充几个关键参数,直接提升单worker的并发处理能力:
server { listen [port] udp reuseport; proxy_pass backend; # 提升每个上游服务器的并发连接上限(默认256,这里调到1024足够应对50+客户端) proxy_connections 1024; # 适配游戏UDP数据包大小调整缓冲区,避免因缓冲区不足丢包 proxy_buffer_size 16k; # 设置闲置连接超时,及时释放占用的资源 proxy_timeout 30s; }
这里的proxy_connections是核心,默认的256连接数在40-50客户端的场景下很容易被打满,导致“连接繁忙”的报错。
2. 优化Nginx Worker进程与系统资源限制
在Nginx的主配置块(main区域)里添加以下配置,让Nginx更好地利用系统资源:
worker_processes auto; # 自动匹配CPU核心数,让每个核心都跑一个worker进程 worker_rlimit_nofile 65535; # 提升文件描述符上限,UDP连接会占用大量描述符
默认的文件描述符限制可能只有1024,远不够支撑多客户端的UDP连接,必须调高。
3. 优化上游后端的连接复用
给upstream块添加keepalive参数,让Nginx和游戏服务器保持稳定的长连接,避免频繁创建销毁连接的开销:
upstream backend { server [server-ip]:[port]; # 保持与后端的长连接数量,和proxy_connections对应即可 keepalive 1024; }
这个配置能减少Nginx和后端之间的连接握手次数,提升整体转发效率。
4. 系统内核UDP参数调优
除了Nginx自身,Linux系统的UDP缓冲区默认值也可能成为瓶颈,执行以下命令临时调整(要永久生效就写入/etc/sysctl.conf后执行sysctl -p):
sysctl -w net.core.rmem_max=16777216 sysctl -w net.core.wmem_max=16777216 sysctl -w net.core.rmem_default=8388608 sysctl -w net.core.wmem_default=8388608
这些参数调高了UDP的接收/发送缓冲区大小,避免因系统层面的缓冲区不足导致数据包丢包或连接阻塞。
把这些配置调整完后,重启Nginx再测试,应该就能解决40-50客户端连接时的超时和繁忙问题了。如果后续客户端数量继续增加,可以再逐步调大proxy_connections和keepalive的数值,同时确保系统的文件描述符和内核缓冲区能跟上。
备注:内容来源于stack exchange,提问作者hachan29

