Błąd 504 Gateway Timeout oznacza jedno: serwer pośredniczący (Nginx, Cloudflare, load balancer) nie doczekał się odpowiedzi od aplikacji w zadanym czasie. W sklepie na PrestaShop lub WooCommerce to prawie zawsze objaw, a nie przyczyna — źródło siedzi w PHP, MySQL albo w zewnętrznym API. Poniżej przechodzimy przez diagnozę krok po kroku: od odróżnienia 504 od 502, 503 i 500, przez drzewko decyzyjne, aż po logi, które wskazują konkretny plik i konkretne zapytanie. Bez podnoszenia timeoutu do 300 sekund „na ślepo”, bo to maskuje problem, a nie go rozwiązuje.
HTTP 504 Gateway Timeout to kod z rodziny 5xx opisany w specyfikacji HTTP Semantics (RFC 9110). Definicja jest wąska: serwer pełniący rolę pośrednika przekazał żądanie dalej i nie doczekał się odpowiedzi w zadanym oknie czasowym. Ten kod nie mówi, czy padło PHP, czy MySQL mielił zapytanie 40 sekund — mówi wyłącznie „nie dostałem odpowiedzi na czas”.
W typowym stacku sklepu na PrestaShop lub WooCommerce gatewayem jest ten element, który stoi przed aplikacją: Nginx → PHP-FPM → MySQL, a przy włączonym CDN łańcuch wydłuża się do Cloudflare → Nginx → PHP-FPM → MySQL. Do tego dochodzą zewnętrzne API: bramka płatności, kurier, ERP, system faktur. Każde ogniwo ma własny timeout i każde może zwrócić 504 — dlatego pierwszy krok to ustalenie, kogo tak naprawdę nie doczekał się proxy.
| Kod | Kiedy zobaczysz ten kod | Gdzie szukać |
|---|---|---|
| 504 | Proxy nie doczekał się odpowiedzi od upstreamu (PHP-FPM, Apache, API) | nginx error.log, slow log PHP-FPM, slow query log MySQL |
| 502 | Upstream odpowiedział, ale niepoprawnie — proces PHP-FPM padł lub nie przyjął połączenia | log PHP-FPM, logi modułów PHP (np. fatal error), OOM killer |
| 503 | Serwer działa, ale świadomie odmawia obsługi (restart, tryb konserwacji, limit workerów) | konfiguracja Nginx, panel hostingu, harmonogram maintenance |
| 500 | Aplikacja wykonała się i zwróciła błąd — składnia, wyjątek, brak uprawnień | log błędów PHP, debug w PrestaShop, log WooCommerce |
Pułapka: Cloudflare po przekroczeniu własnego limitu (100 sekund na niższych planach) zwraca kod 524, a nie 504. Dla użytkownika wygląda to identycznie — biała strona i „timeout”. Rozróżnienie jest proste: jeśli w nagłówkach odpowiedzi widzisz server: cloudflare, a w error.log Nginxa nie ma żadnego wpisu o tym żądaniu, problem leży między CDN a originem — origin nawet nie dostał ruchu. Zanim zaczniesz zmieniać konfigurację serwera, sprawdź to jedno.
| Kod | Kiedy zobaczysz ten kod | Gdzie szukać |
|---|---|---|
| 504 | Proxy nie doczekał się odpowiedzi od upstreamu (PHP-FPM, Apache, API) | nginx error.log, slow log PHP-FPM, slow query log MySQL |
| 502 | Upstream odpowiedział niepoprawnie — proces PHP-FPM padł lub nie przyjął połączenia | log PHP-FPM, logi modułów PHP, OOM killer |
| 503 | Serwer działa, ale świadomie odmawia obsługi (restart, maintenance, limit workerów) | konfiguracja Nginx, panel hostingu, harmonogram maintenance |
| 500 | Aplikacja wykonała się i zwróciła błąd — wyjątek, składnia, brak uprawnień | log błędów PHP, debug PrestaShop, log WooCommerce |
Cztery testy, każdy po 2–3 minuty. Wykonaj je po kolei i zapisz wyniki — to skróci rozmowę z hostingiem z trzech dni do jednej wiadomości.
curl -s -o /dev/null -w "dns:%{time_namelookup} connect:%{time_connect} ttfb:%{time_starttransfer} total:%{time_total}\n" https://twojadomena.pl/koszyk. Zobaczysz, po ilu sekundach serwer odpuszcza. Jeśli total wynosi dokładnie 60,0 s — to limit konfiguracji, nie wolne zapytanie. Jeśli 12,4 s przy ttfb 12,2 s — wąskim gardłem jest aplikacja.Wniosek jest dwuwartościowy. 504 globalny, na wszystkich podstronach, także w /admin — problem po stronie serwera lub upstreamu (PHP-FPM, MySQL, throttling hostingu). 504 punktowy, dotyczący jednego URL-a lub jednej akcji — problem w skrypcie, module albo zewnętrznym API, które nie odpowiada w rozsądnym czasie.
1. Nginx error.log. Zaczynasz od: grep -i "upstream timed out" /var/log/nginx/error.log | tail -50, a potem grep -i "while reading response header from upstream" /var/log/nginx/error.log. Pierwszy wpis pokazuje, który upstream nie odpowiedział (php-fpm czy zewnętrzne API) i jaki URL był obsługiwany. To najszybsza informacja, jaką w ogóle dostaniesz.
2. Slow log PHP-FPM. W konfiguracji pool (zwykle /etc/php/*/fpm/pool.d/www.conf) ustaw na czas diagnozy request_slowlog_timeout = 5s oraz slowlog = /var/log/php-fpm/slow.log. Plik slow log zawiera stack trace: konkretny plik i konkretną funkcję, która przekroczyła limit. Nie zgadujesz już, czy winny jest moduł płatności, czy eksport zamówień — widzisz to wprost.
3. Slow query log MySQL. Włącz slow_query_log, ustaw long_query_time = 2. Zapytania analizuj przez mysqldumpslow -s t albo pt-query-digest, a najlepiej powtarzające się zapytanie obejrzyj przez EXPLAIN. 504 w koszyku i na stronie zamówienia to bardzo często brak indeksu: w PrestaShop na tabeli koszyka, w WooCommerce na wp_woocommerce_sessions, która rośnie do setek megabajtów.
4. Metryki hostingu. Zestaw godzinę błędu z wykresami CPU, RAM i I/O w panelu. Na hostingu współdzielonym zobaczysz throttling — serwer celowo dusi proces, zanim ten skończy pracę.
| Parametr | Gdzie go ustawić | Co ogranicza |
|---|---|---|
| max_execution_time | php.ini | Czas działania skryptu PHP (typowo 30 s) |
| max_input_time | php.ini | Czas parsowania danych wejściowych (POST, upload) |
| memory_limit | php.ini | Pamięć skryptu; przy eksportach 128M bywa za mało |
| request_terminate_timeout | php-fpm pool | Twarde ubicie procesu przez PHP-FPM |
| fastcgi_read_timeout | php-fpm pool | Jak długo Nginx czeka na odpowiedź z FPM |
| proxy_read_timeout | blok proxy_pass w Nginx | Jak długo proxy czeka na upstream |
W PrestaShop błąd 504 najczęściej dotyczy zadań administracyjnych, a nie zwykłego wejścia na stronę. Jeśli log Nginx pokazuje 504 na /admin.../index.php, sprawdź po kolei te sześć przypadków:
ps_product_lang plus zapisy do tabel indeksu. Przy fastcgi_read_timeout 60 żądanie padnie w połowie i zostawi częściowy indeks. Indeksowanie przenieś do crona (Zaawansowane → Cron) albo komendy CLI.ps_product, ps_product_lang i ps_stock_available. Dziel plik na paczki po 1000–2000 wierszy albo importuj skryptem przez CLI/API. To samo dotyczy eksportu 50 000 zamówień.CURLOPT_TIMEOUT i CURLOPT_CONNECTTIMEOUT, przy awarii API żądanie wisi bardzo długo i blokuje workera PHP-FPM.LIKE '%fraza%' na ps_product_lang i skanować całą tabelę. Potwierdź to przez EXPLAIN i slow query log MySQL.Zanim dodasz własny indeks, sprawdź w dokumentacji PrestaShop dla deweloperów, jak zbudowane są tabele i relacje — indeks założony na złą kolumnę zwiększa tylko czas zapisów.
| Przyczyna | Typowy objaw | Gdzie to potwierdzić |
|---|---|---|
| Przebudowa indeksu wyszukiwarki | 504 po 30–60 s, indeks niekompletny | Zaawansowane → Cron, log błędów PHP |
| Import / eksport CSV | 504 w trakcie importu, częściowo zapisane dane | log błędów PHP, liczba wierszy po imporcie |
| Masowe faktury PDF / ERP | 504 przy generowaniu zakresu faktur | log modułu, log requestów do API księgowego |
| API kurierów i płatności | 504 przy składaniu zamówienia lub drukowaniu etykiety | logi modułu, curl_error, czas odpowiedzi API |
| Brak indeksów w bazie | 504 losowo, częściej przy wyszukiwaniu i filtrach | EXPLAIN, slow query log |
| Smarty bez cache | 504 po deployu, ustępuje po kilku minutach | Zaawansowane → Wydajność, katalog var/cache |
WooCommerce stoi na innym stacku: WordPress, wtyczki, WP-Cron i często HPOS. Dlatego przyczyny 504 wyglądają inaczej niż w PrestaShop.
wp-cron.php). Przy małym ruchu import, wysyłka maili czy raport startują dopiero wtedy, gdy ktoś wejdzie na stronę — i blokują ten request. Ustaw define('DISABLE_WP_CRON', true) w wp-config.php i odpalaj zadania z crontab co minutę przez wp cron event run --due-now.wp action-scheduler run.wc_orders i wc_orders_meta, nie w wp_postmeta. Wtyczki pisane pod stare tabele pytają o meta_value, który nie ma indeksu — przy 100 000 zamówień to pełny skan. Sprawdź Query Monitor i czas najwolniejszego zapytania.[products limit="-1"] albo strona kategorii z liczeniem wariantów zmusza WooCommerce do policzenia ceny i stanu dla każdej wariacji. To problem katalogu, nie serwera — podnoszenie timeoutu nic nie da.max_connections, PHP-FPM czeka, Nginx zwraca 504.| Zadanie | Gdzie powinno trafić | Narzędzie |
|---|---|---|
| Import produktów, aktualizacja stanów | kolejka zadań w tle | Action Scheduler, WP-CLI |
| Synchronizacja z ERP / hurtownią | paczki po 100–500 rekordów | Action Scheduler, cron systemowy |
| Wysyłka maili, raporty | cron systemowy co minutę | crontab + wp cron event run |
| Generowanie feedu, eksport zamówień | WP-CLI uruchamiane z crona | wp eval-file / wp wc (jeśli dostępne) |
| Przebudowa cache po deployu | jednorazowo, poza szczytem | WP-CLI, panel hostingu |
Kolejność ma znaczenie. Zacznij od ustalenia, co dokładnie kończy się 504 — RFC 9110 definiuje ten kod jako timeout po stronie pośrednika (Nginx, Cloudflare, load balancer), a nie aplikacji. To znaczy, że PHP mógł skończyć pracę, a klient i tak dostał błąd.
grep " 504 " /var/log/nginx/access.log pokaże konkretne adresy, godziny i liczbę wystąpień. Sprawdź, czy to koszyk, admin-ajax.php, czy eksport. Jeden URL powtarzający się w kółko to problem w kodzie lub zapytaniu, nie w serwerze.mysqldump przed każdą zmianą. Dodanie indeksu na tabeli z 2 mln wierszy potrafi na minuty zablokować zapisy — na produkcji rób to w oknie serwisowym, nie „na oko”.max_execution_time nie liczy czasu spędzonego na zapytaniach do bazy i wywołaniach curl, więc samo podniesienie go w php.ini często nic nie zmienia. Nginx po swoim fastcgi_read_timeout zwraca 504, zostawiając zajętego workera PHP-FPM.bin/console). 500 faktur generowanych komendą z crona to 500 krótkich żądań zamiast jednego wiszącego.EXPLAIN na najwolniejszym zapytaniu, indeks złożony zamiast pojedynczego, przepisanie meta_query, cache wyników w Redis/Memcached (PrestaShop: Zaawansowane → Wydajność, wymaga rozszerzenia php-redis).fastcgi_read_timeout na czas jej wykonania i wróć do poprzedniej wartości. Jeśli 504 dotyczy zwykłego wejścia na stronę albo kasy — nie. Limit 30 s z komunikatem „spróbuj ponownie” jest lepszy niż 300 s, które przy 4 workerach wyłącza sklep z użytku.nginx -t && systemctl reload nginx — bez reloadu zmiana nie działa. Sprawdź nginx -T, który wypisuje pełną złożoną konfigurację i pokazuje, który plik faktycznie wygrywa. Zmiany robione ręcznie na serwerze wrócą przy najbliższym deployu — trzymaj je w repozytorium lub narzędziu do provisioningu.| Warstwa | Parametr | Gdzie ustawiany | Co realnie robi |
|---|---|---|---|
| Nginx | fastcgi_read_timeout / proxy_read_timeout | konfiguracja serwera wirtualnego | po tym czasie zwraca 504 do klienta, choć PHP nadal pracuje |
| PHP-FPM | request_terminate_timeout | plik poolu, np. php-fpm.d/www.conf | zabija proces workera bez komunikatu dla klienta |
| PHP | max_execution_time | php.ini, .user.ini | limit skryptu; na Linuksie nie liczy czasu I/O (baza, curl) |
| MariaDB / MySQL | max_statement_time | konfiguracja serwera lub sesji | ucina pojedyncze zbyt długie zapytanie |
| Cloudflare i inne proxy | własny limit ok. 100 s | panel dostawcy | zwykle zwraca 524, nie 504 — ustal, kto naprawdę zgłasza błąd |
Błąd 504 na statycznych plikach (np. logo.png, style.css) to prawie zawsze wina infrastruktury. Aplikacja PHP nie jest wtedy w ogóle wywoływana — Nginx czeka na FastCGI, którego nie ma. Podobnie, gdy 504 pojawia się na kilku niepowiązanych aplikacjach na tym samym koncie (sklep, blog, panel). To znak, że problem leży w warstwie współdzielonej: throttling CPU/I/O, przeciążony serwer MySQL albo awaria upstreamu u dostawcy CDN (Cloudflare, Bunny).
Od supportu wymagaj trzech rzeczy: logu z Nginx z dokładnymi timestampami (nie „u nas działa”), wartości fastcgi_read_timeout (domyślnie 60 s, w niektórych panelach 30 s) oraz informacji o limitach CPU/RAM/I-O i ewentualnym throttlingu. Bez tego nie odróżnisz chwilowego skoku ruchu od stałego niedoboru zasobów.
Zgłoszenie musi zawierać: konkretny URL, godzinę z sekundami, kod HTTP, dowód z curl -I (np. curl -I https://twojsklep.pl/koszyk) i output z zakładki Network w DevTools (czas oczekiwania, status). Zamiast „sklep nie działa” wyślij zrzut ekranu z 504 i nagłówkiem X-Request-ID, jeśli hosting go dodaje.
Hosting współdzielony ma limity, których nie przeskoczysz. VPS daje kontrolę nad php-fpm i MySQL, ale wymaga administracji. Hosting zarządzany to kompromis — ktoś inny pilnuje stosu, ale nadal możesz trafić na throttling. Migracja na VPS ma sens, gdy 504 występuje regularnie przy normalnym ruchu (np. 50 zamówień dziennie), a hosting współdzielony nie potrafi wskazać przyczyny. Jeśli 504 pojawia się raz na miesiąc przy imporcie 10 000 produktów, VPS to zbędny wydatek — lepiej zakolejkować import.
Gdy hosting potwierdzi poprawne logi i limity, problem jest w kodzie. Moduł płatności, stary plugin do kuriera, pętla w foreach odpyłująca API bez timeoutu — to typowi sprawcy. Wtedy czas na dewelopera i analizę dokumentacji deweloperskiej PrestaShop lub kodu wtyczki WooCommerce.
| Typ hostingu | Kto zarządza stosem | Wpływ na 504 | Kiedy wybrać |
|---|---|---|---|
| Współdzielony | Dostawca | Throttling CPU/I-O, wspólna baza MySQL | Mały sklep do ~20 zamówień/dzień, brak nietypowych integracji |
| VPS | Ty lub agencja | Pełna kontrola nad timeoutami, ale łatwo o błędną konfigurację | Sklep z własnymi modułami, niestandardowe API, ruch powyżej 100 zamówień/dzień |
| Zarządzany | Dostawca + Ty (częściowo) | Zależny od SLA i limitów — sprawdź, czy nie ma throttlingu | Firmy bez działu IT, które chcą wsparcia 24/7 i SLA na reakcję |
Monitoring zewnętrzny to podstawa. Uptime robot co 1 min na stronę główną to za mało. Dodaj checki na /koszyk i /logowanie — one odpyłują bazę i sesje. Alert ustaw na 5xx z progiem: np. 3 błędy w ciągu 5 minut. Codzienne maile „raport dzienny” trafiają do kosza — chyba że sklep padnie w nocy.
Importy, synchronizacja ERP, generowanie raportów — to musi działać poza requestem użytkownika. Cron lub worker (np. php bin/console w PrestaShop, WP-CLI w WooCommerce) z limitem czasu i kolejką. Jeśli import 50 000 produktów trwa 20 minut, nie może blokować PHP-FPM dla klientów. Ustaw max_execution_time tylko dla skryptu CLI, nie dla całego serwera.
Każda integracja zewnętrzna — płatności (Przelewy24, PayU), kurier (InPost, DPD), ERP — musi mieć własny timeout (np. 5 s) i retry z backoffem (1 s, 2 s, 4 s). Bez tego awaria API przewraca sklep: PHP czeka 60 s na odpowiedź, Nginx zwraca 504. Sprawdź, czy moduł nie robi zapytań synchronicznie w koszyku.
Cache na trzech poziomach: object cache (Redis) dla zapytań MySQL, page cache (np. LSCache, WP Rocket) dla HTML, CDN dla statyków. Pamiętaj o regułach: nie cache'uj /koszyk, /kasa, /admin, /moje-konto. Te URL-e muszą być zawsze świeże — inaczej klient zobaczy cudzy koszyk.
Staging i testy wydajnościowe przed wdrożeniem to obowiązek przy zmianach modułów płatności i kurierów. Wystarczy prosty test: 10 równoczesnych użytkowników dodających produkt do koszyka. Backup bazy i plików z testem odtworzenia — raz w miesiącu odtwórz kopię na stagingu. Backup, którego nie sprawdziliśmy, nie jest backupem.
W DropDigital administracja serwerem obejmuje monitoring, aktualizacje bezpieczeństwa, konfigurację cache i kolejek oraz reakcję na incydenty. SLA do 4 h na reakcję ma sens, gdy sklep zarabia na zamówieniach — każda godzina przestoju to realna strata. Koszt takiego wsparcia to zwykle 500–1500 zł netto miesięcznie, w zależności od liczby integracji i ruchu.
| Element | Częstotliwość | Próg alertu |
|---|---|---|
| Strona główna | 1 min | 1 błąd 5xx |
| Koszyk | 5 min | 2 błędy 5xx pod rząd |
| Logowanie | 5 min | 2 błędy 5xx pod rząd |
| Czas odpowiedzi | 1 min | > 3 s przez 5 min |
Podniesienie timeoutu (fastcgi_read_timeout, proxy_read_timeout, max_execution_time) bez diagnozy — „skoro 504 to limit, to zwiększmy limit”.
Jak wykryć: Po zmianie limitu błąd wraca przy większym ruchu albo przy dłuższym zapytaniu. W logach widać ten sam URL, tylko z większą liczbą sekund przed przerwaniem.
Jak naprawić: Zmierz realny czas odpowiedzi: curl -o /dev/null -s -w "time_total: %{time_total}\ntime_starttransfer: %{time_starttransfer}\n" https://twojadomena.pl/koszyk. Jeśli zapytanie trwa 90 s, to problem jest w zapytaniu lub w kodzie, a nie w limicie. Limit podnosimy dopiero wtedy, gdy wiemy, że operacja legalnie trwa długo (np. eksport 50 tys. produktów), i robimy to świadomie, po stronie konkretnej ścieżki.
Grzebanie w konfiguracji serwera, gdy naprawdę widzisz błąd 524 od Cloudflare, a nie 504 od originu.
Jak wykryć: W narzędziach deweloperskich przeglądarki w nagłówkach odpowiedzi pojawia się server: cloudflare, a w treści strony komunikat Cloudflare o przekroczeniu czasu oczekiwania na origin. Kod widoczny dla użytkownika to 524.
Jak naprawić: Ustal, kto wystawia kod. 504 pochodzi z Twojego proxy/Nginx, 524 z Cloudflare, gdy origin nie odpowiedział w ok. 100 sekund. Dopiero po rozróżnieniu tych dwóch sytuacji otwieraj konfigurację serwera — w przeciwnym razie szukasz problemu w złym miejscu.
Zgłoszenie do hostingu „serwer nie działa” bez żadnych danych — bez URL-a, godziny i treści błędu.
Jak wykryć: Support odpisuje prośbą o dokładny czas wystąpienia, adres URL i zrzut ekranu. Sprawa kręci się w kółko przez kilka dni.
Jak naprawić: Przed zgłoszeniem przygotuj: dokładny URL, godzinę z sekundami, kod błędu (504 czy 524), wynik curl -w, fragment nginx error.log z „upstream timed out”. Dopiero taki pakiet pozwala supportowi sprawdzić logi w konkretnym oknie czasowym.
Testowanie wyłącznie we własnej przeglądarce, na zalogowanym koncie i z włączonym CDN.
Jak wykryć: Błąd „nie występuje” u Ciebie, ale klienci raportują go regularnie. Albo odwrotnie — widzisz 504 tylko dlatego, że masz w cache stary, zawieszony request.
Jak naprawić: Powtórz test w trybie incognito, na innym łączu (np. LTE) i z wyłączonym CDN. Jeśli błąd znika po wyłączeniu CDN — problem jest w warstwie proxy/cache. Jeśli zostaje na incognito i LTE — problem jest w aplikacji lub w bazie.
Restart PHP-FPM, MySQL albo całego serwera jako „naprawa” i uznanie sprawy za zamkniętą.
Jak wykryć: Po restarcie błąd znika na kilka godzin lub dni, po czym wraca w tym samym miejscu (koszyk, kasa, zapis produktu, import).
Jak naprawić: Restart traktuj wyłącznie jako tymczasowe odblokowanie sklepu, nie jako rozwiązanie. Zaraz po nim włącz logi, które złapią przyczynę: PHP-FPM slow log (request_slowlog_timeout) i MySQL slow query log. Dopiero wpis w slowlogu wskazuje plik i funkcję do poprawy.
Mylenie 504 z 502, 503 lub 500 i szukanie rozwiązania dla niewłaściwego kodu.
Jak wykryć: W logach Nginx widzisz „connect() failed” lub „no live upstreams” zamiast „upstream timed out”, a użytkownik widzi inny kod niż zakładasz.
Jak naprawić: Najpierw nazwij problem poprawnie. 504 = upstream nie odpowiedział w czasie. 502 = upstream odpowiedział nieprawidłowo lub padł. 503 = brak dostępnych zasobów lub tryb serwisowy. 500 = aplikacja zgłosiła własny błąd. Każdy z tych kodów prowadzi do innego pliku z logami.
Błąd 504 Gateway Timeout w sklepie prawie nigdy nie jest osobnym problemem — to sygnał, że coś po drodze nie zdążyło odpowiedzieć. Zacznij od ustalenia zakresu: cała strona czy jedna akcja, jak wygląda sytuacja w incognito i na LTE, czy w nagłówkach nie kryje się przypadkiem 524 od Cloudflare. Dopiero potem sięgaj po logi: nginx error.log, PHP-FPM slow log i MySQL slow query log wskazują konkretny plik, funkcję lub zapytanie. Podnoszenie timeoutu bez pomiaru to odsuwanie objawu — problem wróci, najczęściej w najmniej wygodnym momencie. Każdą zmianę w konfiguracji wprowadzaj pojedynczo i notuj efekt, bo tylko tak ustalisz, co realnie pomogło.
Nie. 504 mówi tylko tyle, że serwer proxy nie doczekał się odpowiedzi od upstreamu w zadanym czasie. Upstreamem bywa PHP-FPM, MySQL albo zewnętrzne API — czyli równie dobrze hosting, jak i kod sklepu lub integracja płatności. Dopiero logi wskazują, po której stronie leży przyczyna. Bez tego zgłoszenie do hostingu jest strzałem w ciemno.
504 oznacza, że upstream nie odpowiedział w czasie — połączenie żyło, ale nie doczekało się odpowiedzi. 502 oznacza, że upstream odpowiedział nieprawidłowo albo w ogóle nie dał się połączyć, np. PHP-FPM był wyłączony lub padł. W logach Nginx 504 zobaczysz jako „upstream timed out”, a 502 jako „connect() failed” lub „no live upstreams”. Definicje kodów znajdziesz w specyfikacji RFC 9110.
524 to własny kod Cloudflare: Twoje proxy czekało na odpowiedź z serwera origin i się nie doczekało. Dla użytkownika wygląda podobnie jak 504, ale naprawia się go inaczej. Sprawdź, czy origin w ogóle odpowiada na żądania z pominięciem CDN. Jeśli bezpośrednio działa, a przez Cloudflare nie — problem jest w warstwie proxy, a nie w aplikacji.
Zwykle nie, tylko odsunie objaw w czasie. Jeśli zapytanie trwa 90 sekund, wydłużenie limitu do 300 sekund sprawi, że użytkownik będzie czekał 90 sekund i tak dostanie wolny sklep. Limit podnosi się świadomie dla operacji, które legalnie trwają długo, np. masowego eksportu. Domyślnym kierunkiem naprawy jest skrócenie zapytania albo skryptu, nie zwiększanie cierpliwości serwera.
Zablokuj czasowo integrację, która budzi podejrzenia: bramkę płatności, API kuriera, synchronizację z ERP. Jeśli 504 znika, źródło jest poza Twoim serwerem. Wtedy sprawdź czasy odpowiedzi tego API i ustaw rozsądny timeout po stronie sklepu, żeby wolne API nie blokowało całego koszyka.
Pojedyncze, krótkotrwałe 504 nie zrobi krzywdy. Problem zaczyna się, gdy błąd wraca regularnie i dotyczy wielu adresów — robot Google traci wtedy dostęp do treści. Warto śledzić to w Search Console i naprawić przyczynę, zanim błąd stanie się stałym elementem strony. Sam kod nie „karze” serwisu, ale utrata dostępności dla robota już tak.
Przygotowanie danych — testy w incognito, curl, przegląd nginx error.log — zajmuje zwykle 10–20 minut. Włączenie slow logów PHP-FPM i MySQL wymaga jeszcze kilku minut i trochę czasu na złapanie zdarzenia. Najdłuższy etap to naprawa: znalezienie konkretnego zapytania lub hooka modułu bywa kwestią godzin. Warto zacząć od pomiaru, bo bez niego każda kolejna godzina idzie w zgadywanie.
Jeśli 504 wraca w PrestaShop lub WooCommerce i chcesz mieć pewność, gdzie leży przyczyna, opisz nam sytuację — zakres błędu, URL i moment wystąpienia. Zajmiemy się logami, konfiguracją i tym, co je realnie generuje.