nginx, gunicorn и django странный тайм-аут 504 шлюза
У меня есть настройки nginx / gunicorn / django следующим образом:
Nginx
server {
listen 80;
server_name myserver.com;
root /www/python/apps/pyapp/;
access_log /var/log/nginx/myserver.com.access.log;
error_log /var/log/nginx/myserver.com.error.log;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 10;
proxy_pass http://localhost:8081/;
}
}
Мой выскочка скрипт для Gunicorn
description "pyapp"
start on [2345]
stop on [06]
respawn
# start from virtualenv path
chdir /www/python/apps/pyapp/
exec /usr/bin/gunicorn -w 11 -b 0.0.0.0:8081 --error-logfile=/var/log/nginx/pyapp.log wsgi:application
Сервер работает нормально, на запросы очень хорошо отвечают. Однако, когда я начинаю направлять трафик на эту настройку со своего старого сервера, страницы начинают выдавать 504 ошибки времени ожидания шлюза.
То, что делают запросы, это только вопрос извлечения данных из БД и рендеринга с использованием django-rest-framework. Глядя на список процессов MySQL, кажется, что там нет застрявших запросов. Это немного странно.
Любые рекомендации?
1 ответ
Сначала вы можете попробовать, как работает ваш бэкэнд (django / gunicorn) без nginx впереди. ab (тест Apache) является простым инструментом для этой задачи.
Вы можете запустить его прямо с сервера, или если ваш порт 8081 не защищен брандмауэром ни от одной машины:
ab -c 50 -n 500 http://localhost/path-xyz/
(ab доступен через пакет apache2-utils, по крайней мере, в системах на основе Debian) -c означает "параллелизм", -n - количество запросов.
Если бэкэнд является узким местом, и вы все равно используете nginx - это может быть вариант для некоторого кэширования (не знаю ваше приложение, но, возможно,...). Если ваш API предоставляет данные, которые часто меняются, вы можете установить очень короткое время кеширования. (От 1 до 10 секунд) - поэтому, если у вас есть, например, 100 запросов в секунду, только один из них должен попасть в бэкэнд, остальные получат кэшированный ответ.
Для прокси / кэша nginx см., Например, здесь.