Chyba 504 Gateway Timeout: čo znamená a ako ju opraviť
· 6 min čítania
Čo chyba znamená
504 je webový server vpredu (nginx, Apache, load balancer, CDN), ktorý sa vzdal čakania na aplikáciu za sebou. Požiadavka bola odovzdaná, backend začal pracovať a časovač predku vypršal skôr, než prišla odpoveď. Rozdiel oproti 502 Bad Gateway je v tom, že backend je dosiahnuteľný; je len príliš pomalý. Typické časovače sú 60 sekúnd v nginx (fastcgi_read_timeout, proxy_read_timeout), 60 sekúnd v Apache (ProxyTimeout) a 100 sekúnd v Cloudflare, ktoré v bezplatnom tarife zmeniť nemôžete.
Zvýšenie časového limitu je zriedkavo oprava. Niečo trvá príliš dlho a to „niečo“ musíte nájsť.
Bežné príčiny
- Pomalý databázový dotaz. Plugin WordPressu, ktorý pri každom načítaní stránky počíta riadky v obrovskej tabuľke, chýbajúci index, tabuľka
wp_optionsplná vypršaných transientov. Každá požiadavka čaká a pri záťaži sa čakania sčítavajú. - Externé volanie, ktoré visí. Aplikácia kontaktuje poskytovateľa platieb, poštovú službu, API počasia alebo licenčný server a tá služba je pomalá alebo nefunguje. Bez časového limitu na tomto volaní na ňu vaša stránka čaká.
- Príliš málo workerov. Všetci workeri PHP-FPM sú zaneprázdnení pomalými požiadavkami; nové čakajú vo fronte, kým sa predok nevzdá. Zvonku to vyzerá ako timeout, hoci každá jednotlivá požiadavka by bola rýchla.
- Cron alebo záloha beží v popredí. Plugin na zálohovanie, import, sitemap s 50 000 URL: generované v rámci webovej požiadavky prekročia každý časový limit.
- Disk I/O alebo swap. Serveru dôjde pamäť a swapuje; všetko sa spomalí desaťnásobne. Viditeľné ako vysoká záťaž s nízkym využitím CPU.
- Sieť medzi predkom a zadkom. Load balancer v jednom dátovom centre, backend v inom, firewall potichu zahadzuje pakety. Zriedkavé, ale 504 pri každej požiadavke s nečinným backendom ukazuje sem.
Ak ste návštevník
Načítajte stránku znova po minúte. Ak je web skôr pomalý než nefunkčný, skúste inú stránku; timeout môže súvisieť s jednou náročnou stránkou.
Ak ide o váš web: najprv skontrolujte
Spustite kontrolu dostupnosti webu: hlási stavový kód a čas odozvy zvonku. Web, ktorý dnes odpovie za 30 sekúnd, je web, ktorý zajtra pri záťaži ukáže 504.
Na vlastnom serveri zistite, kam sa čas stráca:
# hromadia sa workeri?
sudo tail -n 30 /var/log/nginx/error.log | grep -E 'timed out|timeout'
# čo PHP robí práve teraz? (vyžaduje pm.status_path v pooli)
curl -s 'http://127.0.0.1/fpm-status?full' | grep -E 'state|request URI|duration' | head -40
# MySQL/MariaDB: ktoré dotazy bežia a ako dlho?
sudo mysql -e 'SHOW FULL PROCESSLIST;'
# pamäť a swap
free -m
vmstat 1 5
Zoznam procesov plný toho istého dotazu alebo stĺpce si/so vo vmstat, ktoré nie sú nulové, pomenujú príčinu.
Opravy na vlastnom serveri
1. Zapnite log pomalých dotazov a opravte dotaz
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Po niekoľkých minútach sudo mysqldumpslow -s t /var/log/mysql/slow.log | head vypíše najhoršie dotazy. Pridajte chýbajúci index alebo nájdite plugin, ktorý dotaz spúšťa, a nahraďte ho. Vo WordPresse je klasikou nafúknutá tabuľka options:
wp transient delete --all
wp db query "SELECT option_name, LENGTH(option_value) AS size FROM wp_options WHERE autoload='yes' ORDER BY size DESC LIMIT 20;"
Čokoľvek v stovkách kilobajtov, čo sa pri každej požiadavke automaticky načíta, je kandidátom na odstránenie.
2. Nastavte časový limit na externé volania
Každé HTTP volanie, ktoré vaša aplikácia robí, potrebuje vlastný časový limit, kratší než ten webového servera. V PHP s cURL: CURLOPT_CONNECTTIMEOUT 5 a CURLOPT_TIMEOUT 10. Vo WordPresse wp_remote_get() berie argument timeout; mnohé pluginy ho nechajú na predvolenej hodnote a čakajú donekonečna. Ak služba tretej strany nefunguje, stránka by sa mala zjednodušiť (zobraziť formulár bez živej ceny dopravy), nie padnúť.
3. Presuňte dlhú prácu mimo požiadavky
Zálohy, importy, exporty, veľké sitemapy a odosielanie pošty patria do cron úlohy alebo fronty, nie do zobrazenia stránky. Vo WordPresse vypnite pseudo-cron a spúšťajte skutočný:
// wp-config.php
define('DISABLE_WP_CRON', true);
# crontab -e
*/5 * * * * cd /var/www/example.com && wp cron event run --due-now >/dev/null 2>&1
4. Upravte časové limity s opatrnosťou
Ak jedna stránka legitímne potrebuje dlhší čas (export v administrácii, report), zvýšte časový limit len pre túto lokáciu, nie globálne:
location = /wp-admin/export.php {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_read_timeout 300;
}
Apache s PHP-FPM: ProxyTimeout 300 v bloku <Location>. PHP samotné má max_execution_time; nastavte ho na rovnakú hodnotu, inak sa PHP zastaví prvé a dostanete namiesto toho 500. Potom sudo nginx -t && sudo systemctl reload nginx.
5. Zastavte swapovanie
ps aux --sort=-%mem | head
Ak každý worker PHP-FPM používa 150 MB a vy ich na serveri so 4 GB spúšťate 30, matematika nevychádza. Znížte pm.max_children, pridajte pamäť alebo opravte plugin, ktorý pamäť využíva. Server, ktorý nesvapuje, je server, ktorému väčšina 504 zmizne.
6. Cache
Cache celých stránok (FastCGI cache v nginx, plugin na cache vo WordPresse, Varnish) obslúži opakovaných návštevníkov bez dotyku PHP alebo databázy. Väčšina 504 pri záťaži zmizne, keď úvodná stránka a najčastejšie stránky prichádzajú z cache.
Keď je to problém vášho poskytovateľa
Na zdieľanom hostingu môžete opraviť pomalé dotazy a pluginy, ale nie časové limity servera ani záťaž susedov. Pošlite poskytovateľovi:
Dobrý deň, môj web example.com vracia „504 Gateway Timeout“ približne od 16:00 UTC. Stránky, ktoré sa predtým načítali za menej než dve sekundy, teraz vypršia. Nič som nemenil. Mohli by ste skontrolovať, či nie je preťažený databázový server alebo pool PHP môjho účtu, alebo či vysokú záťaž nespôsobuje iný účet na serveri, a povedať mi, čo zistíte?
Ako predísť ďalšej
504 je pomalý web, ktorý sa ešte spomalil, a čas odozvy sa dá merať dlho pred časovým limitom. Kontroly webu zaznamenávajú čas odozvy každej kontroly; nastavte naň upozornenie a trend uvidíte týždne predtým, než návštevníci uvidia chybu. Serverový agent pridáva záťaž, pamäť a swap zvnútra. Na vlastnom serveri Deep Fix nájde pomalý dotaz alebo visiace volanie a opraví ho, účtovaný po 15-minútových blokoch, cena pred objednaním.
Čo ďalej
Skontrolujte to zvonku
Je web nedostupný pre všetkých alebo len pre vás a čo server odpovedá? Zdarma, bez registrácie.
Kontrola dostupnosti webuNefunguje? Zasiahneme.
Na vlastnom serveri alebo vo webhostingu s prístupom cez SSH: Quick Fix za pevnú cenu pri bežných príčinách, Deep Fix účtovaný po 15-minútových blokoch pri ostatných, nepretržite. Cena pred objednaním.
Nechať to opraviťĎalšie návody
- Váš web nefunguje. Čo robiť v prvých 15 minútach.
- Server nefunguje: čo skontrolovať ako prvé a v akom poradí
- Chyba 502 Bad Gateway: príčiny a oprava
- Chyba 503 Service Unavailable: preťaženie alebo údržba?
- DNS_PROBE_FINISHED_NXDOMAIN: príčiny a opravy
- ERR_CONNECTION_REFUSED: príčiny a oprava
- „Vaše pripojenie nie je súkromné“: varovanie o SSL certifikáte