Грешка 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 или друг уеб сървър, тогава трябва да конфигурирате и времетраенето на проксито.
Добавете тези редове в раздела за сървъра
:
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
С това инструкцията е завършена.