Nginx uWSGI响应被截断

前端之家收集整理的这篇文章主要介绍了Nginx uWSGI响应被截断前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我今天在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产生多个进程的答案,我当然会认为这是一个更完整的答案并接受它.

猜你在找的Nginx相关文章