504 Gateway Time-out (nginx и в связке nginx+apache) - что можно сделать?

504 — значит скрипт (бэкенд) слишком долго отвечал или скрипт завершается раньше, чем получен ответ.

Сразу предупрежу, если вы получаете такое сообщение на обычном shared хостинге – то проблема скорее в том, что исполняемый скрипт не укладывается во временные рамки (30 или 60 секунд – в зависимости от настройки).

Это может быть по разным причинам:
  • объем данных, обрабатываемых скриптом существенно вырос
  • скрипт ображается к другим сайтам или сервисам, которые долго фомрируют ответ
  • скрипт слишком тяжелый

504 Gateway Timeout (time out) на чистом nginx

В случае с выделеными серверами:
в php.ini увеличить значение параметра
PHP max_execution_time

в конфиге nginx увеличить время ожидания исполнения скрипта:

proxy_read_timeout 120;
        proxy_connect_timeout 120;


увеличить оперативной памяти
Файл конфигурации nginx.conf находиться в каталоге /etc/nginx/

syntax: proxy_connect_timeout время
default: proxy_connect_timeout 60
context: http, server, location
Директива задаёт таймаут для соединения с проксированным сервером. Необходимо иметь в виду, что этот таймаут __не может быть больше 75 секунд__.


504 Gateway Timeout (time out) в связке nginx+apache


Если возникла ошибка 504 Gateway Timeout (time out) в связке nginx+apache то увеличим на сервере допустимое время выполнения скриптов и ожидания ответа:
php.ini:
max_execution_time = 900


nginx.conf:
proxy_read_timeout  900;
client_header_timeout  10m;
client_body_timeout    10m;
send_timeout           10m;


Теперь есть 900 секунд (15 минут) на выполнение скриптов.

Также:
worker_processes 2; количество worker-ов, обычно один.
keepalive_timeout 400; (было 100)

Как определить количество рабочих процессов, задаваемых параметром worker_processes?

Ответ автора nginx Игоря Сысоева:

Если весь сайт помещается в память сервера, к диску обращений нет, и это выделенный сервер для nginx, то 1. Не будет лишних переключений контекста. Если нужно ходить на диск, то 5-10 — это позволит обрабатывать соединения процессами, незаблокироваными на диске.

Кроме этого необходимо понаблюдать за состоянием процессов nginx в работе в часы пик. Командой ps посмотреть состояние рабочих процессов (worker process):

# ps ax -o %cpu,vsz,wchan,command | grep "nginx\|PID"

%CPU   VSZ WCHAN  COMMAND
0,0  1428 pause  nginx: master process /usr/local/nginx/sbin/nginx
0,0  2284 -      nginx: worker process (nginx)
0,0  2128 kqread nginx: worker process (nginx)

Если один из рабочих процессов находится в состоянии ожидания «kqread» в колонке «WCHAN», то значит их количество достаточно. Ну а если уж все они постоянно находятся в этом состоянии, то их количество можно сократить до одного.

И не забывайте контролировать логи ошибок nginx, если количество соединений превысит значение, которое в может обслужить nginx текущим количеством процессов, то в логах это будет соответствующее сообщение.

0 комментариев

Оставить комментарий

Комментировать при помощи:
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.