Errore 52 Curl Risposta vuota dal server


98

Ho una configurazione di cron job su un server per eseguire uno script di backup in PHP ospitato su un altro server. Il comando che ho utilizzato è formattato in questo modo:

curl -sS http://www.example.com/backup.php

Ultimamente ho ricevuto questo errore durante l'esecuzione del Cron

curl: (52) Empty reply from server

Non ho idea di cosa significhi. Se vado al collegamento direttamente nel mio browser, lo script funziona correttamente e ottengo il mio piccolo file zip di backup.

Qualcuno può fornire informazioni a riguardo?


Questo non ha davvero nulla a che fare con PHP in quanto a curl non importa quale sia il file processor in uscita.
Kevin Peno

1
Il tuo script di backup potrebbe essere in esecuzione così a lungo da causare il curltimeout? Hai provato ad aumentare le attese curl predefinite per connettersi --connect-timeout <seconds>e per eseguire l'intera operazione --max-time <seconds>?
Yzmir Ramirez

Il codice di errore del timeout del ricciolo di @YzmirRamirez è 28. Src: ec.haxx.se/usingcurl-timeouts.html
Luckylooke

Con Docker + Uvicorn (FastAPI) mi ha aiutato a impostare --host 0.0.0.0
TechWisdom

Risposte:


73

Ciò può accadere se a curl viene chiesto di eseguire un semplice HTTP su un server che esegue HTTPS.

Esempio:

$ curl http://google.com:443
curl: (52) Empty reply from server

7
Questa era la situazione nel mio caso. curl localhost:8443mi ha dato l'errore di risposta vuota. curl -k https://localhost:8443servito correttamente la pagina.
lowly_junior_sysadmin

1
Mi sono appena imbattuto in questo e mi sono perso completamente i messaggi mancanti. Mi chiedo perché non ci sia un errore più chiaro (anche se la connessione viene rifiutata: avrebbe più senso).
ShinTakezou

45

Curl dà questo errore quando non c'è risposta da un server, poiché è un errore per HTTP non rispondere a una richiesta.

Sospetto che il problema che hai è che ci sia qualche pezzo di infrastruttura di rete, come un firewall o un proxy, tra te e l'host in questione. Per far funzionare questo, quindi, sarà necessario discutere il problema con le persone responsabili di quell'hardware.


19
Questo è probabilmente l'approccio sbagliato alla risoluzione dei problemi. Risposta vuota significa che è stato in grado di connettersi all'IP / porta, ma il server non ha restituito nulla nella risposta. È probabile che si tratti di un problema con il servizio stesso.
Robert Christian

4
Beh, non proprio. Quando mi è successo è stato perché il mio proxy di autenticazione non si connetteva all'host remoto. Quindi, in realtà, non c'erano problemi con il servizio stesso.
Steve Knight

Nel mio caso ho un proxy, che è disabilitato per l'interfaccia di loopback in cui il server è in esecuzione.
rbaleksandar

Nel mio caso un server web cache NGINX senza spazio su disco rigido.
Alien Life Form


8

Può accadere quando il server non risponde a causa del 100% di utilizzo della CPU o della memoria.

Ho ricevuto questo errore quando stavo tentando di accedere all'API di sonarqube e il server non rispondeva a causa dell'utilizzo completo della memoria


7

Un altro motivo comune per una risposta vuota è il timeout. Controlla tutti gli hop da cui viene eseguito il cron job al tuo server PHP / di destinazione. Probabilmente c'è un dispositivo / server / nginx / LB / proxy da qualche parte lungo la linea che termina la richiesta prima del previsto, risultando in una risposta vuota.


5

In caso di connessioni SSL, ciò potrebbe essere causato da un problema nelle versioni precedenti del server nginx che segfault durante le richieste curl e Safari. Questo bug è stato risolto intorno alla versione 1.10 di nginx ma ci sono ancora molte versioni precedenti di nginx su Internet.

Per gli amministratori di nginx: l'aggiunta ssl_session_cache shared:SSL:1m;al httpblocco dovrebbe risolvere il problema.

Sono consapevole che OP stava chiedendo un caso non SSL ma poiché questa è la prima pagina in goole per il problema "risposta vuota dal server", lascio la risposta SSL qui perché ero uno dei tanti che mi stavano sbattendo la testa contro il muro con questo problema.


3

Nel mio caso questo è stato causato da un problema APC di PHP. Il primo posto da cercare sono i log degli errori di Apache (se stai usando Apache).

Spero che questo aiuti qualcuno.


Puoi spiegare un po 'di più? Come può essere causato da APC? Non lo sto nemmeno eseguendo all'interno di PHP, sto solo usando la riga di comando.
Nino Škopac

È stato così tanto tempo fa, non ricordo il motivo per cui APC è la causa di questo problema. Scusa, non posso aiutarti.
Andrew McCombe

2

questo errore può verificarsi anche se il server sta elaborando i dati. Di solito mi succede quando inserisco alcuni file su siti Web API REST che hanno molte voci e impiegano molto tempo per la creazione e la restituzione dei record


1

puoi provare questo curl -sS " http://www.example.com/backup.php " inserendo il tuo URL in "" che ha funzionato per me Non so il motivo esatto ma suppongo che inserendo l'URL in " "completa la richiesta al server o completa semplicemente la richiesta di intestazione.


1

Ho già avuto questo problema. Ho scoperto di avere un'altra applicazione che utilizzava la stessa porta (3000).

Un modo semplice per scoprirlo:

Nel terminale, digita netstat -a -p TCP -n | grep 3000(sostituisci la porta che stai utilizzando con "3000"). Se c'è più di un ascolto, qualcos'altro sta già occupando quella porta. È necessario interrompere il processo o modificare la porta per il nuovo processo.


2
Questo è un caso molto specifico che hai citato. Questo non è, in generale, il motivo per cui curl ti restituisce questa risposta. Risulta che questo problema deve essere affrontato dal lato server e non dal lato client. Qui è dove ho capito.
Aashish Chaubey

1

Nel mio caso (curl 7.47.0), è perché ho impostato content-lengthmanualmente l'intestazione sul comando curl con un valore calcolato da postman (ho usato postman per generare i parametri del comando curl e copiarli nella shell). Dopo aver eliminato l'intestazione content-length, funziona normalmente.


0

Prova questo -> Invece di passare attraverso cURL, prova a eseguire il ping del sito che stai cercando di raggiungere con Telnet. La risposta che restituisce il tuo tentativo di connessione sarà esattamente ciò che cURL vede quando tenta di connettersi (ma che ti offusca inutilmente). Ora, a seconda di ciò che vedi qui, potresti trarre una delle numerose conclusioni:

Stai tentando di connetterti a un sito Web che è un host virtuale basato sul nome, il che significa che non può essere raggiunto tramite indirizzo IP. Qualcosa è andato storto con il nome host: potresti aver digitato male qualcosa. Nota che l'uso di GET invece di POST per i parametri ti darà una risposta più concreta.

Il problema potrebbe anche essere legato all'intestazione 100-continue. Prova a correre curl_getinfo($ch, CURLINFO_HTTP_CODE)e controlla il risultato.


Punto interessante. Sono stato effettivamente in grado di ottenere l'HTML come risposta con telnet hostnameeGET <url>
Nino Škopac

0

Il mio caso era dovuto alla scadenza del certificato SSL


-1

Nel mio caso stavo usando uwsgi, ho aggiunto la proprietà http-timeout per più di 60 secondi ma non funzionava a causa di un po 'di spazio extra e il file di configurazione non veniva caricato correttamente.


-2

Succede quando si tenta di accedere a un sito Web protetto come Https.

Spero ti sia mancato

Prova a cambiare l'URL in curl -sS -u "nomeutente: password" https://www.example.com/backup.php


3
Molto no. E a proposito, cosa c'entra la semplice autenticazione "nome utente: password" con https?
Nino Škopac

la parte auth della risposta fa sembrare che tu non sappia perché è strano aggiungerla alla risposta.
Skid Kadda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.