Nginx的uWSGI响应被截断

我试图在http://dont-tread-on-memes.controversial.io上写一个networking服务作为一个笑话。 这是一个烧瓶应用程序,提供相当大的图像。 Flask应用程序可以独立运行,就像一个独立的uWSGI服务器一样,但是当我尝试通过uwsgi_pass将uWSGI插入到NGINX中时,突然间所有其他的请求在浏览器中被截断为9.99KB。

阅读与proxy_pass类似的截断之后,我试过:

  1. 在我的configuration文件中设置uwsgi_buffering off
  2. 使用uwsgi_buffers 1024 1024k; uwsgi_buffer_size 1024k;将缓冲区大小1024k uwsgi_buffers 1024 1024k; uwsgi_buffer_size 1024k; uwsgi_buffers 1024 1024k; uwsgi_buffer_size 1024k;
  3. sendfile: off
  4. 检查缓冲区文件权限( /var/lib/uwsgi中的所有文件都由www-data用户和www-data组拥有,所以我认为我的权限很好。)

我留下了我目前的configuration,这仍然performance出这个问题:

 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; } } 

最奇怪的部分是,这个问题只出现在第二个请求。 它必须与NGINXcaching有关,因为我没有使用多个NGINX实例或任何东西。 然而它必须与我的NGINXconfiguration有关,因为uWSGI自己运行不会出现问题。

有什么想法可能导致这个问题,以及如何解决它?

uwsgi检查了我所testing的uwsgi命令是否匹配了我在.ini文件中提供的所有选项后,我意识到我的.ini文件包含了processes = 5而我testing的uwsgi命令却没有。 如果我将--processes=5添加到我的uwsgi命令中,我可以在每个命中中重现截断问题,而不仅仅是在每个第二个请求上。 每次我用--processes=5启动--processes=5服务器时,第一个请求成功,第二个请求产生一个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) 

我怀疑这是枕头和uwsgi处理线程的问题。 也许其他的请求行为是由于uwsgi决定产生新的进程并杀死旧的进程,或者由于NGINX的caching。 无论哪种方式,我已经修复了截断问题。

我也从一个有同样问题的人的StackOverflow上find了这个 。

如果其他人可以提供答案,为什么会发生这种情况,或者我可以如何解决这个问题,并可以让uwsgi产生多个进程,我肯定会考虑一个更完整的答案并接受它。

这几乎总是意味着您的图像存在问题(即底部缺less数据)。 我已经使用PIL处理了> 25mb的图像(只要你有足够的内存),并且工作正常。 此处的解决方法可能适用于您。 复制和粘贴以方便阅读:

 if img and img.meta_type == 'Image': pilImg = PIL.Image.open( StringIO(str(img.data)) ) elif imgData: pilImg = PIL.Image.open( StringIO(imgData) ) try: pilImg.load() except IOError: pass # You can always log it to logger