Flask/Gunicorn大文件上传异常:本地正常服务器部署后失效求助
解决Gunicorn部署后Flask大文件上传失败的问题
这个问题我之前帮朋友排查过,本地跑没问题但Gunicorn部署后传大文件失败,大概率是Gunicorn或者反向代理(比如Nginx)的默认大小限制在搞鬼,咱们一步步来解决:
1. 检查并配置Gunicorn的请求体大小限制
Gunicorn默认的请求体大小限制是1MB,远小于你需要的20MB,必须手动修改:
方式一:启动命令添加参数
如果是直接用命令启动Gunicorn,加上--max-request-body-size参数:
gunicorn --max-request-body-size 20M --workers 3 --bind unix:your_app.sock your_app:app
也可以用字节数精确指定(20MB=20971520字节):
gunicorn --max-request-body-size 20971520 --workers 3 --bind unix:your_app.sock your_app:app
方式二:通过Gunicorn配置文件设置
如果用配置文件(比如gunicorn.conf.py),添加以下内容:
max_request_body_size = 20 * 1024 * 1024 # 20MB
启动时指定配置文件即可:
gunicorn -c gunicorn.conf.py your_app:app
方式三:修改systemd服务配置(如果用systemd管理Gunicorn)
打开你的Gunicorn系统服务文件(通常在/etc/systemd/system/gunicorn.service),在ExecStart行末尾加上--max-request-body-size 20M:
[Service] User=www-data Group=www-data WorkingDirectory=/path/to/your/app ExecStart=/usr/bin/gunicorn --workers 3 --bind unix:your_app.sock --max-request-body-size 20M your_app:app
修改后重启服务:
sudo systemctl daemon-reload sudo systemctl restart gunicorn
2. 检查Nginx反向代理的配置(如果用了Nginx)
如果你的应用前面挂了Nginx做反向代理,Nginx默认也有1MB的上传大小限制,必须修改:
打开Nginx的站点配置文件(比如/etc/nginx/sites-available/your_app),在server块内添加client_max_body_size 20M;:
server { listen 80; server_name your_domain.com; # 添加这行设置上传大小限制 client_max_body_size 20M; location / { proxy_pass http://unix:/path/to/your_app.sock; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
修改后重启Nginx:
sudo systemctl restart nginx
3. 确认Flask的配置无误
再检查一遍Flask的MAX_CONTENT_LENGTH配置,确保是在创建app实例后设置的:
from flask import Flask app = Flask(__name__) app.config['MAX_CONTENT_LENGTH'] = 20 * 1024 * 1024 # 20MB # 可选:添加413错误的友好提示 @app.errorhandler(413) def request_too_large(error): return "上传文件大小超过限制(最大20MB)", 413
4. 检查上传目录的权限
确保Gunicorn运行的用户(比如www-data)有上传目录的写入权限,比如你的上传目录是static/uploads:
sudo chown -R www-data:www-data /path/to/your/app/static/uploads sudo chmod -R 755 /path/to/your/app/static/uploads
完成以上步骤后,再测试上传20MB的文件应该就正常了。
内容的提问来源于stack exchange,提问作者Kush Patel
相关产品推荐
相关产品推荐

