O Nginx está dando solicitações muito antigas ao uWSGI?

Estou vendo uma situação estranha em que o Nginx ou o uwsgi parece estar construindo uma longa fila de solicitações recebidas e tentando processá-las muito tempo após o tempo limite da conexão do cliente. Eu gostaria de entender e parar esse comportamento. Aqui estão mais informações:

Minha configuração

Meu servidor usa o Nginx para passar solicitações HTTPS POST ao uWSGI e Flask por meio de um soquete de arquivo Unix. Eu tenho basicamente as configurações padrão em tudo.

Eu tenho um cliente Python enviando 3 solicitações por segundo para esse servidor.

O problema

Após executar o cliente por cerca de 4 horas, a máquina do cliente começou a relatar que todas as conexões estavam atingindo o tempo limite. (Ele usa a biblioteca de solicitações do Python com um tempo limite de 7 segundos.) Cerca de 10 minutos depois, o comportamento mudou: as conexões começaram a falhar com o 502 Bad Gateway.

Desliguei o cliente. Porém, por cerca de 10 minutos APÓS desligar o cliente, os logs do uWSGI do lado do servidor mostraram o uWSGI tentando responder às solicitações desse cliente! Etop mostrou o uWSGI usando 100% da CPU (25% por trabalhador).

Durante esses 10 minutos, cadauwsgi.log entrada ficou assim:

Thu May 25 07:36:37 2017 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request /api/polldata (ip 98.210.18.212) !!! Thu May 25 07:36:37 2017 - uwsgi_response_writev_headers_and_body_do(): Broken pipe [core/writer.c line 296] during POST /api/polldata (98.210.18.212) IOError: write error [pid: 34|app: 0|req: 645/12472] 98.210.18.212 () {42 vars in 588 bytes} [Thu May 25 07:36:08 2017] POST /api/polldata => generated 0 bytes in 28345 msecs (HTTP/1.1 200) 2 headers in 0 bytes (0 switches on core 0)

E o Nginxerror.log mostra muito disso:

2017/05/25 08:10:29 [error] 36#36: *35037 connect() to unix:/srv/my_server/myproject.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 98.210.18.212, server: example.com, request: "POST /api/polldata HTTP/1.1", upstream: "uwsgi://unix:/srv/my_server/myproject.sock:", host: "example.com:5000"

Após cerca de 10 minutos, a atividade do uWSGI para. Quando ligo o cliente novamente, o Nginx aceita com satisfação as solicitações POST, mas o uWSGI fornece o mesmo erro "gravar em um canal fechado" em todas as solicitações, como se estivesse permanentemente quebrado de alguma forma. Reiniciar o contêiner do docker do servidor da Web não corrige o problema, mas a reinicialização da máquina host o corrige.

Teorias

Na configuração padrão do Nginx -> soquete -> uWSGI, há uma longa fila de solicitações sem tempo limite? Procurei nos documentos do uWSGI e vi vários tempos limite configuráveis, mas todos têm o padrão em torno de 60 segundos, então não consigo entender como estou vendo as solicitações de 10 minutos sendo tratadas. Não alterei nenhuma configuração de tempo limite padrão.

O aplicativo usa quase toda a RAM de 1 GB no meu pequeno servidor de desenvolvimento, então acho que os limites de recursos podem estar desencadeando o comportamento.

De qualquer forma, gostaria de alterar minha configuração para que solicitações com mais de 30 segundos sejam descartadas com um erro 500, em vez de serem processadas pelo uWSGI. Eu apreciaria qualquer conselho sobre como fazer isso e teorias sobre o que está acontecendo.

questionAnswers(2)

yourAnswerToTheQuestion