Curl Error 52 Réponse vide du serveur

98

J'ai une configuration de travail cron sur un serveur pour exécuter un script de sauvegarde en PHP qui est hébergé sur un autre serveur. La commande que j'utilise est formatée comme ceci:

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

Dernièrement, j'ai eu cette erreur lorsque le Cron fonctionne

curl: (52) Empty reply from server

Je n'ai aucune idée de ce que cela signifie. Si je vais directement au lien dans mon navigateur, le script fonctionne bien et j'obtiens mon petit fichier zip de sauvegarde.

Quelqu'un peut-il fournir des informations à ce sujet?

Paul Sheldrake
la source
Cela n'a vraiment rien à voir avec PHP car curl ne se soucie pas de ce qu'est le processeur de fichier de sortie.
Kevin Peno
1
Votre script de sauvegarde pourrait-il s'exécuter si longtemps qu'il entraîne l' curlexpiration du délai? Avez-vous essayé d'augmenter les attentes curl par défaut pour vous connecter --connect-timeout <seconds>et pour que l'opération entière soit prise en charge --max-time <seconds>?
Yzmir Ramirez
Le code d'erreur du délai d'expiration de la boucle @YzmirRamirez est 28. Src: ec.haxx.se/usingcurl-timeouts.html
Luckylooke
Avec Docker + Uvicorn (FastAPI), cela m'a aidé à définir --host 0.0.0.0
TechWisdom

Réponses:

73

Cela peut se produire si curl est invité à faire du HTTP brut sur un serveur qui utilise HTTPS.

Exemple:

$ curl http://google.com:443
curl: (52) Empty reply from server
Benoit Duffez
la source
7
Telle était la situation dans mon cas. curl localhost:8443m'a donné l'erreur de réponse vide. curl -k https://localhost:8443a servi la page correctement.
lowly_junior_sysadmin
1
Je viens de trébucher dessus et j'ai complètement raté les s manquants. Je me demande pourquoi il n'y a pas d'erreur plus claire (même si la connexion est refusée: cela aurait plus de sens).
ShinTakezou
45

Curl donne cette erreur lorsqu'il n'y a pas de réponse d'un serveur, car c'est une erreur pour HTTP de ne rien répondre à une requête.

Je soupçonne que le problème que vous rencontrez est qu'il existe une partie de l'infrastructure réseau, comme un pare-feu ou un proxy, entre vous et l'hôte en question. Par conséquent, pour que cela fonctionne, vous devrez discuter du problème avec les personnes responsables de ce matériel.

Steve Knight
la source
19
Il s'agit probablement de la mauvaise approche du dépannage. Une réponse vide signifie qu'il a pu se connecter à l'adresse IP / au port, mais le serveur n'a rien retourné dans la réponse. C'est probablement un problème sur le service lui-même.
Robert Christian
4
Enfin, pas tout à fait. Lorsque cela m'est arrivé, c'était parce que mon proxy d'authentification ne se connectait pas à l'hôte distant. Donc, en fait, il n'y avait aucun problème sur le service lui-même.
Steve Knight
Dans mon cas, j'ai un proxy, qui est désactivé pour l'interface de bouclage où le serveur est en cours d'exécution.
rbaleksandar
Dans mon cas, un serveur de cache Web NGINX sans espace libre sur le disque dur.
Alien Life Form
8

Dans mon cas, c'était la redirection du serveur; curl -Lrésolu mon problème.

Guillermo Prandi
la source
8

Cela peut se produire lorsque le serveur ne répond pas en raison d'une utilisation à 100% du processeur ou de la mémoire.

J'ai eu cette erreur lorsque j'essayais d'accéder à l'API sonarqube et que le serveur ne répondait pas en raison d'une utilisation complète de la mémoire

Jayaprakash
la source
7

Une autre raison courante pour une réponse vide est le délai d'expiration. Vérifiez tous les sauts à partir desquels la tâche cron s'exécute vers votre serveur PHP / cible. Il y a probablement un périphérique / serveur / nginx / LB / proxy quelque part le long de la ligne qui termine la demande plus tôt que prévu, ce qui entraîne une réponse vide.

Éboueur
la source
5

En cas de connexions SSL, cela peut être causé par un problème dans les anciennes versions du serveur nginx qui segfault lors des requêtes curl et Safari. Ce bogue a été corrigé autour de la version 1.10 de nginx mais il existe encore beaucoup d'anciennes versions de nginx sur Internet.

Pour les administrateurs nginx: l'ajout ssl_session_cache shared:SSL:1m;au httpbloc devrait résoudre le problème.

Je suis conscient qu'OP demandait un cas non SSL, mais comme il s'agit de la première page de goole pour le problème de "réponse vide du serveur", je laisse la réponse SSL ici car j'étais l'un des nombreux à me cogner la tête contre le mur avec ce problème.

SiliconMind
la source
3

Dans mon cas, cela a été causé par un problème PHP APC. Le premier endroit à regarder serait les journaux d'erreurs Apache (si vous utilisez Apache).

J'espère que cela aide quelqu'un.

Andrew McCombe
la source
Pouvez-vous expliquer un peu plus? Comment cela peut-il être causé par APC? Je n'exécute même pas cela à l'intérieur de PHP, j'utilise juste la ligne de commande.
Nino Škopac
C'était il y a si longtemps, je ne me souviens pas de la raison pour laquelle APC est la cause de ce problème. Désolé, je ne peux pas vous aider.
Andrew McCombe
2

cette erreur peut également se produire si le serveur traite les données. Cela m'arrive généralement lorsque je publie des fichiers sur des sites Web d'API REST qui ont de nombreuses entrées et prennent du temps pour la création et le retour des enregistrements.

Thiago Conrado
la source
1

vous pouvez essayer cette curl -sS " http://www.example.com/backup.php " en mettant votre URL dans "" qui a fonctionné pour moi je ne connais pas la raison exacte mais je suppose que mettre l'URL dans " "termine la demande au serveur ou termine simplement la demande d'en-tête.

omar
la source
1

J'ai déjà eu ce problème. J'ai compris que j'avais une autre application utilisant le même port (3000).

Un moyen facile de le savoir:

Dans le terminal, tapez netstat -a -p TCP -n | grep 3000(remplacez le port que vous utilisez par le «3000»). S'il y a plus d'une écoute, quelque chose d'autre occupe déjà ce port. Vous devez arrêter ce processus ou modifier le port de votre nouveau processus.

Ginna
la source
2
C'est un cas très particulier que vous avez mentionné. Ce n'est pas, en général, pourquoi curl vous renvoie cette réponse. Il s'avère que ce problème doit être traité côté serveur et non côté client. C'est là que j'ai compris.
Aashish Chaubey
1

Dans mon cas (curl 7.47.0), c'est parce que j'ai défini l'en-tête content-lengthsur la commande curl manuellement avec une valeur qui est calculée par postman (j'ai utilisé postman pour générer les paramètres de la commande curl et les copier dans le shell). Après avoir supprimé l'en-tête content-length, cela fonctionne normalement.

YouCL
la source
0

Essayez ceci -> Au lieu de passer par cURL, essayez d'envoyer un ping au site que vous essayez d'atteindre avec Telnet. La réponse que votre tentative de connexion renvoie sera exactement ce que cURL voit quand il essaie de se connecter (mais qu'il dissimule inutilement de votre part). Maintenant, en fonction de ce que vous voyez ici, vous pourriez tirer l'une des nombreuses conclusions:

Vous essayez de vous connecter à un site Web qui est un hôte virtuel basé sur un nom, ce qui signifie qu'il ne peut pas être atteint via une adresse IP. Un problème est survenu avec le nom d'hôte. Vous avez peut-être mal saisi quelque chose. Notez que l'utilisation de GET au lieu de POST pour les paramètres vous donnera une réponse plus concrète.

Le problème peut également être lié à l'en-tête 100-continue. Essayez de courir curl_getinfo($ch, CURLINFO_HTTP_CODE)et vérifiez le résultat.

Félix
la source
Point intéressant. J'ai pu obtenir le HTML en réponse avec telnet hostnameetGET <url>
Nino Škopac
0

Mon cas était dû à l'expiration du certificat SSL

Druvan
la source
-1

Dans mon cas, j'utilisais uwsgi, j'ai ajouté la propriété http-timeout pendant plus de 60 secondes mais cela ne fonctionnait pas à cause d'un espace supplémentaire et le fichier de configuration ne se chargeait pas correctement.

Ankit Adlakha
la source
-2

Cela se produit lorsque vous essayez d'accéder à un site Web sécurisé comme Https.

J'espère que tu as manqué 's'

Essayez de remplacer l'URL par curl -sS -u "nom d'utilisateur: mot de passe" https://www.example.com/backup.php

Muthukrishnan
la source
3
Pas du tout. Et btw qu'est-ce que l'auth simple "nom d'utilisateur: mot de passe" a à voir avec https?
Nino Škopac
la partie auth de la réponse donne l'impression que vous ne savez pas pourquoi il est étrange d'ajouter cela à la réponse.
Skid Kadda le