Estoy intentando ejecutar mi aplicación Django usando Nginx + uwsgi, pero la recibo 504 Gateway Time-out
después de un minuto de carga.
Mi aplicación necesita tiempo para hacer lo necesario, ya que busca cosas específicas en varios sitios web.
Mi configuración de nginx es la siguiente:
upstream uwsgi {
server 127.0.0.1:8000;
}
server {
listen 80;
server_name server_ip;
root /opt/emails/subscriptions;
index index.html index.htm index.php;
location /emailsproject/ {
root /opt/emails/subscriptions/;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://uwsgi;
proxy_set_header Host $http_host;
uwsgi_read_timeout 18000;
}
}
Mi guión uwsgi:
description "uWSGI server"
env PYTHONPATH=/opt/emails/subscriptions
env DJANGO_SETTINGS_MODULE=emailsproject.settings
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec uwsgi_python --http-socket 127.0.0.1:8000 -p 4 --wsgi-file /opt/emails/subscriptions/emailsproject/wsgi.py
Mi nginx me muestra el siguiente mensaje de error en error.log:
2015/09/28 02:15:57 [error] 4450#0: *19 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 37.235.53.246, server: my_server_ip, request: "POST /home/ HTTP/1.1", upstream: "http://127.0.0.1:8000/home/", host: "my_server_ip", referrer: "http://my_server_ip/home/"
¿Alguien tiene alguna idea sobre cómo puedo deshacerme de esto? Probé toneladas de soluciones de stackoverflows pero ninguna funcionó para mí.
Respuesta1
Sé que llego tarde a la fiesta, pero después de probar muchas de estas sugerencias (y otras), finalmente descubrí que el tiempo de espera se estaba produciendo en mi DNS; si estás usando balanceadores de carga de Amazon, tienen un "Tiempo de espera de inactividad" configurado en 120 por defecto.
Respuesta2
Eso es porque necesitas configurar proxy_read_timeout
, no uwsgi_read_timeout
. Y eso, a su vez, se debe a que en realidad no estás usando uwsgi, estás usando proxy HTTP. Los backends de Uwsgi se declaran mediante uwsgi_pass
directiva.
Respuesta3
Mucha gente supone que 504 está relacionado con una solicitud del cliente o si hay algún ataque DDoS en el sitio con una gran acumulación de sesiones. 504 funciona en ambos sentidos, ya que puede ver el error si su wsgi no puede presentar el código y/o si el servidor no puede responder debido a un desbordamiento. Así que asegúrese de ejecutar Manage.py para verificar si su código está presentable. Luego prueba "curl -I yoursite.com"
el comando para ver si todavía te da error. Hay dos archivos relacionados con nginx en los que debe centrarse, uno de ellos /etc/nginx/nginx.conf
para la configuración global predeterminada. El segundo es en qué te creas a ti mismo /etc/nginx/sites-available
. en su /etc/nginx/nginx.conf
instalación global agregue las siguientes líneas
proxy_connect_timeout 10;
proxy_send_timeout 15;
proxy_read_timeout 20;
Esta solución soluciona el 90 % de los errores 504 causados en diferentes escenarios. La configuración de tu proyecto debe ser la misma que mencionaste anteriormente.