问题现象

最近收到告警通知,部分接口出现 Nginx 500 错误。查看 Nginx 错误日志发现:

1
2025/04/17 10:40:20 [alert] 2403#2403: *5114106677 9216 worker_connections are not enough while connecting to upstream, client: 180.115.116.154, server: xx.xx.cn, request: "POST /report/launch HTTP/2.0", upstream: "http://172.18.20.232:9601/report/launch", host: "xx.xx.cn"

原因分析

Nginx 核心参数说明

Nginx 的两个关键性能参数:

  1. worker_processes:Nginx 工作进程数量

    • 通常设置为 CPU 核心数
    • 建议不超过 8 个,避免系统不稳定
  2. worker_connections:每个工作进程的最大并发连接数

    • 直接影响 Nginx 并发性能
    • 受系统内核单进程最大文件描述符数量限制(ulimit -n

重要概念

  • ulimit -n:单个进程可打开的最大文件描述符数
  • 最大并发连接数计算worker_processes × worker_connections
  • 作为反向代理时的最大并发请求数:约为 worker_processes × worker_connections / 2

连接数不足原因

在反向代理模式下,每个 HTTP 请求占用两个连接:

  1. 客户端到 Nginx 的连接
  2. Nginx 到后端服务器的连接

当并发请求量超过配置的连接数上限时,就会出现本文所述错误。

解决方案

查看原有 nginx.conf 配置:

1
2
3
4
5
worker_processes  4;

events {
worker_connections 9000;
}

worker_connections 从 9000 调整为 15000,问题得到解决。

注意:调整时应根据服务器硬件性能和实际业务负载评估,避免设置过大占用过多内存资源。

经验总结

  1. Nginx 连接池机制会在请求处理完成后释放连接,放入 free_connections 链表中供复用
  2. 合理配置 worker_processesworker_connections 对系统性能至关重要
  3. 调整参数时应循序渐进,不宜一次性做大幅调整

参考资料