Pogreška 504 Gateway Timeout: što znači i kako je popraviti
· 6 min čitanja
Što pogreška znači
504 je web server ispred (nginx, Apache, load balancer, CDN) koji odustaje od aplikacije iza sebe. Zahtjev je proslijeđen, backend je počeo raditi, a mjerač vremena prednjeg dijela istekao je prije nego što je stigao odgovor. Razlika u odnosu na 502 Bad Gateway je u tome što je backend dostupan; samo je prespor. Tipična ograničenja su 60 sekundi u nginxu (fastcgi_read_timeout, proxy_read_timeout), 60 sekundi u Apacheu (ProxyTimeout) i 100 sekundi kod Cloudflarea, što na besplatnom planu ne možete promijeniti.
Podizanje ograničenja vremena rijetko je rješenje. Nešto traje predugo i to nešto morate pronaći.
Uobičajeni uzroci
- Spor upit baze podataka. WordPress dodatak koji pri svakom učitavanju stranice broji retke u golemoj tablici, indeks koji nedostaje, tablica
wp_optionspuna isteklih transienata. Svaki zahtjev čeka, a pod opterećenjem se čekanja zbrajaju. - Vanjski poziv koji visi. Aplikacija kontaktira pružatelja plaćanja, uslugu e-pošte, vremenski API ili licencni server, a ta usluga je spora ili ne radi. Bez ograničenja vremena na tom pozivu vaša stranica čeka na nju.
- Premalo workera. Svi PHP-FPM workeri zauzeti su sporim zahtjevima; novi čekaju u redu dok prednji dio ne odustane. Izvana to izgleda kao istek vremena iako bi svaki pojedini zahtjev bio brz.
- Cron ili sigurnosna kopija u prvom planu. Dodatak za sigurnosne kopije, uvoz, sitemap od 50.000 URL-ova: generirani unutar web zahtjeva, premašuju svako ograničenje vremena.
- Disk I/O ili swap. Serveru ponestaje memorije i koristi swap; sve se uspori deseterostruko. Vidljivo kao visoko opterećenje uz nisku iskorištenost CPU-a.
- Mreža između prednjeg dijela i backenda. Load balancer u jednom podatkovnom centru, backend u drugom, vatrozid koji tiho odbacuje pakete. Rijetko, ali 504 na svakom zahtjevu uz neaktivan backend upućuje ovamo.
Ako ste posjetitelj
Ponovno učitajte nakon minute. Ako je stranica spora, a ne nedostupna, pokušajte drugu stranicu; istek vremena može biti vezan uz jednu tešku stranicu.
Ako je riječ o vašoj stranici: prvo provjerite
Pokrenite provjeru ispada web stranice: izvješćuje o statusnom kôdu i vremenu odziva izvana. Stranica koja danas odgovara za 30 sekundi stranica je koja će sutra pod opterećenjem prikazati 504.
Na vlastitom serveru pronađite kamo odlazi vrijeme:
# gomilaju li se workeri?
sudo tail -n 30 /var/log/nginx/error.log | grep -E 'timed out|timeout'
# što PHP trenutno radi? (treba pm.status_path u poolu)
curl -s 'http://127.0.0.1/fpm-status?full' | grep -E 'state|request URI|duration' | head -40
# MySQL/MariaDB: koji se upiti izvode i koliko dugo?
sudo mysql -e 'SHOW FULL PROCESSLIST;'
# memorija i swap
free -m
vmstat 1 5
Popis procesa pun istog upita ili stupci si/so u vmstat koji nisu nula imenuju uzrok.
Popravci na vlastitom serveru
1. Uključite zapisnik sporih upita i popravite upit
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Nakon nekoliko minuta sudo mysqldumpslow -s t /var/log/mysql/slow.log | head navodi najgore upite. Dodajte indeks koji nedostaje ili pronađite dodatak koji izvodi upit i zamijenite ga. U WordPressu je napuhana tablica opcija klasika:
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;"
Sve što je u stotinama kilobajta i učitava se automatski pri svakom zahtjevu kandidat je za uklanjanje.
2. Postavite ograničenje vremena na vanjske pozive
Svaki HTTP poziv koji vaša aplikacija izvodi treba vlastito ograničenje vremena, kraće od onog web servera. U PHP-u s cURL-om: CURLOPT_CONNECTTIMEOUT 5 i CURLOPT_TIMEOUT 10. U WordPressu wp_remote_get() prima argument timeout; mnogi dodaci ostavljaju zadanu vrijednost i čekaju beskonačno. Ako usluga treće strane ne radi, stranica bi se trebala degradirati (prikazati obrazac bez cijene dostave uživo), a ne umrijeti.
3. Izmjestite dugi posao iz zahtjeva
Sigurnosne kopije, uvozi, izvozi, veliki sitemapovi i slanje e-pošte pripadaju u cron job ili red, a ne u prikaz stranice. Za WordPress isključite pseudo-cron i pokrenite pravi:
// 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. Pažljivo prilagodite ograničenja vremena
Ako jednoj stranici legitimno treba dulje (izvoz u administraciji, izvješće), podignite ograničenje samo za tu lokaciju, ne globalno:
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-om: ProxyTimeout 300 unutar bloka <Location>. Sam PHP ima max_execution_time; postavite ga na istu vrijednost ili će PHP stati prvi i dobit ćete 500 umjesto toga. Zatim sudo nginx -t && sudo systemctl reload nginx.
5. Zaustavite swapanje
ps aux --sort=-%mem | head
Ako svaki PHP-FPM worker koristi 150 MB, a vi ih na serveru od 4 GB pokrećete 30, račun se ne slaže. Smanjite pm.max_children, povećajte memoriju ili popravite dodatak koji troši memoriju. Server koji ne koristi swap je server čiji 504 uglavnom nestaju.
6. Predmemorija
Predmemorija cijelih stranica (nginx FastCGI cache, WordPress dodatak za predmemoriju, Varnish) poslužuje ponovne posjetitelje bez dodirivanja PHP-a ili baze podataka. Većina 504 pod opterećenjem nestaje čim početna stranica i najposjećenije stranice dolaze iz predmemorije.
Kad je problem vašeg hostinga
Na zajedničkom hostingu možete popraviti spore upite i dodatke, ali ne i ograničenja vremena servera ni opterećenje susjeda. Pošaljite svom hostingu:
Poštovani, moja web stranica example.com vraća „504 Gateway Timeout“ otprilike od 16:00 UTC. Stranice koje su se prije učitavale za manje od dvije sekunde sada istječu. Nisam ništa mijenjao. Možete li provjeriti je li poslužitelj baze podataka ili PHP pool mog računa preopterećen ili visoko opterećenje uzrokuje drugi račun na serveru i javiti mi što ste pronašli?
Sprječavanje sljedećeg
504 je spora stranica koja je postala sporija, a vrijeme odziva mjerljivo je mnogo prije isteka. Provjere web stranice bilježe vrijeme odziva svake provjere; postavite upozorenje na njega i vidjet ćete trend tjednima prije nego što posjetitelji vide pogrešku. Agent za servere dodaje opterećenje, memoriju i swap iznutra. Na vlastitom serveru Deep Fix pronalazi spor upit ili zaglavljen poziv i popravlja ga, uz naplatu u blokovima od 15 minuta, cijena prije narudžbe.
Što sad
Provjerite izvana
Je li stranica nedostupna svima ili samo vama i što server odgovara? Besplatno, bez registracije.
Provjera ispada web straniceIspad? Mi uskačemo.
Na vlastitom serveru ili u web prostoru s SSH pristupom: Quick Fix po fiksnoj cijeni za uobičajene uzroke, Deep Fix uz naplatu u blokovima od 15 minuta za ostalo, kroz cijelu noć i dan. Cijena prije narudžbe.
Naručite popravakViše vodiča
- Vaša web stranica ne radi. Evo što učiniti u prvih 15 minuta.
- Server ne radi: što prvo provjeriti i kojim redom
- Pogreška 502 Bad Gateway: uzroci i kako je popraviti
- Pogreška 503 Service Unavailable: preopterećenje ili održavanje?
- DNS_PROBE_FINISHED_NXDOMAIN: uzroci i popravci
- ERR_CONNECTION_REFUSED: uzroci i kako ga popraviti
- „Vaša veza nije privatna“: upozorenje o SSL certifikatu