Questo articolo può aiutarti a risolvere i problemi relativi agli errori 504/502/gateway. Durante la risoluzione dei problemi, può essere utile capire come funziona l'elaborazione tra nginx e PHP, che viene spesso utilizzato per l'hosting di applicazioni web ad alte prestazioni, come WordPress.
Errori comuni che si verificano che sono collegati a questa configurazione:
- Timeout gateway 504
- Timeout gateway (504)
- Errore HTTP 504 – Timeout del gateway
- Errore di timeout del gateway
- 502 gateway errato
- Gateway difettoso
Perché c'è un gateway?
Quando una richiesta arriva attraverso un browser web, prima colpisce nginx, il nostro server web front-end leggero e poi nginx decide dove deve andare la richiesta da lì, come un capotreno. Nginx di solito gestisce da solo le richieste più semplici di risorse (come immagini e pagine memorizzate nella cache), mentre invia richieste di pagine dinamiche (come una pagina di amministrazione di WordPress o un carrello della spesa) tramite Apache (per l'elaborazione di modsecurity e .htaccess) e quindi PHP. Assomiglia a questo:
nginx -> apache -> php -fpm
nginx funge da gateway inviando i giusti tipi di richieste ad apache e PHP. Se c'è un problema "downstream", ad esempio con apache o php, otterrai un gateway errore, come 502 Bad Gateway o Timeout gateway 504 .
Questo problema potrebbe essere un codice di esecuzione estremamente lento o un problema reale con il servizio Apache o PHP, anche se con il nostro hosting il problema è più comunemente un problema di codice.
Utilizza i log del server per ottenere maggiori informazioni
Per aiutare a individuare la causa dell'errore del gateway, controlla i log per vedere cosa viene segnalato. a volte i registri riporteranno semplicemente un errore 502 o 504, proprio come si vede nel browser, che non sarà utile. Ma a volte potresti vedere un errore o un avviso registrato appena prima dell'errore del gateway che indicherà quale plug-in o tema sta causando l'errore.
Puoi scoprire come utilizzare Plesk per visualizzare i registri qui. Se puoi utilizzare quegli errori per andare a fondo del problema, fallo sicuramente! Altrimenti continua a leggere per altri modi per restringere il campo.
Aiuto! Non riesco nemmeno ad accedere all'area di amministrazione del mio sito web! (Come wp-admin per WordPress)
A volte, quando ricevi errori costanti del Gateway, non sei in grado di accedere all'area di amministrazione del tuo sito Web (come wp-admin di WordPress), ma ritieni che sia necessario farlo per aiutare a risolvere questo problema. L'unico modo per riottenere l'accesso è bloccare l'accesso finché non riesci a risolvere il problema.
Per bloccare l'accesso, puoi procedere in due modi:1) bloccare l'accesso alla parte specifica del sito che consuma risorse oppure 2) puoi bloccare temporaneamente l'accesso a tutti gli IP tranne il tuo per riottenere l'accesso.
Per bloccare l'accesso a tutti gli IP tranne il tuo (più facile)
Accedi a Plesk e visita le impostazioni di apache e nginx pagina. In "Nega l'accesso al sito ” inserisci un valore personalizzato e rendilo "*
“ (senza le virgolette). Poi sotto "Esclusi ” inserisci il tuo indirizzo IP e salva le modifiche. Potrebbe essere necessario attendere fino a 3 minuti dopo aver salvato le modifiche affinché il server si riavvii (~1m) e tutti i processi PHP in esecuzione raggiungano il timeout (~2m).
Assicurati di rimuovere questo blocco al termine della risoluzione dei problemi.
Per bloccare l'accesso alla richiesta a uso intensivo di risorse (più complesso)
Se c'è solo una pagina o una risorsa sul sito che sta creando questo problema (come una singola pagina che si carica lentamente), utilizza i log per identificare quel particolare URI della richiesta. Quindi aggiungi il seguente frammento di codice nella parte superiore del tuo file .htaccess per bloccare la risorsa problematica (anche solo temporaneamente) in modo da poter accedere al pannello di amministrazione. Sostituisci filename\.php
con l'effettivo URI della richiesta mostrato nei log (questa è la parte che viene dopo il dominio). Se ci sono dei punti nel percorso del file, assicurati di anteporli a una barra rovesciata come mostrato nell'esempio.
<FilesMatch filename\.php> Order Allow,Deny Deny from all </FilesMatch>
Motivi comuni per gli errori del gateway
La possibile soluzione rapida:
Se il problema si è verificato solo una volta (ad esempio, hai eseguito uno script e non si interrompeva), la soluzione è riavviare direttamente i servizi sottostanti , che forza la fine dello script.
Se non disponi dell'accesso root al server o dell'accesso amministratore a Plesk, spesso puoi attivare tale riavvio apportando modifiche alla configurazione del tuo sito web in Plesk. Ad esempio, prova ad andare sul pulsante "Impostazioni PHP" per il tuo dominio, quindi apporta eventuali piccole modifiche (come aumentare la memoria da 32 MB a 48 MB) e salva le modifiche. Questo aggiornamento attiva un riavvio dell'elaborazione di Apache e PHP e potrebbe risolvere il tuo errore!
Potrebbero essere necessari fino a 3 minuti (o più a seconda del provider) affinché le modifiche abbiano effetto.
Se ciò non risolve il problema o il problema si ripresenta, dovrai esaminare le seguenti possibili cause/sintomi per determinare quale si adatta meglio al tuo caso.
Sto cercando di eseguire un rapporto di esportazione, importazione o di grandi dimensioni che richiede un po' di tempo
Se il tuo sito funziona normalmente, ma ogni volta che provi a eseguire un'esportazione, un'importazione o un rapporto di grandi dimensioni per i dati del tuo sito, ricevi errori del gateway, perché stai raggiungendo i timeout prima che il rapporto possa essere elaborato. Sebbene non esista un modo super semplice per risolvere questo problema a lungo termine, esiste un modo per risolverlo a breve termine:aumentare temporaneamente i timeout.
Puoi farlo nel pannello di controllo di Plesk seguendo i passaggi della nostra guida su come modificare un'impostazione PHP. Dovrai modificare i valori (sono in secondi) per max_execution_time
e max_input_time
a qualcosa come 300 per consentire l'esecuzione dei processi per 5 minuti. Non dimenticare di modificare nuovamente questi valori dopo aver completato l'azione di lunga durata.
Perché non puoi semplicemente aumentare i timeout in modo permanente?
Tecnicamente puoi, tuttavia l'aumento permanente dei timeout molto probabilmente influirà negativamente sulle prestazioni del tuo sito . I timeout sono predefiniti su valori come 30 o 60 secondi con intenzione:se un processo impiega così tanto tempo per essere completato e attivi troppi processi di lunga durata, possono consumare tutti gli slot di elaborazione disponibili e far crollare l'intero sito per tutti i visitatori. Pertanto, mantenere i valori di timeout intorno a 30-60 assicura che ciò possa accadere al massimo solo per quel periodo di tempo.
Quasi ogni richiesta al mio sito o alla mia home page richiede molto tempo per essere elaborata
Saprai se questo è il problema se una o più pagine del sito impiegano più di ~10 secondi anche solo per iniziare a caricarsi, con il tuo browser che non mostra nulla fino a quando non sono trascorsi più di 10 secondi.
Esistono due motivi comuni per cui ciò può verificarsi:
1) Problemi di prestazioni del codice :hai del codice in esecuzione sul sito che non è ottimizzato per le prestazioni o presenta un problema. Un esempio di ciò potrebbe essere un ciclo infinito nel codice o qualcosa che tenta di estrarre milioni di record di database in una query (piuttosto che recuperarli in batch). La prima cosa da controllare è l'eventuale codice aggiunto di recente al sito, come plug-in, un nuovo tema, codice personalizzato, ecc. Probabilmente vorrai coinvolgere il tuo sviluppatore per aiutarti a restringere il campo. Abbiamo un articolo KB con alcune versioni comunemente riconosciute di questo, tuttavia se non sei in grado di determinare la causa con questi suggerimenti, l'opzione rimanente è una risoluzione completa dei problemi. Abbiamo una guida completa per la risoluzione dei problemi con WordPress qui.
2) Richieste di risorse esterne lente o che non rispondono: Alcuni codici PHP stanno tentando di comunicare con una risorsa esterna (ospitata altrove) che impiega troppo tempo a rispondere o non risponde affatto. Per risolvere i problemi con le risorse esterne, dovrai esaminare quali parti del codice PHP del tuo sito web (codice personalizzato o plug-in/codice del tema) stanno tentando di recuperare risorse esterne. Questo è più comunemente un codice che si connette a un servizio di terze parti come un elaboratore di pagamenti o il recupero di dati meteorologici tramite un'API o uno scraping. Ecco alcuni esempi:
- Alcuni gateway di pagamento o servizi API XML utilizzano porte non standard (anche se al giorno d'oggi è molto raro poiché le porte standard vengono utilizzate molto più frequentemente ora). Se non utilizza la porta 80 o 443, è probabile che stia tentando di comunicare su una porta bloccata senza riuscirci.
- È noto che i vecchi widget di Twitter recuperano i tweet utilizzando il codice di back-end e quindi gli errori di connessione ai server di Twitter causano blocchi come questo. Ciò non si applica agli incorporamenti di feed di Twitter che funzionano tramite Javascript in modo asincrono.
Se utilizzi WordPress o qualsiasi altro CMS con plug-in, assicurati di provare a disabilitare qualsiasi plug-in che potrebbe comunicare esternamente per vedere se risolve il problema.
Se non sei in grado di determinare intuitivamente quale plug-in potrebbe essere difettoso, l'opzione rimanente è una risoluzione completa dei problemi. Abbiamo una guida completa per la risoluzione dei problemi con WordPress qui.
Causa:sono necessari troppi processi PHP per servire le richieste
Se il tuo site richiede molti processi PHP a causa della grande quantità di traffico che crea richieste di elaborazione dinamica, quindi il tuo obiettivo principale dovrebbe essere quello di ridurre la quantità di elaborazione dinamica che deve verificarsi a ogni caricamento della pagina. Ecco come:
- Se utilizzi WordPress, leggi qui per sapere come installare e ottimizzare la tua cache.
- Se hai già abilitato la memorizzazione nella cache, il passaggio successivo consiste nel rilevare e ridurre i casi in cui si verifica l'elaborazione dinamica.
Causa:buffer limitati
I processi Apache o PHP potrebbero generare dati di dimensioni maggiori rispetto a quanto nginx è autorizzato a elaborare. Poiché apache e PHP devono entrambi passare questi dati attraverso nginx per raggiungere il visitatore del sito Web, genera un errore 502 che indica "Upstream ha inviato un'intestazione troppo grande". Abbiamo riscontrato questo errore con i clienti che utilizzano il plug-in OptInMonster di WordPress, tuttavia qualsiasi software potrebbe farlo.
Il nostro hosting condiviso dovrebbe già essere ottimizzato con buffer più grandi per nginx, tuttavia se hai il tuo VPS o non sei ospitato con noi, dovrai applicare tu stesso questi valori alla configurazione di nginx:
fastcgi_buffers 128 4096k; fastcgi_buffer_size 4096k;
Questo dice a nginx che può accettare intestazioni grandi (4 MB). Puoi inserirli in un file come:/etc/nginx/conf.d/increase_buffers.conf
quindi riavvia nginx per applicare le modifiche. Esempio:
echo 'fastcgi_buffers 128 4096k; fastcgi_buffer_size 4096k;' > /etc/nginx/conf.d/increase_buffers.conf
Causa:PHP-FPM configurato in modo errato o necessita di ottimizzazione (solo VPS/server dedicato)
A volte, se ricevi errori di timeout del gateway costanti e l'unica cosa che li risolve è il riavvio di PHP (come descritto sopra), o se sei su un VPS e vedi che i tuoi processi PHP rimangono in esecuzione con una CPU elevata e durano molto più a lungo di quanto dovrebbero (o ti è stato detto che è ciò che sta accadendo dai tecnici del server), dovrai prendere alcune misure per tenerli a freno.
Nota:se utilizzi il nostro hosting condiviso, la nostra configurazione PHP-FPM è già ottimizzata per un ambiente di hosting condiviso e quindi se riscontri errori del gateway, questa soluzione non verrà applicata.
Di seguito sono riportate alcune opzioni che hanno funzionato per noi, tuttavia è estremamente importante notare che si tratta di soluzioni alternative al vero problema. Identificare il codice che non risponde abbastanza velocemente e ottimizzarne le prestazioni è la vera soluzione.
- PHP-FPM consente di mettere a punto PHP Process Manager (FastCGI Process Manager =FPM) apportando alcune modifiche in Plesk. Se stai utilizzando il processo PHP-FPM in stile "ondemand", potresti voler ridurre il numero di richieste gestite da ciascun processo prima di uscire/riavviare con garbo un nuovo processo. Questo è etichettato come pm.max_requests. Prova 100 o 150 se riscontri problemi di prestazioni
- Se i tuoi processi PHP non stanno morendo, potrebbe essere necessario *farli* morire. Ci sono un paio di buoni modi per farlo. Il primo consiste nell'impostare definitivamente un timeout di inattività per i processi PHP-FPM impostando pm.process_idle_timeout – prova a impostarlo su 10s (puoi farlo nel campo sotto le impostazioni FPM.
- Se il tuo PHP elabora ancora non stanno morendo, potrebbe essere necessario diventare ancora più aggressivi con loro. Prova a impostare request_terminate_timeout a pochi secondi in più rispetto all'impostazione max_execution_time. Se max_execution_time non interrompe il processo, request_terminate_timeout lo farà sicuramente.
Se hai trovato utile questa guida, dai un'occhiata alle altre guide e ai post disponibili. Se hai bisogno di un host web canadese ad alte prestazioni o di un partner di hosting VPS, dai un'occhiata ai nostri servizi!