插件窝 干货文章 高并发下,Nginx、uvicorn和gunicorn如何避免连接重置?

高并发下,Nginx、uvicorn和gunicorn如何避免连接重置?

连接 优化 Uvicorn 超时 628    来源:    2025-03-13

在高并发场景下,Nginx、Uvicorn 和 Gunicorn 的组合可能会出现连接重置(Connection Reset)的问题。这通常是由于后端服务无法及时处理大量请求,导致连接超时或资源耗尽。以下是一些优化策略,帮助你避免连接重置问题:


1. Nginx 配置优化

Nginx 作为反向代理,可以通过以下配置优化来缓解高并发压力:

1.1 调整连接超时时间

http {
    proxy_connect_timeout 60s;  # 后端连接超时时间
    proxy_read_timeout 60s;     # 后端读取超时时间
    proxy_send_timeout 60s;     # 后端发送超时时间
    keepalive_timeout 65s;      # 客户端连接保持时间
    keepalive_requests 1000;    # 单个连接的最大请求数
}

1.2 启用连接池

启用 Nginx 的连接池,减少频繁建立和关闭连接的开销:

upstream backend {
    server 127.0.0.1:8000;
    keepalive 100;  # 保持 100 个空闲连接
}

server {
    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

1.3 增加工作进程和连接数

根据服务器 CPU 核心数调整 Nginx 的工作进程和连接数:

worker_processes auto;  # 自动根据 CPU 核心数设置工作进程
events {
    worker_connections 10240;  # 每个工作进程的最大连接数
}

2. Uvicorn 配置优化

Uvicorn 是一个 ASGI 服务器,适合运行异步 Python Web 应用(如 FastAPI)。以下是一些优化建议:

2.1 增加工作进程

使用 --workers 参数启动多个 Uvicorn 工作进程,充分利用多核 CPU:

uvicorn app:app --workers 4 --host 0.0.0.0 --port 8000

2.2 调整连接限制

通过 --limit-concurrency 参数限制并发连接数,避免资源耗尽:

uvicorn app:app --limit-concurrency 1000

2.3 使用 --timeout-keep-alive

设置 Keep-Alive 超时时间,避免空闲连接占用资源:

uvicorn app:app --timeout-keep-alive 30

3. Gunicorn 配置优化

Gunicorn 是一个 WSGI 服务器,适合运行同步 Python Web 应用(如 Django)。以下是一些优化建议:

3.1 增加工作进程

根据 CPU 核心数设置工作进程数:

gunicorn app:app --workers 4 --bind 0.0.0.0:8000

3.2 使用异步工作模式

对于 I/O 密集型应用,可以使用异步工作模式(如 geventuvicorn.workers.UvicornWorker):

gunicorn app:app --workers 4 --bind 0.0.0.0:8000 -k uvicorn.workers.UvicornWorker

3.3 调整连接数和超时时间

通过 --worker-connections--timeout 参数优化连接数和超时时间:

gunicorn app:app --workers 4 --bind 0.0.0.0:8000 --worker-connections 1000 --timeout 60

4. 系统级优化

4.1 调整文件描述符限制

高并发场景下,系统默认的文件描述符限制可能不足。可以通过以下命令调整:

ulimit -n 65536  # 临时生效

永久生效需要修改 /etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536

4.2 优化 TCP 参数

调整 TCP 连接参数,减少 TIME_WAIT 状态的连接:

sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_fin_timeout=30

5. 监控与调试

  • 使用工具(如 htopnetstatss)监控系统资源使用情况。
  • 检查 Nginx、Uvicorn 和 Gunicorn 的日志,定位具体问题。
  • 使用 APM 工具(如 New Relic、Datadog)监控应用性能。

6. 总结

通过优化 Nginx、Uvicorn 和 Gunicorn 的配置,调整系统参数,可以有效避免高并发下的连接重置问题。具体优化策略需要根据实际业务场景和服务器性能进行调整。建议逐步测试和验证,找到最佳配置。