Начини на плащане Abuse

Фиксиране на 504 gateway time out Nginx

20.02.2024, 23:31

Грешка 504 Gateway Timeout в Nginx означава, че сървърът, на който е инсталиран Nginx, не е успял да получи отговор от прокси сървъра в рамките на определения период от време. Това обикновено се случва, защото прокси сървърът не може да обработи заявката в рамките на посоченото време или поради проблеми с връзката между Nginx и прокси сървъра.

Защо се появява 504 Gateway Timeout

Грешката се появява, когато сървърът Nginx работи в прокси режим. Това се случва, когато се използва php-fpm или Apache. Ако я преведем от английски на руски език, ще получим следното - времето за изчакване на отговор от сървъра е превишено.

Причините за това поведение са няколко:

  • PHP или друг скрипт на езика напълно е увиснал и вече няма да върне никакъв отговор;
  • скриптът работи много дълго време, но Nginx има конфигуриран интервал за нулиране на връзката, ако целевият сървър не е отговорил на заявката в рамките на определеното време;
  • сървърът е претоварен и няма време да обслужва всички клиенти и да връща отговори на всички заявки на Nginx.

Сега нека да поговорим за това какво можете да направите и как да отстраните грешката 504 Gateway Timeout.

Как да поправите 504 gateway time out Nginx?

Първото нещо, което трябва да опитате на практика, е, че ако вашият сървър, 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

С това инструкцията е завършена.