504 Истекло время ожидания шлюза uwsgi + nginx приложение django

504 Истекло время ожидания шлюза uwsgi + nginx приложение django

Я пытаюсь запустить свое приложение 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, возникающих в различных сценариях. Конфигурация вашего проекта должна быть такой же, как вы указали выше.

Связанный контент