504 Gateway Timeout: kaj pomeni in kako ga odpraviti
· Branje: 6 min
Kaj napaka pomeni
504 je spletni strežnik spredaj (nginx, Apache, uravnalnik obremenitve, CDN), ki obupa nad aplikacijo za seboj. Zahteva je bila posredovana, zaledni del je začel delati, časovnik spredaj pa je potekel, preden je prišel odgovor. Razlika od 502 Bad Gateway je, da je zaledni del dosegljiv; le prepočasen je. Tipični časovniki so 60 sekund v nginxu (fastcgi_read_timeout, proxy_read_timeout), 60 sekund v Apacheju (ProxyTimeout) in 100 sekund pri Cloudflaru, ki jih pri brezplačnem paketu ne morete spremeniti.
Zvišanje časovne omejitve redko pomaga. Nekaj traja predolgo in prav to morate najti.
Pogosti vzroki
- Počasna poizvedba v podatkovno bazo. Vtičnik WordPress, ki ob vsakem nalaganju strani šteje vrstice v ogromni tabeli, manjkajoč indeks, tabela
wp_options, polna potečenih prehodnih vrednosti (transients). Vsaka zahteva čaka in pod obremenitvijo se čakanja seštevajo. - Zunanji klic, ki visi. Aplikacija kliče ponudnika plačil, poštno storitev, vremenski API ali licenčni strežnik, ta storitev pa je počasna ali ne deluje. Brez časovne omejitve pri tem klicu vaša stran čaka nanj.
- Premalo delavcev. Vsi delavci PHP-FPM so zasedeni s počasnimi zahtevami; nove čakajo v vrsti, dokler sprednji del ne obupa. Od zunaj to izgleda kot časovna omejitev, čeprav bi bila vsaka posamezna zahteva hitra.
- Cron ali varnostna kopija, ki teče v ospredju. Vtičnik za varnostno kopiranje, uvoz, zemljevid spletnega mesta s 50.000 naslovi URL: če se ustvarjajo znotraj spletne zahteve, presežejo vsako časovno omejitev.
- V/I diska ali swap. Strežniku zmanjka pomnilnika in uporablja swap; vse se upočasni desetkrat. Vidno kot visoka obremenitev z nizko porabo CPU.
- Omrežje med sprednjim in zadnjim delom. Uravnalnik obremenitve v enem podatkovnem centru, zaledni del v drugem, požarni zid, ki tiho zavrača pakete. Redko, vendar na to kaže 504 pri vsaki zahtevi z nedejavnim zalednim delom.
Če ste obiskovalec
Znova naložite čez minuto. Če je spletno mesto počasno, ne pa da ne deluje, poskusite drugo stran; časovna omejitev je morda vezana na eno težko stran.
Če je to vaše spletno mesto: najprej preverite
Zaženite preverjanje delovanja spletnega mesta: poroča kodo stanja in odzivni čas od zunaj. Spletno mesto, ki danes odgovori v 30 sekundah, je spletno mesto, ki bo jutri pod obremenitvijo pokazalo 504.
Na vašem lastnem strežniku poiščite, kam gre čas:
# se delavci kopičijo?
sudo tail -n 30 /var/log/nginx/error.log | grep -E 'timed out|timeout'
# kaj PHP počne zdaj? (potrebuje pm.status_path v poolu)
curl -s 'http://127.0.0.1/fpm-status?full' | grep -E 'state|request URI|duration' | head -40
# MySQL/MariaDB: katere poizvedbe tečejo in kako dolgo?
sudo mysql -e 'SHOW FULL PROCESSLIST;'
# pomnilnik in swap
free -m
vmstat 1 5
Seznam procesov, poln iste poizvedbe, ali stolpca si/so v vmstat, ki nista nič, imenuje vzrok.
Popravki na vašem lastnem strežniku
1. Vklopite dnevnik počasnih poizvedb in popravite poizvedbo
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Po nekaj minutah sudo mysqldumpslow -s t /var/log/mysql/slow.log | head našteje najslabše poizvedbe. Dodajte manjkajoči indeks ali poiščite vtičnik, ki poizvedbo izvaja, in ga zamenjajte. Pri WordPressu je klasika napihnjena tabela možnosti:
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;"
Vse, kar je v stotinah kilobajtov in se samodejno naloži pri vsaki zahtevi, je kandidat za odstranitev.
2. Zunanjim klicem dodajte časovno omejitev
Vsak klic HTTP, ki ga naredi vaša aplikacija, potrebuje lastno časovno omejitev, krajšo od omejitve spletnega strežnika. V PHP s cURL: CURLOPT_CONNECTTIMEOUT 5 in CURLOPT_TIMEOUT 10. V WordPressu wp_remote_get() sprejme argument timeout; mnogi vtičniki ga pustijo na privzeti vrednosti in čakajo v nedogled. Če storitev tretje osebe ne deluje, naj stran postane skromnejša (prikaže obrazec brez dostavnine v živo), ne pa da umre.
3. Dolgo delo premaknite iz zahteve
Varnostne kopije, uvozi, izvozi, veliki zemljevidi spletnega mesta in pošiljanje e-pošte sodijo v opravilo cron ali vrsto, ne v ogled strani. Pri WordPressu izklopite psevdo-cron in zaženite pravega:
// 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. Previdno prilagodite časovne omejitve
Če ena sama stran upravičeno potrebuje več časa (izvoz v skrbniškem delu, poročilo), zvišajte časovno omejitev samo za to lokacijo, 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: ProxyTimeout 300 znotraj bloka <Location>. PHP sam ima max_execution_time; nastavite ga na isto vrednost, sicer se PHP ustavi prvi in dobite 500 namesto tega. Nato sudo nginx -t && sudo systemctl reload nginx.
5. Prenehajte z uporabo swapa
ps aux --sort=-%mem | head
Če vsak delavec PHP-FPM porabi 150 MB in jih na strežniku s 4 GB teče 30, račun ne gre skupaj. Znižajte pm.max_children, povečajte pomnilnik ali popravite vtičnik, ki porablja pomnilnik. Strežnik, ki ne uporablja swapa, je strežnik, katerega 504 večinoma izginejo.
6. Predpomnilnik
Predpomnilnik celotnih strani (predpomnilnik FastCGI v nginxu, vtičnik za predpomnjenje WordPressa, Varnish) streže ponavljajočim se obiskovalcem, ne da bi se dotaknil PHP ali podatkovne baze. Večina 504 pod obremenitvijo izgine, ko začetna stran in najpogostejše strani prihajajo iz predpomnilnika.
Ko je težava pri vašem ponudniku gostovanja
Pri skupnem gostovanju lahko popravite počasne poizvedbe in vtičnike, ne pa časovnih omejitev strežnika ali obremenitve sosedov. Ponudniku pošljite:
Pozdravljeni, moje spletno mesto example.com od približno 16:00 UTC vrača „504 Gateway Timeout“. Strani, ki so se prej nalagale v manj kot dveh sekundah, zdaj presežejo časovno omejitev. Na moji strani ni bilo nobenih sprememb. Ali lahko preverite, ali je strežnik podatkovne baze ali pool PHP mojega računa preobremenjen ali pa visoko obremenitev povzroča drug račun na strežniku, in mi sporočite, kaj ste ugotovili?
Preprečevanje naslednjega
504 je počasno spletno mesto, ki je postalo še počasnejše, odzivni čas pa je merljiv dolgo pred časovno omejitvijo. Preverjanja spletnih mest beležijo odzivni čas vsakega preverjanja; nastavite opozorilo nanj in trend boste videli tedne, preden obiskovalci vidijo napako. Agent za strežnik doda obremenitev, pomnilnik in swap od znotraj. Na vašem lastnem strežniku Deep Fix poišče počasno poizvedbo ali viseči klic in ga odpravi, obračunan v 15-minutnih blokih, cena pred naročilom.
Kaj zdaj
Preverite od zunaj
Ali spletno mesto ne deluje za vse ali samo za vas in kaj odgovarja strežnik? Brezplačno, brez registracije.
Preverjanje delovanja spletnega mestaNe deluje? Posežemo mi.
Na vašem lastnem strežniku ali v spletnem prostoru z dostopom SSH: Quick Fix po fiksni ceni za pogoste vzroke, Deep Fix, obračunan v 15-minutnih blokih, za vse ostalo, 24 ur na dan. Ceno vidite pred naročilom.
Naročite popraviloVeč vodičev
- Vaše spletno mesto ne deluje. Kaj storiti v prvih 15 minutah.
- Strežnik ne deluje: kaj preveriti najprej in v katerem vrstnem redu
- 502 Bad Gateway: vzroki in kako ga odpraviti
- 503 Service Unavailable: preobremenjeno ali v vzdrževanju?
- DNS_PROBE_FINISHED_NXDOMAIN: vzroki in rešitve
- ERR_CONNECTION_REFUSED: vzroki in kako ga odpraviti
- „Vaša povezava ni zasebna“: opozorilo o certifikatu SSL