在高并发场景下,Nginx、Uvicorn 和 Gunicorn 的组合可能会出现连接重置(Connection Reset)的问题。这通常是由于后端服务无法及时处理大量请求,导致连接超时或资源耗尽。以下是一些优化策略,帮助你避免连接重置问题:
Nginx 作为反向代理,可以通过以下配置优化来缓解高并发压力:
http {
proxy_connect_timeout 60s; # 后端连接超时时间
proxy_read_timeout 60s; # 后端读取超时时间
proxy_send_timeout 60s; # 后端发送超时时间
keepalive_timeout 65s; # 客户端连接保持时间
keepalive_requests 1000; # 单个连接的最大请求数
}
启用 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 "";
}
}
根据服务器 CPU 核心数调整 Nginx 的工作进程和连接数:
worker_processes auto; # 自动根据 CPU 核心数设置工作进程
events {
worker_connections 10240; # 每个工作进程的最大连接数
}
Uvicorn 是一个 ASGI 服务器,适合运行异步 Python Web 应用(如 FastAPI)。以下是一些优化建议:
使用 --workers
参数启动多个 Uvicorn 工作进程,充分利用多核 CPU:
uvicorn app:app --workers 4 --host 0.0.0.0 --port 8000
通过 --limit-concurrency
参数限制并发连接数,避免资源耗尽:
uvicorn app:app --limit-concurrency 1000
--timeout-keep-alive
设置 Keep-Alive 超时时间,避免空闲连接占用资源:
uvicorn app:app --timeout-keep-alive 30
Gunicorn 是一个 WSGI 服务器,适合运行同步 Python Web 应用(如 Django)。以下是一些优化建议:
根据 CPU 核心数设置工作进程数:
gunicorn app:app --workers 4 --bind 0.0.0.0:8000
对于 I/O 密集型应用,可以使用异步工作模式(如 gevent
或 uvicorn.workers.UvicornWorker
):
gunicorn app:app --workers 4 --bind 0.0.0.0:8000 -k uvicorn.workers.UvicornWorker
通过 --worker-connections
和 --timeout
参数优化连接数和超时时间:
gunicorn app:app --workers 4 --bind 0.0.0.0:8000 --worker-connections 1000 --timeout 60
高并发场景下,系统默认的文件描述符限制可能不足。可以通过以下命令调整:
ulimit -n 65536 # 临时生效
永久生效需要修改 /etc/security/limits.conf
:
* soft nofile 65536
* hard nofile 65536
调整 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
htop
、netstat
、ss
)监控系统资源使用情况。通过优化 Nginx、Uvicorn 和 Gunicorn 的配置,调整系统参数,可以有效避免高并发下的连接重置问题。具体优化策略需要根据实际业务场景和服务器性能进行调整。建议逐步测试和验证,找到最佳配置。