Ошибка 504, когда загрузка просмотра занимает более 5 с - PullRequest
0 голосов
/ 16 мая 2018

У меня есть установка с django-nginx-gunicorn-supervisor-postgresql . В админке Django у меня 504, если загрузка представления занимает более 5 секунд.

Например, если я отфильтрую представление списка изменений по множеству записей и займет больше времени, появится 504. Работает то же представление с меньшим количеством записей, если оно занимает меньше времени.

Я также заметил, что некоторые представления все еще работают в фоновом режиме, даже после 504, потому что я вижу изменения, которые они вносят в базу данных после их завершения.

Я пытался увеличить все найденные таймауты (nginx, gunicorn), но ни один из них не был настроен на 5 секунд. Есть предположения, что может быть неправильно настроено? Или где может быть тайм-аут, который поднимает 504?

Спасибо

Время ожидания, которое я настроил:

В / etc / nginx / sites-enabled / mysite

proxy_connect_timeout 60;
proxy_read_timeout 90;
proxy_send_timeout 90;
send_timeout 90;
fastcgi_read_timeout 300;

В /etc/nginx/nginx.conf

send_timeout 300;
keepalive_timeout 65;
proxy_connect_timeout 300;
proxy_read_timeout 300;
proxy_send_timeout 300;

В файле gunicorn_start (запущен супервизором)

exec gunicorn -c ${CONF_FILE} ${DJANGO_WSGI_MODULE}:application \
        --name ${NAME} \
        --user=${USER} --group=${GROUP} \
        --log-level=debug \
        --timeout=90

В файле gunicorn.conf (предыдущий $ {CONF_FILE})

timeout = 90
graceful_timeout = 30
keepalive = 3

1 Ответ

0 голосов
/ 16 мая 2018

Я нашел, что лучший способ отладить вещи - это начать в Django и работать до тех пор, пока вы не выясните, какое время истекло.

Во-первых, убедитесь, что у Django нет времени ожидания.

В одном терминале запустите:

python manage.py runserver 127.0.0.1:8000

А затем в терминале на той же машине и выполните:

wget http://127.0.0.1:8000/<path_to_your_admin_view>

Если это работает, проверьте, является ли Gunicornтайм-аут:

В конфигурационном файле Gunicorn измените настройки так, чтобы он привязывался к локальному порту вместо сокета:

exec gunicorn -c ${CONF_FILE} ${DJANGO_WSGI_MODULE}:application \
        --name ${NAME} \
        --user=${USER} --group=${GROUP} \
        --log-level=debug \
        --bind=127.0.0.1:8001
        --timeout=90

Убедитесь, что вы перезапустили Supervisor.Затем в терминале на той же машине выполните:

 wget http://127.0.0.1:8001/<path_to_your_admin_view>

Если это сработает, отмените изменение в конфигурации gunicorn, перезапустите supervisor и подключитесь напрямую к nginx, чтобы узнать, истекает ли время ожидания:

 wget http://127.0.0.1:80/<path_to_your_admin_view>

Если это работает, ваша проблема, вероятно, в апстриме прокси или балансировщика нагрузки.

...