Respostas Nginx uWSGI truncadas

3

Eu tentei escrever um serviço da web como uma piada hoje no link . É um aplicativo de balão que serve imagens bastante grandes. O aplicativo Flask funciona bem sozinho, assim como um servidor uWSGI independente, mas quando eu tento conectar o uWSGI ao NGINX via uwsgi_pass , de repente, todos os outros pedidos são truncados em 9.99KB em navegadores.

Depois de ler sobre truncamento semelhante com proxy_pass , tentei:

  1. Definindo uwsgi_buffering para off no meu arquivo de configuração
  2. Aumentando o tamanho do buffer para 1024k com uwsgi_buffers 1024 1024k; uwsgi_buffer_size 1024k;
  3. sendfile: off
  4. Verificando as permissões do arquivo de buffer (todos os arquivos em /var/lib/uwsgi são de propriedade do usuário www-data e do grupo www-data , então acho que minhas permissões são boas.)

Estou com minha configuração atual, que ainda exibe o problema:

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

A parte mais estranha é que esse problema aparece apenas a cada segundo pedido. Tem que ter alguma coisa a ver com o cache do NGINX, já que não estou usando várias instâncias do NGINX nem nada. No entanto, tem que ser algo a ver com a configuração do NGINX, já que o uWSGI em execução por si só não exibe o problema.

Alguma ideia sobre o que poderia estar causando esse problema e como corrigi-lo?

    
por Luke Taylor 07.01.2017 / 22:07

2 respostas

1

Depois de confirmar que o comando uwsgi que eu estava testando era compatível com todas as opções que eu forneci no arquivo .ini , percebi que meu arquivo .ini continha processes = 5 enquanto o comando uwsgi Eu estava testando com não. Se eu adicionar --processes=5 ao meu comando uwsgi , poderei reproduzir o problema de truncamento em cada hit, não apenas em cada segundo pedido. Sempre que inicio o uwsgi server com --processes=5 , a primeira solicitação é bem-sucedida, a segunda gera 500, e todas as solicitações subsequentes são truncadas para 9,99MB com o seguinte erro no console:

[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)

A minha suspeita é que este é um problema com o Pillow e a maneira como o uwsgi lida com o threading. Talvez o comportamento de todos os outros pedidos tenha sido devido à maneira como uwsgi decide gerar novos processos e eliminar processos antigos ou devido ao armazenamento em cache pelo NGINX. De qualquer forma, eu corrigi o problema de truncamento.

Também encontrei este no StackOverflow de alguém com o mesmo problema.

Se alguém mais puder responder por que isso ocorreu, ou uma resposta de como posso manter isso resolvido e deixar uwsgi gerar vários processos, eu certamente consideraria essa resposta mais completa e a aceitaria .

    
por 08.01.2017 / 05:32
1

Isso quase sempre significa que há um problema com suas imagens (ou seja, há dados ausentes na parte inferior). Eu processei imagens > 25mb usando PIL (desde que você tenha RAM suficiente) e funciona bem. A solução alternativa aqui pode funcionar para você. Copiar & colado para facilitar a leitura:

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
    
por 08.01.2017 / 07:04