Un errore 502 non dice quasi mai qual è il vero guasto: segnala solo che un intermediario, di solito nginx, Apache, un proxy o un bilanciatore, non ha ottenuto una risposta valida dal backend. Per questo il primo obiettivo non è “correggere il 502”, ma identificare quale anello della catena si è rotto e intervenire nel punto giusto.
La buona notizia è che, nella maggior parte dei casi, il problema è reversibile e si risolve con controlli rapidi: backend PHP-FPM fermo o saturo, socket non raggiungibile, timeout troppo aggressivi, crash del processo applicativo, cache corrotta, risorse finite, oppure una configurazione errata del reverse proxy. Se il sito è in produzione, tratta la situazione come un incidente: prima stabilizzi, poi raccogli evidenze, poi applichi il fix minimo.
Diagnosi probabile
Le cause più frequenti di un 502 sono queste:
- PHP-FPM o backend applicativo non risponde: il proxy inoltra la richiesta, ma il processo dietro non accetta connessioni o impiega troppo tempo.
- Socket o porta errata: nginx/Apache punta a un file socket inesistente o a una porta chiusa, spesso dopo un aggiornamento o una modifica del pool PHP.
- Risorse esaurite: RAM, CPU o limiti del pool sono saturi; il backend viene terminato o non riesce a creare nuovi worker.
- Timeout tra proxy e backend: il backend risponde, ma troppo lentamente per i timeout configurati.
- Crash applicativo: WordPress, un plugin, un CMS o un’app PHP entra in errore e manda in crisi il processo.
- Problema di rete interna o bilanciamento: su infrastrutture con proxy, container o upstream multipli, il backend non è raggiungibile dal nodo front-end.
In pratica: se il 502 compare solo su alcune pagine o dopo un deploy, la causa è spesso applicativa. Se compare su tutto il sito, guarda prima backend, socket, servizi e risorse.
Verifiche immediate
Prima di cambiare qualunque cosa, fai questi controlli minimi. Servono a capire se il guasto è locale al web server, al backend o al sistema.
- Controlla se il problema è generale o parziale: apri homepage, una pagina interna e, se possibile, una URL semplice come una pagina statica. Se solo alcune URL falliscono, il backend applicativo è più sospetto del web server.
- Verifica lo stato dei servizi: su Linux, controlla web server e PHP-FPM. Il comando sotto ti dice subito se il servizio è attivo o in errore.
systemctl status nginx apache2 php-fpm php8.1-fpm php8.2-fpmEsito atteso: almeno il servizio usato dal tuo stack deve risultare active (running). Se uno è failed o inactive, hai già una pista forte.
- Guarda i log del web server e di PHP-FPM: cerca messaggi come connect() failed, upstream timed out, bad gateway, connection refused o primary script unknown.
journalctl -u nginx -u apache2 -u php-fpm -u php8.1-fpm -u php8.2-fpm --since "15 min ago" --no-pagerSe il problema è recente, gli ultimi minuti di log bastano spesso per capire se il backend non parte, se il socket non esiste o se il proxy scade prima della risposta.
- Verifica il socket o la porta del backend: confronta la configurazione del virtual host con il pool PHP attivo. Un mismatch tra percorso socket e configurazione del proxy produce 502 immediato.
grep -R "fastcgi_pass\|proxy_pass\|listen =" /etc/nginx /etc/apache2 /etc/php* 2>/dev/nullEsito atteso: il socket o la porta indicati nel web server devono esistere davvero nella configurazione del backend. Se il file socket non c’è o il servizio ascolta su un’altra porta, il 502 è coerente con il sintomo.
- Controlla risorse e saturazione: se il server è sotto carico, il backend può rispondere troppo lentamente o essere terminato dall’OOM killer.
top -b -n 1 | head -n 20
free -h
uptime
dmesg -T | tail -n 50Se vedi memoria quasi esaurita, load alto rispetto ai core o righe con Out of memory, la causa non è il proxy ma la pressione sul sistema.
Soluzione consigliata passo-passo
Qui conviene seguire un percorso minimo, reversibile e con impatto limitato. L’obiettivo è ripristinare il servizio senza introdurre modifiche inutili.
- Riavvia solo il backend che non risponde: se i log indicano PHP-FPM o un demone applicativo bloccato, riparti da lì e non dal web server intero.
systemctl restart php8.2-fpmSe usi una versione diversa, sostituisci il nome del servizio con quello attivo nel tuo stack. Dopo il riavvio, verifica che il processo torni in stato active (running) e che il socket sia ricreato.
- Ricarica il web server solo se la configurazione è corretta: se il backend è vivo ma il proxy continua a dare 502, fai un reload del front-end per rileggere la config senza interrompere le connessioni più del necessario.
nginx -t && systemctl reload nginxPer Apache, il controllo equivalente è:
apachectl configtest && systemctl reload apache2Se il test di configurazione fallisce, non ricaricare: correggi prima l’errore di sintassi o il path del backend.
- Correggi il socket o la porta upstream: se il backend ascolta altrove, aggiorna il virtual host o il pool PHP. Questo è uno dei casi più comuni dopo upgrade di versione.
# esempio nginx verso socket PHP-FPM
fastcgi_pass unix:/run/php/php8.2-fpm.sock;La verifica minima è semplice: il percorso deve esistere e il servizio deve ascoltare davvero lì. Se hai dubbi, controlla il file del pool e il contenuto di /run o della directory socket prevista.
- Allenta i timeout solo se il backend è lento ma sano: se i log mostrano timeout e il processo applicativo risponde, puoi aumentare i limiti in modo conservativo. Non farlo alla cieca: è una mitigazione, non una cura.
# esempio nginx
fastcgi_read_timeout 60s;
proxy_read_timeout 60s;Dopo la modifica, ricarica la configurazione e misura se il 502 sparisce senza far crescere troppo i tempi di risposta. Se i tempi peggiorano molto, il problema è a monte e va indagato sul backend.
- Ripulisci la cache solo se il 502 è legato a un contenuto dinamico corrotto: cache di pagina, plugin o reverse proxy possono servire risposte incoerenti. Svuotare la cache è utile, ma va fatto con criterio.
Se usi un pannello o un plugin, svuota prima la cache applicativa e poi quella del proxy/CDN. Se hai una cache su disco, verifica il path prima di cancellare file manualmente. La regola è: togli solo ciò che puoi rigenerare.
- Se il problema è iniziato dopo un deploy, fai rollback del cambio recente: è il fix più rapido quando il 502 compare subito dopo una modifica di codice, plugin o configurazione.
Ripristina la release precedente, riavvia il backend interessato e ricontrolla gli errori nei log. In questo scenario il rollback è più sicuro di un intervento creativo sul codice in emergenza.
Controlli finali / rollback
Dopo il fix, verifica che il 502 sia davvero sparito e che non sia stato solo mascherato da un riavvio temporaneo.
- Fai un test HTTP diretto: controlla status code, tempo di risposta e intestazioni del server.
curl -I https://tuodominio.tldEsito atteso: 200 o comunque un codice applicativo coerente con la pagina richiesta. Se resta 502 Bad Gateway, il problema non è risolto.
- Verifica di nuovo i log: non devono comparire nuovi errori di upstream, timeout o crash del processo dopo il test.
journalctl -u nginx -u apache2 -u php-fpm -u php8.1-fpm -u php8.2-fpm --since "5 min ago" --no-pagerSe i messaggi di errore continuano a ripetersi, la causa è ancora attiva e il riavvio ha solo comprato tempo.
- Controlla il rollback disponibile: se hai toccato config o release e il comportamento peggiora, torna subito alla versione precedente del file o del deploy.
Per la configurazione, conserva sempre una copia del file prima della modifica o usa un diff chiaro nello snippet di gestione. Per il codice, ripristina l’ultima release stabile e riavvia solo i servizi necessari.
Assunzione: lo stack usa un web server Linux con backend PHP-FPM o applicativo equivalente, e il 502 è generato da un proxy o da un reverse proxy davanti al servizio origin.
Se vuoi andare oltre il ripristino rapido, il passo successivo è rendere il sistema più leggibile: log centralizzati, health check del backend, timeout coerenti con il carico reale e monitoraggio di RAM, CPU e code di worker. Così un 502 smette di essere un evento opaco e diventa un segnale diagnostico utile.
Commenti (0)
Nessun commento ancora.
Segnala contenuto
Elimina commento
Eliminare definitivamente questo commento?
L'azione non si può annullare.