Я пытаюсь запустить свое приложение Django с помощью Nginx + uwsgi, но получаю сообщение об ошибке 504 Gateway Time-out
после первой минуты загрузки.
Моему приложению требуется время, чтобы выполнить необходимые действия, поскольку оно ищет определенные данные на нескольких веб-сайтах.
Мой конфиг nginx следующий:
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;
}
}
Мой скрипт 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
Мой nginx выдает следующее сообщение об ошибке в 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/"
Есть ли у кого-нибудь идеи, как от этого избавиться? Я перепробовал кучу решений на stackoverflows, но ни одно из них мне не помогло.
решение1
Я знаю, что опоздал, но, перепробовав многие из этих предложений (и других), я в конце концов обнаружил, что тайм-аут у меня возникал из-за моего DNS. Если вы используете балансировщики нагрузки Amazon, то у них «тайм-аут простоя» по умолчанию установлен на 120 с.
решение2
Это потому, что вам нужно установить proxy_read_timeout
, а не uwsgi_read_timeout
. И это, в свою очередь, потому, что вы на самом деле не используете uwsgi, вы используете HTTP-проксирование. Uwsgi-бэкенды объявляются с помощью uwsgi_pass
директивы.
решение3
Многие предполагают, что 504 связан с запросом от клиента или с DDoS-атакой на сайте с большим скоплением сеансов. 504 работает в обоих направлениях, так как вы можете увидеть ошибку, если ваш wsgi не может представить код и/или если сервер не может ответить из-за переполнения. Поэтому убедитесь, что вы запустили manage.py, чтобы дважды проверить, является ли ваш код презентабельным. Затем попробуйте "curl -I yoursite.com"
команду, чтобы увидеть, выдает ли она вам ошибку по-прежнему. Есть два файла, связанных с nginx, на которых вам нужно сосредоточиться, один из них находится в /etc/nginx/nginx.conf
глобальных настройках по умолчанию. Второй — это то, что вы создаете сами в /etc/nginx/sites-available
. в вашей глобальной /etc/nginx/nginx.conf
установке добавьте следующие строки
proxy_connect_timeout 10;
proxy_send_timeout 15;
proxy_read_timeout 20;
Это решение устраняет 90% ошибок 504, возникающих в различных сценариях. Конфигурация вашего проекта должна быть такой же, как вы указали выше.