Curl-Fehler 52 Leere Antwort vom Server

88

Ich habe einen Cron-Job auf einem Server eingerichtet, um ein Sicherungsskript in PHP auszuführen, das auf einem anderen Server gehostet wird. Der Befehl, den ich verwendet habe, ist wie folgt formatiert:

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

In letzter Zeit habe ich diesen Fehler erhalten, wenn der Cron läuft

curl: (52) Empty reply from server

Ich habe keine Ahnung, was das bedeutet. Wenn ich direkt in meinem Browser auf den Link gehe, läuft das Skript einwandfrei und ich erhalte meine kleine Backup-Zip-Datei.

Kann jemand irgendwelche Informationen darüber geben?

Paul Sheldrake
quelle
Dies hat wirklich nichts mit PHP zu tun, da es Curl egal ist, was der ausgebende Dateiprozessor ist.
Kevin Peno
1
Könnte Ihr Sicherungsskript so lange ausgeführt werden, dass es curlzu einem Timeout kommt? Haben Sie versucht, die Wartezeiten für die Standardlocke zu erhöhen, um eine Verbindung herzustellen --connect-timeout <seconds>und die gesamte Operation durchzuführen --max-time <seconds>?
Yzmir Ramirez
@ YzmirRamirez Curl Timeout Fehlercode ist 28. Src: ec.haxx.se/usingcurl-timeouts.html
Luckylooke
Mit Docker + Uvicorn (FastAPI) konnte ich --host 0.0.0.0
TechWisdom

Antworten:

68

Dies kann passieren, wenn curl aufgefordert wird, einfaches HTTP auf einem Server auszuführen, der HTTPS ausführt.

Beispiel:

$ curl http://google.com:443
curl: (52) Empty reply from server
Benoit Duffez
quelle
7
Dies war die Situation in meinem Fall. curl localhost:8443gab mir den leeren Antwortfehler. curl -k https://localhost:8443hat die Seite richtig bedient.
lowly_junior_sysadmin
Ich bin gerade darüber gestolpert und habe die fehlenden s komplett verpasst. Ich frage mich, warum es keinen klareren Fehler gibt (auch wenn die Verbindung abgelehnt wurde: Es wäre sinnvoller).
ShinTakezou
43

Curl gibt diesen Fehler aus, wenn keine Antwort von einem Server erfolgt, da es ein Fehler für HTTP ist, auf eine Anfrage nichts zu antworten.

Ich vermute, das Problem, das Sie haben, besteht darin, dass sich zwischen Ihnen und dem betreffenden Host eine Netzwerkinfrastruktur wie eine Firewall oder ein Proxy befindet. Damit dies funktioniert, müssen Sie das Problem daher mit den für diese Hardware verantwortlichen Personen besprechen.

Steve Knight
quelle
18
Dies ist wahrscheinlich der falsche Ansatz zur Fehlerbehebung. Eine leere Antwort bedeutet, dass eine Verbindung zur IP / zum Port hergestellt werden konnte, der Server jedoch in der Antwort nichts zurückgegeben hat. Es ist wahrscheinlich ein Problem mit dem Dienst selbst.
Robert Christian
4
Nicht ganz. Als mir dies passierte, lag es daran, dass mein authentifizierender Proxy keine Verbindung zum Remote-Host herstellte. Tatsächlich gab es also kein Problem mit dem Service selbst.
Steve Knight
In meinem Fall habe ich einen Proxy, der für die Loopback-Schnittstelle, auf der der Server ausgeführt wird, deaktiviert ist.
Rbaleksandar
In meinem Fall ein NGINX-Webcache-Server ohne Festplattenspeicher.
Alien Life Form
8

In meinem Fall war es eine Serverumleitung; curl -Llöste mein Problem.

Guillermo Prandi
quelle
8

Dies kann passieren, wenn der Server aufgrund einer 100% igen CPU- oder Speicherauslastung nicht reagiert.

Ich habe diesen Fehler erhalten, als ich versucht habe, auf die Sonarqube-API zuzugreifen, und der Server aufgrund der vollen Speicherauslastung nicht reagiert hat

Jayaprakash
quelle
6

Ein weiterer häufiger Grund für eine leere Antwort ist das Timeout. Überprüfen Sie alle Hops, von denen aus der Cron-Job ausgeführt wird, auf Ihren PHP / Zielserver. Es gibt wahrscheinlich irgendwo auf der Linie ein Gerät / einen Server / nginx / LB / einen Proxy, der die Anforderung früher als erwartet beendet, was zu einer leeren Antwort führt.

Müllsammler
quelle
4

Bei SSL-Verbindungen kann dies durch Probleme in älteren Versionen des Nginx-Servers verursacht werden, die bei Curl- und Safari-Anforderungen fehlerhaft auftreten. Dieser Fehler wurde um Version 1.10 von Nginx behoben, aber es gibt immer noch viele ältere Versionen von Nginx im Internet.

Für Nginx-Administratoren: Hinzufügen ssl_session_cache shared:SSL:1m;zuhttp Block sollte das Problem lösen.

Ich bin mir bewusst, dass OP nach einem Nicht-SSL-Fall gefragt hat, aber da dies die oberste Seite in goole für das Problem "Leere Antwort vom Server" ist, lasse ich die SSL-Antwort hier, da ich einer von vielen war, die mir den Kopf geschlagen haben gegen die Wand mit diesem Problem.

SiliconMind
quelle
3

In meinem Fall wurde dies durch ein PHP-APC-Problem verursacht. Der erste Ort, an dem Sie nachsehen müssen, sind die Apache-Fehlerprotokolle (wenn Sie Apache verwenden).

Hoffe das hilft jemandem.

Andrew McCombe
quelle
Können Sie uns etwas mehr erklären? Wie kann dies durch APC verursacht werden? Ich führe dies nicht einmal in PHP aus, ich benutze nur die Kommandozeile.
Nino Škopac
Dies ist so lange her, dass ich mich nicht erinnern kann, warum APC die Ursache für dieses Problem ist. Entschuldigung, ich kann nicht helfen.
Andrew McCombe
1

Sie können diese Locke -sS " http://www.example.com/backup.php " ausprobieren, indem Sie Ihre URL in "" eingeben , was für mich funktioniert hat. Ich kenne den genauen Grund nicht, aber ich nehme an, dass Sie die URL in ". "Vervollständigt die Anforderung an den Server oder schließt nur die Header-Anforderung ab.

omar
quelle
1

Ich hatte dieses Problem schon einmal. Ich fand heraus, dass ich eine andere Anwendung hatte, die denselben Port (3000) verwendete.

Einfacher Weg, dies herauszufinden:

Geben Sie im Terminal Folgendes ein netstat -a -p TCP -n | grep 3000(ersetzen Sie den '3000' durch den von Ihnen verwendeten Port). Wenn mehr als eine Person lauscht, belegt bereits etwas anderes diesen Port. Sie sollten diesen Prozess stoppen oder den Port für Ihren neuen Prozess ändern.

Ginna
quelle
2
Dies ist ein sehr spezifischer Fall, den Sie erwähnt haben. Dies ist im Allgemeinen nicht der Grund, warum Curl Ihnen diese Antwort zurückgibt. Es stellt sich heraus, dass dieses Problem auf der Serverseite und nicht auf der Clientseite behoben werden muss. Hier habe ich verstanden.
Aashish Chaubey
1

In meinem Fall (Curl 7.47.0) habe ich den Header content-lengthfür den Curl-Befehl manuell mit einem Wert festgelegt, der vom Postboten berechnet wird (ich habe den Postboten verwendet, um Curl-Befehlsparameter zu generieren und sie in die Shell zu kopieren). Nachdem ich den Header gelöscht habe content-length, funktioniert es normal.

YouCL
quelle
1

Dieser Fehler kann auch auftreten, wenn der Server die Daten verarbeitet. Es passiert mir normalerweise, wenn ich einige Dateien auf REST-API-Websites poste, die viele Einträge enthalten und lange für die Erstellung und Rückgabe von Datensätzen benötigen

Thiago Conrado
quelle
0

Versuchen Sie dies -> Statt durch cURL, versuchen Sie die Seite Pingen Sie versuchen , mit Telnet zu erreichen. Die Antwort, die Ihr Verbindungsversuch zurückgibt, ist genau die, die cURL sieht, wenn es versucht, eine Verbindung herzustellen (die es jedoch nicht hilfreich von Ihnen verschleiert). Je nachdem, was Sie hier sehen, können Sie nun eine von mehreren Schlussfolgerungen ziehen:

Sie versuchen, eine Verbindung zu einer Website herzustellen, bei der es sich um einen namensbasierten virtuellen Host handelt. Dies bedeutet, dass diese nicht über die IP-Adresse erreichbar ist. Mit dem Hostnamen ist ein Fehler aufgetreten - möglicherweise haben Sie etwas falsch geschrieben. Beachten Sie, dass Sie durch die Verwendung von GET anstelle von POST für Parameter eine konkretere Antwort erhalten.

Das Problem kann auch mit dem 100-Continue-Header verbunden sein. Versuchen Sie es curl_getinfo($ch, CURLINFO_HTTP_CODE)und führen Sie das Ergebnis aus.

Felix
quelle
Interessanter Punkt. Ich konnte tatsächlich den HTML- telnet hostnameGET <url>
Code
0

Mein Fall war auf das Ablaufen des SSL-Zertifikats zurückzuführen

Druvan
quelle
-1

Dies passiert, wenn Sie versuchen, auf eine sichere Website wie Https zuzugreifen.

Ich hoffe du hast 's' verpasst

Versuchen Sie, die URL in curl -sS -u "Benutzername: Passwort" zu ändern. Https://www.example.com/backup.php

Muthukrishnan
quelle
3
Sehr viel nein. Und übrigens, was hat die einfache Authentifizierung "Benutzername: Passwort" mit https zu tun?
Nino Škopac
-1

In meinem Fall habe ich uwsgi verwendet und die Eigenschaft http-timeout für mehr als 60 Sekunden hinzugefügt, aber es funktionierte nicht, da zusätzlicher Speicherplatz vorhanden war und die Konfigurationsdatei nicht richtig geladen wurde.

Ankit Adlakha
quelle
-2

Ich hatte dieses Problem und habe übersehen, dass http für sichere Verbindungen verwendet wird. Ersetzen Sie http durch https und es sollte gut funktionieren.

curl -sS https://www.example.com/backup.php
Raviteja
quelle