Помилка 504 Gateway Timeout у Nginx означає, що сервер, на якому працює Nginx, не зміг отримати відповідь від проксі-сервера у встановлений період часу. Це зазвичай відбувається через те, що проксі-сервер не може обробити запит протягом заданого часу або через проблеми зі з'єднанням між Nginx і проксі-сервером.
Помилка виникає, коли сервер Nginx працює в режимі проксі. Так трапляється в разі застосування php-fpm або Apache. Якщо перекласти з англійської на російську, отримаємо таке - перевищено час очікування відповіді від сервера.
Кілька причин такої поведінки:
Тепер поговоримо, що ж можна зробити і як усунути помилку 504 Gateway Timeout.
Перше, що слід спробувати на практиці, - якщо вашому серверу, php-fpm або apache не вистачає ресурсів системи, наприклад, пам'яті або процесора, подивіться вільну ОЗП за допомогою команди free
:
$ free -h
Навантаження на процесор можна дізнатися командою htop
:
$ htop
Якщо ви бачите, що PHP займає весь процесорний час, то отже проблема в ресурсах сервера. Можна спробувати розібратися з движком сайту, оптимізувати ресурс або вибрати потужний VPS сервер.
Другий варіант - якщо так і було заплановано, щоб скрипт працював довго. У такому разі потрібно налаштувати Nginx, щоб він дочекався відповіді від Apache або php-fpm. Для розв'язання проблеми у випадку з php-fpm потрібно лише додати два рядки в блок налаштування fastgci:
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
300 означає 300 секунд, для більшості скриптів цього вистачає, але за необхідності також не важко буде встановити більше. Також помилка 504 може виникати, коли Nginx використовується як проксі для Apache або будь-якого іншого веб-сервера, тоді потрібно ще налаштувати час очікування для проксі.
Додайте ці рядки в секцію server
:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
У цьому випадку маємо таймаут 600 секунд.
Тепер нам потрібно перезапустити Nginx:
$ sudo systemctl restart nginx
Інша причина та її рішення, якщо скрипт завис. Якщо ви самі запускаєте скрипт, то одразу побачите, що зависло, але якщо така помилка трапляється у користувачів, то це вже більш серйозна проблема. Ви можете подивитися, чи зустрічаються вашим користувачам такі помилки і де вони зустрічаються за допомогою команди:
$ fgrep -i " 504 " /var/log/nginx/access.log
Більш детальну інформацію іноді можна побачити в error.log
:
$ fgrep -i " 504 " /var/log/nginx/error.log
Далі, якщо проблема саме в php-fpm, ви можете відстежити які скрипти виконуються повільно за допомогою вбудованої функції slow-log
.
Для її активації додайте такі рядки в конфігурацію вашого пулу:
$ sudo vi /etc/php-fpm.d/www.conf
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
На цьому інструкцію завершено.