504 Gateway Timeout: mitä se tarkoittaa ja miten sen korjaa
· 5 min lukuaika
Mitä virhe tarkoittaa
504 tarkoittaa, että edessä oleva verkkopalvelin (nginx, Apache, kuormantasaaja, CDN) luovuttaa sen takana olevan sovelluksen suhteen. Pyyntö välitettiin eteenpäin, taustajärjestelmä aloitti työn, ja edessä olevan kello kävi loppuun ennen kuin vastaus tuli takaisin. Ero 502 Bad Gateway -virheeseen on se, että taustajärjestelmä on tavoitettavissa; se on vain liian hidas. Tyypilliset ajastimet ovat 60 sekuntia nginxissä (fastcgi_read_timeout, proxy_read_timeout), 60 sekuntia Apachessa (ProxyTimeout) ja 100 sekuntia Cloudflarella, jota ei voi muuttaa ilmaisessa paketissa.
Aikakatkaisun nostaminen on harvoin ratkaisu. Jokin kestää liian kauan, ja se jokin on se, mikä sinun on löydettävä.
Yleiset syyt
- Hidas tietokantakysely. WordPress-lisäosa, joka laskee rivit valtavasta taulusta jokaisella sivulatauksella, puuttuva indeksi,
wp_options-taulu täynnä vanhentuneita transientteja. Jokainen pyyntö odottaa, ja kuormituksessa odotukset kasautuvat. - Ulkoinen kutsu, joka jumiutuu. Sovellus ottaa yhteyttä maksupalveluntarjoajaan, sähköpostipalveluun, sää-API:in tai lisenssipalvelimeen, ja kyseinen palvelu on hidas tai alhaalla. Ilman aikakatkaisua kutsulle sivusi odottaa sitä.
- Liian vähän työprosesseja. Kaikki PHP-FPM:n työprosessit ovat varattuja hitailla pyynnöillä; uudet jonottavat, kunnes etuosa luovuttaa. Ulkoa tämä näyttää aikakatkaisulta, vaikka jokainen yksittäinen pyyntö olisi nopea.
- Cron tai varmuuskopiointi ajetaan etualalla. Varmuuskopiolisäosa, tuonti, 50 000 URL-osoitteen sivukartta: kun ne tuotetaan verkkopyynnön sisällä, ne ylittävät minkä tahansa aikakatkaisun.
- Levyn I/O tai swap. Palvelimen muisti loppuu ja se alkaa käyttää swapia; kaikki hidastuu kymmenkertaisesti. Näkyy korkeana kuormana matalalla suorittimen käytöllä.
- Verkko etuosan ja takaosan välillä. Kuormantasaaja yhdessä konesalissa, taustajärjestelmä toisessa, palomuuri, joka pudottaa paketteja hiljaa. Harvinaista, mutta 504 jokaisella pyynnöllä joutilaan taustajärjestelmän kanssa viittaa tähän.
Jos olet kävijä
Lataa uudelleen minuutin kuluttua. Jos sivusto on hidas eikä alhaalla, kokeile toista sivua; aikakatkaisu voi liittyä yhteen raskaaseen sivuun.
Jos kyse on sinun sivustostasi: tarkista ensin
Aja sivuston saatavuuden tarkistin: se raportoi tilakoodin ja vasteajan ulkoa. Sivusto, joka vastaa tänään 30 sekunnissa, on sivusto, joka näyttää huomenna 504:n kuormituksessa.
Omalla palvelimellasi selvitä, minne aika kuluu:
# kasautuvatko työprosessit?
sudo tail -n 30 /var/log/nginx/error.log | grep -E 'timed out|timeout'
# mitä PHP tekee juuri nyt? (tarvitsee pm.status_path:n poolissa)
curl -s 'http://127.0.0.1/fpm-status?full' | grep -E 'state|request URI|duration' | head -40
# MySQL/MariaDB: mitkä kyselyt ovat käynnissä ja kuinka kauan?
sudo mysql -e 'SHOW FULL PROCESSLIST;'
# muisti ja swap
free -m
vmstat 1 5
Prosessilista täynnä samaa kyselyä tai vmstatin si/so-sarakkeet, jotka eivät ole nollia, nimeävät syyn.
Korjaukset omalla palvelimella
1. Ota hitaiden kyselyjen loki käyttöön ja korjaa kysely
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Muutaman minuutin kuluttua sudo mysqldumpslow -s t /var/log/mysql/slow.log | head listaa pahimmat kyselyt. Lisää puuttuva indeksi tai etsi lisäosa, joka ajaa kyselyn, ja korvaa se. WordPressissä paisunut options-taulu on klassikko:
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;"
Kaikki satojen kilotavujen kokoinen, joka latautuu automaattisesti jokaisella pyynnöllä, on poistokandidaatti.
2. Aseta aikakatkaisu ulkoisille kutsuille
Jokainen sovelluksesi tekemä HTTP-kutsu tarvitsee oman aikakatkaisunsa, lyhyemmän kuin verkkopalvelimen. PHP:ssä cURL:lla: CURLOPT_CONNECTTIMEOUT 5 ja CURLOPT_TIMEOUT 10. WordPressissä wp_remote_get() ottaa timeout-argumentin; monet lisäosat jättävät sen oletukseen ja odottavat ikuisesti. Jos kolmannen osapuolen palvelu on alhaalla, sivun pitäisi heikentyä (näyttää lomake ilman reaaliaikaista toimituskuluarviota), ei kuolla.
3. Siirrä pitkä työ pois pyynnöstä
Varmuuskopiot, tuonnit, viennit, suuret sivukartat ja sähköpostin lähetys kuuluvat cron-työhön tai jonoon, eivät sivunäkymään. WordPressissä poista pseudo-cron käytöstä ja aja oikea:
// 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. Säädä aikakatkaisuja varoen
Jos yksittäinen sivu tarvitsee perustellusti pidempään (hallintapaneelin vienti, raportti), nosta aikakatkaisua vain kyseiselle sijainnille, ei globaalisti:
location = /wp-admin/export.php {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_read_timeout 300;
}
Apache PHP-FPM:llä: ProxyTimeout 300 <Location>-lohkon sisällä. PHP:llä itsellään on max_execution_time; aseta se samaan arvoon, tai PHP pysähtyy ensin ja saat 500:n. Sitten sudo nginx -t && sudo systemctl reload nginx.
5. Lopeta swapin käyttö
ps aux --sort=-%mem | head
Jos PHP-FPM:n työprosessit käyttävät kukin 150 Mt ja niitä on 30 4 Gt:n palvelimella, laskutoimitus ei täsmää. Laske pm.max_children, lisää muistia tai korjaa lisäosa, joka käyttää muistia. Palvelin, joka ei käytä swapia, on palvelin, jonka 504:t useimmiten katoavat.
6. Välimuisti
Koko sivun välimuisti (nginxin FastCGI-välimuisti, WordPressin välimuistilisäosa, Varnish) palvelee toistuvat kävijät koskematta PHP:hen tai tietokantaan. Useimmat kuormituksessa esiintyvät 504:t katoavat, kun etusivu ja suosituimmat sivut tulevat välimuistista.
Kun ongelma on palveluntarjoajan
Jaetussa hostingissa voit korjata hitaat kyselyt ja lisäosat mutta et palvelimen aikakatkaisuja tai naapurien kuormaa. Lähetä palveluntarjoajalle:
Hei, verkkosivustoni example.com palauttaa ”504 Gateway Timeout” noin klo 16.00 UTC alkaen. Sivut, jotka ennen latautuivat alle kahdessa sekunnissa, aiheuttavat nyt aikakatkaisun. En ole muuttanut mitään. Pyydän tarkistamaan, onko tilini tietokantapalvelin tai PHP-pooli ylikuormitettu tai aiheuttaako jokin toinen palvelimella oleva tili suurta kuormaa, ja kertomaan, mitä löytyy.
Seuraavan ehkäiseminen
504 on hidas sivusto, josta tuli hitaampi, ja vasteaika on mitattavissa kauan ennen aikakatkaisua. Verkkosivutarkistukset tallentavat jokaisen tarkistuksen vasteajan; aseta hälytys sille, niin näet suuntauksen viikkoja ennen kuin kävijät näkevät virheen. Palvelinagentti lisää kuorman, muistin ja swapin sisältä päin. Omalla palvelimellasi Deep Fix löytää hitaan kyselyn tai jumiutuneen kutsun ja korjaa sen, laskutus 15 minuutin jaksoissa, hinta ennen tilausta.
Mitä seuraavaksi
Tarkista se ulkoa
Onko sivusto alhaalla kaikille vai vain sinulle, ja mitä palvelin vastaa? Ilmainen, ei rekisteröitymistä.
Sivuston saatavuuden tarkistinAlhaalla? Hoidamme sen.
Omalla palvelimellasi tai webtilassa, johon on SSH-pääsy: Quick Fix kiinteään hintaan yleisiin syihin, Deep Fix 15 minuutin jaksoissa laskutettuna loppuun, kellon ympäri. Hinta ennen tilausta.
Tilaa korjausLisää oppaita
- Verkkosivustosi on alhaalla. Näin toimit ensimmäisten 15 minuutin aikana.
- Palvelin alhaalla: mitä tarkistaa ensin ja missä järjestyksessä
- 502 Bad Gateway: syyt ja korjaus
- 503 Service Unavailable: ylikuormitus vai huolto?
- DNS_PROBE_FINISHED_NXDOMAIN: syyt ja korjaukset
- ERR_CONNECTION_REFUSED: syyt ja korjaus
- ”Yhteytesi ei ole yksityinen”: SSL-varmenteen varoitus