504 Gateway Timeout: τι σημαίνει και πώς να το διορθώσεις
· 2 λεπτά ανάγνωσης
Τι σημαίνει το σφάλμα
Ένα 504 είναι ο web server μπροστά (nginx, Apache, ένας load balancer, ένα CDN) που τα παρατά με την εφαρμογή πίσω του. Το αίτημα προωθήθηκε, το backend άρχισε να δουλεύει και το χρονόμετρο του μπροστινού μέρους τελείωσε πριν έρθει απάντηση. Η διαφορά από ένα 502 Bad Gateway είναι ότι το backend είναι προσβάσιμο· απλώς είναι πολύ αργό. Τυπικά χρονόμετρα είναι 60 δευτερόλεπτα στο nginx (fastcgi_read_timeout, proxy_read_timeout), 60 δευτερόλεπτα στο Apache (ProxyTimeout) και 100 δευτερόλεπτα στο Cloudflare, που δεν μπορείς να το αλλάξεις στο δωρεάν πρόγραμμα.
Το να ανεβάσεις το timeout σπάνια είναι η λύση. Κάτι καθυστερεί πολύ και αυτό το κάτι πρέπει να βρεις.
Συνηθισμένες αιτίες
- Ένα αργό query βάσης δεδομένων. Ένα plugin WordPress που μετράει γραμμές σε έναν τεράστιο πίνακα σε κάθε φόρτωση σελίδας, ένα ευρετήριο που λείπει, ένας πίνακας
wp_optionsγεμάτος ληγμένα transients. Κάθε αίτημα περιμένει και υπό φορτίο οι αναμονές αθροίζονται. - Μια εξωτερική κλήση που κρεμάει. Η εφαρμογή επικοινωνεί με έναν πάροχο πληρωμών, μια υπηρεσία email, ένα API καιρού ή έναν server αδειών, και αυτή η υπηρεσία είναι αργή ή έχει πέσει. Χωρίς timeout σε αυτή την κλήση, η σελίδα σου περιμένει.
- Πολύ λίγοι workers. Όλοι οι workers του PHP-FPM είναι απασχολημένοι με αργά αιτήματα· τα νέα περιμένουν στην ουρά μέχρι να τα παρατήσει το μπροστινό μέρος. Απέξω φαίνεται σαν timeout, ακόμη κι αν κάθε μεμονωμένο αίτημα θα ήταν γρήγορο.
- Cron ή backup που τρέχει στο προσκήνιο. Ένα plugin backup, μια εισαγωγή, ένα sitemap 50.000 URL: όταν δημιουργούνται μέσα σε ένα web αίτημα, ξεπερνούν οποιοδήποτε timeout.
- I/O δίσκου ή swap. Ο server τελειώνει τη μνήμη και κάνει swap· όλα επιβραδύνονται δέκα φορές. Φαίνεται ως υψηλό φορτίο με χαμηλή χρήση CPU.
- Δίκτυο μεταξύ μπροστινού και πίσω μέρους. Ένας load balancer σε ένα data center, το backend σε άλλο, ένα firewall που ρίχνει πακέτα σιωπηλά. Σπάνιο, αλλά ένα 504 σε κάθε αίτημα με αδρανές backend δείχνει προς τα εδώ.
Αν είσαι επισκέπτης
Φόρτωσε ξανά μετά από ένα λεπτό. Αν η ιστοσελίδα είναι αργή και όχι πεσμένη, δοκίμασε άλλη σελίδα· το timeout μπορεί να σχετίζεται με μία βαριά σελίδα.
Αν είναι η δική σου ιστοσελίδα: έλεγξε πρώτα
Τρέξε τον έλεγχο διαθεσιμότητας ιστοσελίδας: αναφέρει τον κωδικό κατάστασης και τον χρόνο απόκρισης απέξω. Μια ιστοσελίδα που απαντά σε 30 δευτερόλεπτα σήμερα είναι μια ιστοσελίδα που θα δείξει 504 υπό φορτίο αύριο.
Στον δικό σου server, βρες πού πηγαίνει ο χρόνος:
# συσσωρεύονται workers;
sudo tail -n 30 /var/log/nginx/error.log | grep -E 'timed out|timeout'
# τι κάνει η PHP αυτή τη στιγμή; (χρειάζεται pm.status_path στο pool)
curl -s 'http://127.0.0.1/fpm-status?full' | grep -E 'state|request URI|duration' | head -40
# MySQL/MariaDB: ποια queries τρέχουν και για πόση ώρα;
sudo mysql -e 'SHOW FULL PROCESSLIST;'
# μνήμη και swap
free -m
vmstat 1 5
Μια λίστα διεργασιών γεμάτη με το ίδιο query, ή στήλες si/so στο vmstat που δεν είναι μηδέν, κατονομάζει την αιτία.
Διορθώσεις στον δικό σου server
1. Ενεργοποίησε το slow query log και διόρθωσε το query
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Μετά από λίγα λεπτά, το sudo mysqldumpslow -s t /var/log/mysql/slow.log | head απαριθμεί τα χειρότερα queries. Πρόσθεσε το ευρετήριο που λείπει ή βρες το plugin που τρέχει το query και αντικατέστησέ το. Στο WordPress, ένας φουσκωμένος πίνακας 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;"
Οτιδήποτε της τάξης των εκατοντάδων kilobytes που φορτώνεται αυτόματα σε κάθε αίτημα είναι υποψήφιο για αφαίρεση.
2. Βάλε timeout στις εξωτερικές κλήσεις
Κάθε κλήση HTTP που κάνει η εφαρμογή σου χρειάζεται δικό της timeout, μικρότερο από του web server. Σε PHP με cURL: CURLOPT_CONNECTTIMEOUT 5 και CURLOPT_TIMEOUT 10. Στο WordPress, η wp_remote_get() δέχεται όρισμα timeout· πολλά plugins το αφήνουν στην προεπιλογή και περιμένουν για πάντα. Αν μια υπηρεσία τρίτου έχει πέσει, η σελίδα πρέπει να υποβαθμιστεί (να δείξει τη φόρμα χωρίς τα ζωντανά τέλη αποστολής), όχι να πεθάνει.
3. Βγάλε τη μεγάλη δουλειά έξω από το αίτημα
Τα backups, οι εισαγωγές, οι εξαγωγές, τα μεγάλα sitemaps και η αποστολή email ανήκουν σε ένα cron job ή σε μια ουρά, όχι σε μια προβολή σελίδας. Για το WordPress, απενεργοποίησε το εικονικό cron και τρέξε το πραγματικό:
// 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. Προσάρμοσε τα timeouts, με προσοχή
Αν μία μεμονωμένη σελίδα χρειάζεται δικαιολογημένα περισσότερο χρόνο (μια εξαγωγή διαχείρισης, μια αναφορά), ανέβασε το timeout μόνο για εκείνο το location, όχι καθολικά:
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: ProxyTimeout 300 μέσα σε μπλοκ <Location>. Η ίδια η PHP έχει το max_execution_time· όρισέ το στην ίδια τιμή, αλλιώς η PHP σταματά πρώτη και παίρνεις 500 αντί για 504. Μετά sudo nginx -t && sudo systemctl reload nginx.
5. Σταμάτησε το swapping
ps aux --sort=-%mem | head
Αν οι workers του PHP-FPM χρησιμοποιούν από 150 MB ο καθένας και τρέχεις 30 από αυτούς σε έναν server των 4 GB, τα μαθηματικά δεν βγαίνουν. Μείωσε το pm.max_children, ανέβασε τη μνήμη ή διόρθωσε το plugin που χρησιμοποιεί τη μνήμη. Ένας server που δεν κάνει swap είναι ένας server του οποίου τα 504 στη μεγάλη τους πλειονότητα εξαφανίζονται.
6. Cache
Μια cache πλήρους σελίδας (nginx FastCGI cache, ένα plugin caching WordPress, Varnish) εξυπηρετεί τους επισκέπτες που επιστρέφουν χωρίς να αγγίξει PHP ή βάση δεδομένων. Τα περισσότερα 504 υπό φορτίο εξαφανίζονται μόλις η αρχική σελίδα και οι κορυφαίες σελίδες προέρχονται από την cache.
Όταν φταίει ο πάροχός σου
Σε shared hosting, μπορείς να διορθώσεις αργά queries και plugins αλλά όχι τα timeouts του server ή το φορτίο των γειτόνων. Στείλε στον πάροχό σου:
Γεια σας, η ιστοσελίδα μου example.com επιστρέφει «504 Gateway Timeout» από περίπου τις 16:00 UTC. Σελίδες που φόρτωναν σε λιγότερο από δύο δευτερόλεπτα τώρα λήγουν. Δεν έχω αλλάξει τίποτα. Μπορείτε να ελέγξετε αν ο server βάσης δεδομένων ή το pool PHP του λογαριασμού μου είναι υπερφορτωμένο ή αν ένας άλλος λογαριασμός στον server προκαλεί υψηλό φορτίο, και να μου πείτε τι βρίσκετε;
Πώς να αποτρέψεις το επόμενο
Ένα 504 είναι μια αργή ιστοσελίδα που έγινε πιο αργή, και ο χρόνος απόκρισης μετριέται πολύ πριν από το timeout. Οι έλεγχοι ιστοσελίδας καταγράφουν τον χρόνο απόκρισης κάθε ελέγχου· όρισε μια ειδοποίηση σε αυτόν και θα δεις την τάση εβδομάδες πριν δουν σφάλμα οι επισκέπτες. Ο agent server προσθέτει φορτίο, μνήμη και swap από μέσα. Στον δικό σου server, ένα Deep Fix βρίσκει το αργό query ή την κλήση που κρεμάει και το διορθώνει, με χρέωση σε τμήματα των 15 λεπτών, τιμή πριν παραγγείλεις.
Τι κάνεις τώρα
Έλεγξέ το απ’ έξω
Έχει πέσει η ιστοσελίδα για όλους ή μόνο για σένα, και τι απαντά ο server; Δωρεάν, χωρίς εγγραφή.
Έλεγχος διαθεσιμότητας ιστοσελίδαςΈπεσε; Αναλαμβάνουμε.
Στον δικό σου server ή σε webspace με πρόσβαση SSH: ένα Quick Fix σε σταθερή τιμή για τις συνηθισμένες αιτίες, ένα Deep Fix με χρέωση σε τμήματα των 15 λεπτών για τις υπόλοιπες, όλο το εικοσιτετράωρο. Τιμή πριν παραγγείλεις.
Ζήτησε επισκευήΠερισσότεροι οδηγοί
- Η ιστοσελίδα σου έχει πέσει. Τι να κάνεις στα πρώτα 15 λεπτά.
- Έπεσε ο server: τι να ελέγξεις πρώτα και με ποια σειρά
- 502 Bad Gateway: αιτίες και πώς να το διορθώσεις
- 503 Service Unavailable: υπερφόρτωση ή συντήρηση;
- DNS_PROBE_FINISHED_NXDOMAIN: αιτίες και λύσεις
- ERR_CONNECTION_REFUSED: αιτίες και πώς να το διορθώσεις
- «Η σύνδεσή σας δεν είναι ιδιωτική»: η προειδοποίηση για το πιστοποιητικό SSL