Risposta rapida
Cosa significa 502 Bad Gateway con un proxy?
502 Bad Gateway significa che un gateway o proxy ha ricevuto una risposta invalida o nulla dal server successivo nella catena. Tramite i proxy residenziali di CrawlRelay, un 502 significa di solito che la connessione di uscita o il target sono falliti a metà richiesta. Ritenta una volta con una nuova connessione. Se i 502 continuano solo per un sito, il problema è il sito; se colpiscono tutti i siti, controlla la tua configurazione.
502 Bad Gateway a colpo d'occhio
| Errore | 502 Bad Gateway |
|---|---|
| Tipo | Codice di stato HTTP (5xx, errore server) |
| Inviato da | Il gateway proxy o un reverse proxy di fronte al target |
| Definito in | RFC 9110, section 15.6.3 |
| Riprovarlo? | Sì, su una nuova connessione o sessione |
| Prima verifica | Riprova una volta su un IP nuovo; se persiste, testa il target senza proxy |
Cosa significa 502 Bad Gateway?
RFC 9110 descrive il 502 come un modo per un gateway di indicare che il server dietro ha risposto male. In una catena di scraping ci sono almeno due gateway: il proxy e, molto spesso, un CDN o bilanciatore di carico davanti al sito. Qualsiasi dei due può produrre il 502, e il corpo di risposta solitamente indica quale.
Le reti residenziali aggiungono un altro anello. L'exit è una connessione domestica reale, e un dispositivo può lasciare la rete a metà richiesta. Il gateway allora non ha nulla di valido da restituire.
Com'è a 502 in Python, curl, Node.js e browser?
Lo stesso errore si presenta in modo diverso in ogni strumento. Questi sono i messaggi da cercare nei log:
- Python requests:
status_code == 502, oProxyError('Unable to connect to proxy', OSError('Tunnel connection failed: 502 Bad Gateway'))per target HTTPS - curl:
curl: (56) CONNECT tunnel failed, response 502 - Browser:
net::ERR_TUNNEL_CONNECTION_FAILEDsu HTTPS, o una pagina errore semplice su HTTP - Scrapy: ritentato di default, visto che 502 è in
RETRY_HTTP_CODES
Cosa causa a 502?
Probabilmente prima:
- L'exit è uscito dal pool durante la richiesta, cosa che succede in qualunque rete residenziale.
- Il target ha chiuso la connessione, crashato o restituito qualcosa di malformato.
- Il CDN del target ha fallito nel raggiungere il server origin.
- Fallimento DNS per il target lato exit, ad esempio un errore di battitura nell'hostname.
- Targeting molto stretto che lascia pochi exit, quindi i fallimenti si ripetono sul piccolo insieme.
Come diagnostico a 502 passo dopo passo?
- Ritenta la richiesta con una connessione nuova. Un singolo 502 che sparisce era un exit caduto.
- Leggi il corpo risposta e le intestazioni: la pagina errore CDN nomina il CDN; un messaggio proxy breve nomina il gateway.
- Testa il target dalla tua connessione senza proxy.
- Allarga il targeting da città a paese e confronta le frequenze di errore.
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URLCome risolvo a 502?
- Ritenta con un nuovo ID di sessione o senza, così la richiesta esce da un altro exit.
- Imposta timeout sensati così un exit morto fallisce rapidamente invece di bloccarsi.
- Registra i 502 per host e metti in pausa un host se il tasso di 502 sale: probabilmente è offline.
import random
import time
import requests
PROXY = "http://USERNAME:[email protected]:7777"
PROXIES = {"http": PROXY, "https": PROXY}
RETRY_STATUSES = {429, 502, 503, 504}
def fetch(url, attempts=5, timeout=(10, 30)):
for attempt in range(attempts):
try:
r = requests.get(url, proxies=PROXIES, timeout=timeout)
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
r = None # dropped exit, reset or timeout: a new connection gets a new exit
if r is not None and r.status_code not in RETRY_STATUSES:
return r
retry_after = r.headers.get("Retry-After", "") if r is not None else ""
if retry_after.isdigit():
wait = int(retry_after)
else:
wait = min(60, 2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
raise RuntimeError("giving up on %s after %d attempts" % (url, attempts))Devo riprovare dopo a 502?
Sì, ritenta un 502, ma con un exit nuovo e con un limite. Due o tre tentativi con un piccolo backoff bastano. Un 502 che persiste con diversi exit punta al target, e altri retry non aiutano. Monitora il tasso per host così che un sito fallito non saturi la coda di retry.
Come si applica 502 Bad Gateway a CrawlRelay?
Con CrawlRelay, scarta l'ID di sessione o creane uno nuovo per uscire quasi sempre attraverso un IP residenziale diverso. Una sessione sticky ti lega a un exit, quindi un 502 dentro una sessione sticky dovrebbe terminare quella sessione nel tuo codice. La guida alle sessioni spiega come ruotare una sessione pulita.
Gateway: gw.crawlrelay.com, porta 7777 (HTTP, HTTPS tramite CONNECT) e porta 7778 (SOCKS5). Formato username: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Correlato: 504 Gateway Timeout · Connection reset · 503 Service Unavailable.
502 Bad Gateway: domande frequenti dagli sviluppatori
Un 502 è colpa del proxy o del sito web?
Entrambi. Leggi il contenuto della risposta: le pagine d'errore CDN indicano il CDN, che punta al sito web. Un 502 su ogni sito che provi punta al proxy o alla tua configurazione, mentre un 502 su un solo sito punta a quel sito. Prova lo stesso URL senza proxy per esserne sicuro.
Perché gli errori 502 sono più comuni con proxy residentiali?
Gli exit residentiali sono vere connessioni domestiche, e i dispositivi si disconnettono, cambiano rete o perdono segnale. Una richiesta in corso in quel momento termina con un 502 o un reset. Un buon scraper tratta questi casi come normali e riprova con un nuovo exit, con un limite basso.
Dovrei passare a sessioni sticky per ridurre i 502?
No. Una sessione sticky ti mantiene su un solo exit, quindi se quell'exit fallisce, tutte le richieste della sessione falliscono con esso. Usa connessioni rotanti per pagine indipendenti e sessioni sticky solo per flussi multi-passo. Termina una sessione sticky dopo un 502 e inizia una nuova.
Altri errori proxy in questo riferimento
Codici di stato HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Errori del browser e client
Errori di connessione e TLS
Proxy residenziali con documentazione che copre i casi di errore
Proxy residenziali CrawlRelay da 0,50 USD/GB, traffico che non scade mai.