上传大文件Flask Nginx Uwsgi



我有一个使用Nginx和Uwsgi的Flask应用程序在远程ubuntu服务器上运行。我无法上传大于~200Kb的文件。

为了制作我的应用程序,我遵循了本教程:https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uswgi-and-nginx-on-ubuntu-18-04

一开始我有一个错误413,我修复了在/etc/nginx/nginx.conf中添加client_max_body_size 5M;

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 5M;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

现在我没有任何错误,但我仍然无法上传更大的文件。我还更改了我的应用程序uwsgi配置文件:

[uwsgi]
module = wsgi:app
master = true
processes = 10
limit-post = 20000000
ignore-sigpipe=true
ignore-write-errors=true
disable-write-exception=true

socket = main.sock
chmod-socket = 660
vacuum = true
die-on-term = true
logto= /var/log/uwsgi/%n.log

我还能做些什么来修复它?

感谢Frank的回答,我打开这篇文章已经有一段时间了。如果我没有记错的话,这个错误有点微妙:Flask默认情况下没有";重试";逻辑内置。这与我能找到的用于测试的最便宜的服务器相结合,对一些最昂贵的请求的失败起到了推波助澜的作用。实现";重试";带有retrydecorator的逻辑解决了我的问题。

看起来您已经正确设置了变量。也许您在Flask应用程序中设置了配置设置MAX_CONTENT_LENGTH?它看起来像这样:

app.config['MAX_CONTENT_LENGTH'] = 50 * 1024 * 1024 # 50 MB

默认情况下,Flask不应该抱怨大型请求,但如果设置了此变量,则当请求超过指定值时,它将抛出413错误。查看此处了解更多信息。

最后,请确保使用以下命令重新加载Nginx和uWSGI服务:

> sudo systemctl restart nginx.service
> sudo systemctl restart <yourservice>.service

.service后缀是可选的。

最新更新