web-dev-qa-db-fra.com

Délai d'expiration de Nginx lorsque uWSGI met longtemps à traiter la demande

J'ai Nginx + uWSGI pour l'application Python Django. 

J'ai les éléments suivants dans mon nginx.conf:

location / {
    include uwsgi_params;
    uwsgi_pass   127.0.0.1:9001;
    uwsgi_read_timeout 1800;
    uwsgi_send_timeout 300;
    client_header_timeout 300;
    proxy_read_timeout 300;
    index  index.html index.htm;
}

mais pour les requêtes longues sur uWSGI, ce qui prend environ 1 minute, une erreur de délai d'attente s'est produite dans le journal des erreurs Nginx, comme indiqué ci-dessous:

2013/04/22 12:35:56 [erreur] 2709 # 0: * 1 en amont en attente (110: la connexion a expiré) lors de la lecture de l'en-tête de la réponse en amont, client: xx.xx.xx.xx, serveur:, demande : "GET/entity/datasenders/HTTP/1.1", en amont: "uwsgi: //127.0.0.1: 9001", hôte: "xxx.xx.xx.x"

J'ai déjà défini le délai d'expiration de l'en-tête et les délais d'expiration d'envoi/de lecture d'uWSGI à 5 minutes, quelqu'un peut-il me dire ce que je peux faire pour remédier à cela?

35
anishek

La configuration qui résout le problème est la suivante:

location / {
    include uwsgi_params;
    uwsgi_pass   127.0.0.1:9001;
    uwsgi_read_timeout 300;
    index  index.html index.htm;
}

La raison pour laquelle la configuration ci-dessus dans la question ne fonctionnait pas pour nous car malheureusement, dans notre ordinateur, plusieurs chemins avaient le fichier nginx.conf. Nous travaillions avec la conférence sur le mauvais chemin. 

Pour déterminer correctement quel chemin votre nginx prend la configuration à partir d’exécution: 

nginx -V  # V is caps

ceci aura un --conf-path=[] qui vous dira exactement d'où il prend la configuration.

J'ai récemment trouvé le nginx -V ci-dessus pour ne pas donner les bonnes informations. Je laisserai ce qui précède au cas où d’autres le trouveraient utile.

59
anishek

Outre la réponse "uwsgi_read_timeout", vous devez également vérifier que la propriété est correcte pour votre répertoire de cache nginx uwsgi. La propriété doit être définie sur le même utilisateur que le processus nginx en cours d'exécution ... Dans mon cas, je devais le faire.

grep '^user' /etc/nginx/nginx.conf
ls -lah /var/cache/nginx/uwsgi_temp
for f in $( find /var/cache/nginx/uwsgi_temp ); do ls -lah $f; done

Ces fichiers sont-ils la propriété du même utilisateur? Peut-être que vous pourriez aussi simplement faire un chown récursif, je n'ai pas testé cette approche.

# store the user
THEUSER=$(grep '^user' /etc/nginx/nginx.conf | sed 's/.* //; s/;.*//' )

Supprimer le cache et redémarrer l'approche

/etc/init.d/nginx stop
rm -rf /var/cache/nginx/uwsgi_temp/* 
chown $THEUSER:$THEUSER /var/cache/nginx/uwsgi_temp
/etc/init.d/nginx start

Approche chown récursive

chown -R $THEUSER:$THEGROUP /var/cache/nginx/uwsgi_temp/
# not sure if you have to restart nginx here... 
0
rideswitch