Chybové hlášení 504 Gateway Timeout v systému Nginx znamená, že server se systémem Nginx nebyl schopen přijmout odpověď od proxy serveru v určeném časovém období. K tomu obvykle dochází proto, že proxy server nemůže zpracovat požadavek v určeném čase, nebo kvůli problémům se spojením mezi Nginx a proxy serverem.
Chyba se objevuje, když server Nginx běží v režimu proxy serveru. K tomu dochází, pokud se používá php-fpm nebo Apache. Pokud ji přeložíme z angličtiny do ruštiny, dostaneme následující hlášku - byla překročena doba čekání na odpověď serveru.
Příčin tohoto chování je několik:
Nyní si povíme, co můžete udělat a jak opravit chybu 504 Gateway Timeout.
První věc, kterou je třeba vyzkoušet v praxi, je, že pokud váš server, php-fpm nebo apache nemá dostatek systémových prostředků, jako je paměť nebo procesor, zjistěte volnou
paměť RAM pomocí příkazu free:
$ free -h
Zatížení procesoru můžete zjistit pomocí příkazu htop
:
$ htop
Pokud vidíte, že PHP zabírá veškerý čas procesoru, znamená to, že problém je ve zdrojích serveru. Můžete se pokusit vypořádat s enginem webu, optimalizovat prostředky nebo zvolit výkonný server VPS.
Druhá možnost - pokud to bylo naplánováno tak, aby skript pracoval dlouhou dobu. V tomto případě je třeba nakonfigurovat Nginx tak, aby čekal na odpověď Apache nebo php-fpm. Pro vyřešení problému v případě php-fpm stačí přidat dva řádky do konfiguračního bloku fastgci:
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
300 znamená 300 sekund, což pro většinu skriptů stačí, ale v případě potřeby není obtížné nastavit i více. K chybě 504 může dojít také v případě, že je Nginx použit jako proxy server pro Apache nebo jiný webový server, pak je také třeba nastavit dobu čekání proxy serveru.
Do sekce serveru
přidejte tyto řádky:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
V tomto případě máme nastaven timeout 600 sekund.
Nyní musíme restartovat Nginx:
$ sudo systemctl restart nginx
Další důvod a jeho řešení, pokud skript visí. Pokud skript spustíte sami, hned uvidíte, co visí, ale pokud na takovou chybu narazí uživatelé, jedná se o závažnější problém. Pomocí příkazu můžete zjistit, zda se vaši uživatelé s takovou chybou setkávají a kde se vyskytuje:
$ fgrep -i " 504 " /var/log/nginx/access.log
Podrobnější informace lze někdy vidět v souboru error.log
:
$ fgrep -i " 504 " /var/log/nginx/error.log
Dále, pokud je problém v php-fpm, můžete sledovat, které skripty běží pomalu, pomocí vestavěné funkce slow-log
.
Chcete-li ji aktivovat, přidejte do konfigurace poolu následující řádky:
$ sudo vi /etc/php-fpm.d/www.conf
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
Tím je instrukce dokončena.