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?


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

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.


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

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


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.


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.


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.


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.


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.


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.


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.


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.


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


-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.


-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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.