Django生产环境(Nginx+Gunicorn)图片上传极慢问题求助
Django+Nginx+Gunicorn 图片上传速度慢排查与优化方案
1. Nginx 配置优化
- 调整客户端上传缓冲区:在Nginx的server块或全局http块添加以下配置,避免因小分块传输导致的频繁IO等待:
client_max_body_size 100M; # 数值设为比你允许的最大上传图片尺寸大即可 client_body_buffer_size 16k; client_body_timeout 60s; - 启用高效传输参数:在http块开启sendfile和tcp优化,提升数据传输效率:
sendfile on; tcp_nopush on; tcp_nodelay on; - 优化反向代理缓冲区:Nginx转发请求到Gunicorn时,调整代理缓冲区参数,减少数据拷贝开销:
proxy_buffering on; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k;
2. Gunicorn 配置优化
- 合理设置工作进程与线程:根据服务器CPU核心数调整,比如4核机器可以用:
或者写在gunicorn --workers 4 --threads 2 your_project.wsgi:applicationgunicorn.conf.py配置文件里:workers = 4 threads = 2 worker_class = 'sync' # 大文件上传场景可尝试'gevent'异步 worker,需先安装gevent(pip install gevent) - 延长请求超时时间:防止上传大文件时被Gunicorn强制中断:
timeout = 120 keepalive = 5
3. 服务器系统层面优化
- 调整内核网络参数:编辑
/etc/sysctl.conf,添加以下参数提升网络传输性能:
执行net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_wmem = 4096 16384 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_window_scaling = 1sudo sysctl -p让配置立即生效。 - 排查磁盘IO瓶颈:用
iostat或iotop命令查看上传目录所在磁盘的读写负载,如果磁盘IO过高,换SSD或者调整存储挂载方式能明显提速。
4. 快速定位问题根源
- 绕开Nginx测试Gunicorn:直接访问Gunicorn监听的端口(比如
http://你的服务器IP:8000)上传图片,判断是Nginx还是Gunicorn的问题。 - 检查日志找错误:查看Nginx日志(
/var/log/nginx/access.log、error.log)和Gunicorn日志,看是否有缓冲区溢出、超时类的错误提示。 - 本地测试排除网络问题:在服务器上用curl本地上传,确认不是外部带宽限制:
curl -X POST -F "image=@/本地大图片路径.jpg" http://localhost:8000/你的上传接口/
内容的提问来源于stack exchange,提问作者chris1977
相关产品推荐
相关产品推荐

