web-dev-qa-db-fra.com

uwsgi IOError: erreur d'écriture

J'ai un problème avec ma configuration nginx + uwsgi pour mon application Django, je continue à avoir ces erreurs dans le journal des erreurs uwsgi:

Mer 13 jan 15:26:04 2016 - uwsgi_response_writev_headers_and_body_do (): tuyau cassé [core/writer.c ligne 296] au cours de POST/company/get_unpaid_invoices_chart/(86.34.48.7) IOError: erreur d'écriture

Mer 13 jan 15:26:20 2016 - uwsgi_response_write_headers_do (): cassé pipe [core/writer.c, ligne 238] pendant GET /gestiune/print_pdf/nir/136194/(89.122.255.186) IOError: erreur d'écriture

Je ne les reçois pas pour toutes les demandes, mais j'en reçois quelques-unes à chaque minute ... Je l'ai cherchée et je comprends que cela se produit car nginx ferme la connexion à uwsgi avant que celui-ci veuille écrire la réponse. Cela semble étrange car dans ma configuration nginx, j'ai ceci:

inclure uwsgi_params;

uwsgi_pass unix: /home/project/Django/sbo_cloud/site.sock;

uwsgi_read_timeout 600;

uwsgi_send_timeout 600;

uwsgi_connect_timeout 60;

Je suis certain qu'aucune des demandes pour lesquelles l'erreur apparaît n'a dépassé le délai d'attente de 600 secondes. Une idée de comment cela a-t-il pu arriver? 

Merci

15
Virgil Balibanu

Le problème est que les clients abandonnent la connexion puis Nginx ferme la connexion sans indiquer à uwsgi d'abandonner. Ensuite, quand uwsgi revient avec le résultat, le socket est déjà fermé. Nginx écrit une erreur 499 dans le journal et uwsgi émet une erreur IOError. 

La solution non optimale consiste à dire à Nginx de ne pas fermer le socket et d’attendre qu’Uwsgi revienne avec une réponse. 

Mettez uwsgi_ignore_client_abort dans votre nginx.config.

location @app {
    include uwsgi_params;
    uwsgi_pass unix:///tmp/uwsgi.sock;

    # when a client closes the connection then keep the channel to uwsgi open. Otherwise uwsgi throws and IOError
    uwsgi_ignore_client_abort on;
}

Il n’est pas clair s’il est possible de dire à Nginx de fermer la connexion uwsgi. Il existe une autre SO question sur ces problèmes: ( Propager http abort/close de nginx à uwsgi/Django )

15
David Dehghan

La solution alternative consiste à définir les paramètres suivants dans uWSGI config:

ignore-sigpipe = true
ignore-write-errors = true
disable-write-exception = true

Voir https://github.com/getsentry/raven-python/issues/732

2
Andrei