我今天在http://dont-tread-on-memes.controversial.io尝试写一个网络服务作为一个笑话.它是一个烧瓶应用程序,提供相当大的图像. Flask应用程序本身运行良好,独立的uWSGI服务器也是如此,但是当我尝试通过uwsgi_pass将uWSGI插入Nginx时,突然间所有其他请求在浏览器中被截断为9.99KB.
在阅读了与proxy_pass类似的截断后,我尝试了:
>在我的配置文件中将uwsgi_buffering设置为off
>使用uwsgi_buffers 1024 1024k将缓冲区大小增加到1024k; uwsgi_buffer_size 1024k;
> sendfile:关闭
>检查缓冲区文件权限(/ var / lib / uwsgi中的所有文件都归www-data用户和www-data组所有,所以我认为我的权限很好.)
我留下了我当前的配置,它仍然显示问题:
server {
listen 80;
server_name dont-tread-on-memes.controversial.io;
location / {
include uwsgi_params;
uwsgi_pass unix:/var/www/dont-tread-on-memes/dont_tread_on_memes.sock;
uwsgi_buffers 1024 1024k;
uwsgi_buffer_size 1024k;
}
}
最奇怪的是这个问题只出现在每一个请求上.它必须与Nginx缓存有关,因为我没有使用多个Nginx实例或任何东西.但它必须与我的Nginx配置有关,因为uWSGI独立运行并不会出现问题.
有关可能导致此问题的原因以及如何解决问题的任何想法?
最佳答案
在仔细检查我正在测试的uwsgi命令与我在.ini文件中提供的所有选项匹配之后,我意识到我的.ini文件包含processes = 5而我正在测试的uwsgi命令没有.如果我在我的uwsgi命令中添加–processes = 5,我可以在每次点击时重现截断问题,而不仅仅是每隔一个请求.每次我使用–processes = 5启动uwsgi服务器时,第一个请求成功,第二个请求产生500,所有后续请求被截断为9.99MB,控制台中出现以下错误:
[2017-01-08 04:16:08,959] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
File "/usr/local/lib/python3.4/dist-packages/flask/app.py",line 1982,in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.4/dist-packages/flask/app.py",line 1614,in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.4/dist-packages/flask/app.py",line 1517,in handle_user_exception
reraise(exc_type,exc_value,tb)
File "/usr/local/lib/python3.4/dist-packages/flask/_compat.py",line 33,in reraise
raise value
File "/usr/local/lib/python3.4/dist-packages/flask/app.py",line 1612,in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.4/dist-packages/flask/app.py",line 1598,in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "./flaskapp.py",line 13,in main
flag = dont_tread_on_memes.dont_me(caption)
File "./dont_tread_on_memes/__init__.py",line 30,in dont_me
return tread_on("don't {} me".format(phrase))
File "./dont_tread_on_memes/__init__.py",line 16,in tread_on
flag = BLANK_FLAG.copy()
File "/usr/local/lib/python3.4/dist-packages/PIL/Image.py",line 1010,in copy
self.load()
File "/usr/local/lib/python3.4/dist-packages/PIL/ImageFile.py",line 226,in load
"(%d bytes not processed)" % len(b))
OSError: image file is truncated (0 bytes not processed)
我怀疑这是Pillow的问题以及uwsgi处理线程的方式.也许每个其他请求行为都是由于uwsgi决定产生新进程和杀死旧进程的方式,或者是由于Nginx的缓存.无论哪种方式,我已经修复了截断问题.
我也在同一个问题的人身上发现了StackOverflow上的this.
如果其他人可以提供为什么会发生这种情况的答案,或者我如何能够解决这个问题以及让uwsgi产生多个进程的答案,我当然会认为这是一个更完整的答案并接受它.