2015-09-28 4 views
1

Я пытаюсь запустить приложение Django с помощью Nginx + uwsgi, но после одной минуты загрузки получаю 504 Gateway Time-out.504 Gateway Time-out uwsgi + nginx django application

Мое приложение требует времени, необходимого для поиска конкретных вещей на нескольких веб-сайтах.

Мой 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 дает мне сообщение об ошибке в followin 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, но никто не работал для меня.

+0

Если ваше приложение работает с длинным процессом, вы можете попробовать запустить его асинхронно с сельдереем. Nginx может иметь возможность увеличить время ожидания, но не стоит иметь длительные синхронные задачи. http://celery.readthedocs.org/ru/latest/django/first-steps-with-django.html – cdvv7788

+0

Вы нашли решение? – rkatkam

ответ

1

Если его внутренняя задача занимает слишком много времени для обработки, используйте сельдерей для выполнения задачи. http://docs.celeryproject.org/en/latest/userguide/tasks.html

Если это не чисто внутренняя задача, например: - загрузка большого файла, а затем увеличение Nginx client_body_timeout до более 60 секунд.

Его из-за таймаута по умолчанию в конфигурации nginx. Измените файл виртуального хоста Nginx и добавьте следующую строку в поле server {}. http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout

# defualt is 60 seconds, For a 300 second timeout. 
client_body_timeout 300s; 

Edit: uwsgi_read_timeout 300s; также необходимо. Но это уже в вашем конфиге.