压测后Nginx反向代理无响应,单Nginx+Gunicorn容器高并发配置如何设置?
现有配置问题分析
- Nginx上游连接无超时与积压限制:没有配置反向代理的超时、重试、队列限制,5000并发请求远超Gunicorn同步worker的处理能力后,请求会无限积压在Nginx的上游连接队列中,僵死连接没有超时回收机制,压测结束后连接池被占满,无法处理新请求。
- Gunicorn同步worker处理能力过低:sync类型的worker同一时间只能处理1个请求,8个worker最多同时处理8个请求,压测时会瞬间堵死所有后端入口,间接导致Nginx的代理连接持续占住无法释放。
- 系统资源限制未放开:Docker容器默认的文件句柄ulimit限制通常为1024,压测时Nginx需要为每个请求创建连接、打开文件描述符,超过限制后进程会被系统挂起,只能重启恢复。同时你的Nginx配置只写了worker_connections 20000,没有配套配置worker_rlimit_nofile放开进程文件句柄限制,实际可用连接数远低于配置值。
- 长连接复用缺失:Nginx到Gunicorn默认使用短连接,高并发下会产生大量TIME_WAIT状态的连接,占满容器的可用端口后无法建立新连接。
- accept_mutex配置不合理:高并发场景下开启accept_mutex会导致多worker进程争抢接收锁,额外增加性能开销,严重时会导致worker进程假死。
单容器架构高并发配置优化
1. Nginx配置修改
# 全局段新增,放开进程文件句柄限制 worker_processes auto; # 自动匹配CPU核心数,不需要手动写8 worker_rlimit_nofile 65535; user nobody nogroup; error_log /dev/stdout warn; # 压测时info级日志会拖慢性能,建议改成warn pid /var/run/nginx.pid; events { worker_connections 20000; accept_mutex off; # 高并发场景关闭,降低锁开销 use epoll; # 新增,使用高性能IO模型 } http { include mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log combined buffer=16k; # 新增缓存,减少磁盘IO sendfile on; tcp_nopush on; tcp_nodelay on; # 新增上游服务配置,支持长连接复用 upstream gunicorn { server flask-container:8000 max_fails=3 fail_timeout=30s; keepalive 64; # 保留64个复用长连接 } # 新增全局代理配置 proxy_connect_timeout 3s; proxy_send_timeout 5s; proxy_read_timeout 5s; proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 8 4k; proxy_max_temp_file_size 0; proxy_next_upstream error timeout invalid_header http_502 http_503 http_504; proxy_next_upstream_tries 1; # 失败不重试,避免加重后端压力 proxy_http_version 1.1; proxy_set_header Connection ""; # 可选:全局并发限制,超过直接返回503,避免无限积压 limit_conn_zone $server_name zone=perserver:10m; server { listen 80 default_server; return 444; } server { listen 80; client_max_body_size 4G; server_name localhost; keepalive_timeout 5; root /path/to/app/current/public; # 新增并发限制,根据后端处理能力调整数值 limit_conn perserver 1000; location / { try_files $uri @proxy_to_app; } location @proxy_to_app { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://gunicorn; # 修改为上游服务名 } error_page 500 502 503 504 /500.html; location = /500.html { root /path/to/app/current/public; } } }
2. Gunicorn配置修改
首先安装gevent依赖:pip install gevent
然后修改配置:
bind = '0.0.0.0:8000' workers = 13 # 6核CPU建议用 核心数*2 +1 的规则配置 worker_class = 'gevent' # 替换sync为异步worker,单worker可处理上千并发 worker_connections = 1000 # 单worker最大连接数 loglevel = 'warn' preload_app = true timeout = 3 # 和Nginx超时对齐 keepalive = 60 # 支持长连接复用
3. Docker运行参数调整
启动容器时新增ulimit配置,放开文件句柄限制:
# Nginx容器启动命令新增参数 docker run --ulimit nofile=65535:65535 其他参数 nginx:latest # Gunicorn容器启动命令新增参数 docker run --ulimit nofile=65535:65535 其他参数 你的镜像名
内容的提问来源于stack exchange,提问作者Exz
相关产品推荐
相关产品推荐

