Curl Error 52 Respuesta vacía del servidor

98

Tengo una configuración de trabajo cron en un servidor para ejecutar un script de respaldo en PHP que está alojado en otro servidor. El comando que he estado usando tiene el siguiente formato:

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

Últimamente he recibido este error cuando se ejecuta Cron

curl: (52) Empty reply from server

No tengo idea de lo que esto significa. Si voy al enlace directamente en mi navegador, el script se ejecuta bien y obtengo mi pequeño archivo zip de respaldo.

¿Alguien puede proporcionar alguna información al respecto?

Paul Sheldrake
fuente
Esto realmente no tiene nada que ver con PHP, ya que a curl no le importa cuál es el procesador de archivos de salida.
Kevin Peno
1
¿Es posible que su secuencia de comandos de respaldo se esté ejecutando durante tanto tiempo que provoque el curltiempo de espera? ¿Ha intentado aumentar las esperas de curl predeterminadas para conectarse --connect-timeout <seconds>y para que toda la operación continúe --max-time <seconds>?
Yzmir Ramirez
El código de error de tiempo de espera de curl de @YzmirRamirez es 28. Src: ec.haxx.se/usingcurl-timeouts.html
Luckylooke
Con Docker + Uvicorn (FastAPI) me ayudó a configurar --host 0.0.0.0
TechWisdom

Respuestas:

73

Esto puede suceder si se le pide a curl que utilice HTTP simple en un servidor que utiliza HTTPS.

Ejemplo:

$ curl http://google.com:443
curl: (52) Empty reply from server
Benoit Duffez
fuente
7
Esta fue la situación en mi caso. curl localhost:8443me dio el error de respuesta vacía. curl -k https://localhost:8443sirvió la página correctamente.
lowly_junior_sysadmin
1
Acabo de tropezar con esto y me perdí por completo las s faltantes. Me pregunto por qué no hay un error más claro (incluso como conexión rechazada: tendría más sentido).
ShinTakezou
45

Curl da este error cuando no hay respuesta de un servidor, ya que es un error que HTTP no responda nada a una solicitud.

Sospecho que el problema que tiene es que hay una pieza de infraestructura de red, como un firewall o un proxy, entre usted y el host en cuestión. Conseguir que esto funcione, por lo tanto, requerirá que discuta el problema con las personas responsables de ese hardware.

Steve Knight
fuente
19
Es probable que este sea el enfoque incorrecto para solucionar problemas. La respuesta vacía significa que pudo conectarse a la IP / puerto, pero el servidor no devolvió nada en la respuesta. Es probable que sea un problema del servicio en sí.
Robert Christian
4
Bueno, no del todo. Cuando esto me sucedió fue porque mi proxy de autenticación no se estaba conectando al host remoto. Entonces, de hecho, no hubo ningún problema con el servicio en sí.
Steve Knight
En mi caso, tengo un proxy, que está deshabilitado para la interfaz de bucle invertido donde se ejecuta el servidor.
rbaleksandar
En mi caso, un servidor de caché web NGINX sin espacio en el disco duro.
Alien Life Form
8

En mi caso fue la redirección del servidor; curl -Lresolvió mi problema.

Guillermo Prandi
fuente
8

Puede suceder cuando el servidor no responde debido al 100% de la CPU o al uso de la memoria.

Recibí este error cuando intentaba acceder a la API de sonarqube y el servidor no respondía debido a la utilización total de la memoria.

Jayaprakash
fuente
7

Otra razón común para una respuesta vacía es el tiempo de espera. Verifique todos los saltos desde donde se ejecuta el trabajo cron hasta su servidor PHP / destino. Probablemente haya un dispositivo / servidor / nginx / LB / proxy en algún lugar de la línea que finaliza la solicitud antes de lo esperado, lo que da como resultado una respuesta vacía.

recolector de basura
fuente
5

En el caso de las conexiones SSL, esto puede deberse a un problema en las versiones anteriores del servidor nginx que segregan durante las solicitudes de curl y Safari. Este error se solucionó en la versión 1.10 de nginx, pero todavía hay muchas versiones antiguas de nginx en Internet.

Para los administradores de nginx: agregar ssl_session_cache shared:SSL:1m;al httpbloque debería resolver el problema.

Soy consciente de que OP estaba solicitando un caso que no sea SSL, pero como esta es la página superior en goole para el problema de "respuesta vacía del servidor", dejo la respuesta SSL aquí, ya que era uno de los muchos que me golpeaban la cabeza. contra la pared con este problema.

SiliconMind
fuente
3

En mi caso, esto fue causado por un problema de PHP APC. El primer lugar para buscar serían los registros de errores de Apache (si está utilizando Apache).

Espero que esto ayude a alguien.

Andrew McCombe
fuente
¿Puedes explicar un poco más? ¿Cómo puede esto ser causado por APC? Ni siquiera estoy ejecutando esto dentro de PHP, solo estoy usando la línea de comando.
Nino Škopac
Esto fue hace tanto tiempo que no recuerdo la razón por la que APC es la causa de este problema. Lo siento, no puedo ayudar.
Andrew McCombe
2

este error también puede ocurrir si el servidor está procesando los datos. Por lo general, me sucede cuando publico algunos archivos en los sitios web de la API REST que tienen muchas entradas y tardan mucho en crearse y devolverse los registros.

Thiago Conrado
fuente
1

puede probar este curl -sS " http://www.example.com/backup.php " poniendo su URL en "" que funcionó para mí, no sé la razón exacta, pero supongo que poniendo la URL en " "completa la solicitud al servidor o simplemente completa la solicitud de encabezado.

omar
fuente
1

He tenido este problema antes. Descubrí que tenía otra aplicación usando el mismo puerto (3000).

Manera fácil de averiguar esto:

En la terminal, escriba netstat -a -p TCP -n | grep 3000(sustituya el puerto que está usando por el '3000'). Si hay más de uno escuchando, algo más ya está ocupando ese puerto. Debe detener ese proceso o cambiar el puerto para su nuevo proceso.

ginna
fuente
2
Este es un caso muy específico que mencionaste. En general, esta no es la razón por la que curl te devuelve esta respuesta. Resulta que este problema debe tratarse en el lado del servidor y no en el lado del cliente. Aquí es donde entendí.
Aashish Chaubey
1

En mi caso (curl 7.47.0), se debe a que configuré el encabezado content-lengthen el comando curl manualmente con un valor que calcula el cartero (usé cartero para generar los parámetros del comando curl y copiarlos al shell). Después de eliminar el encabezado content-length, funciona normalmente.

YouCL
fuente
0

Pruebe esto -> En lugar de pasar por cURL, intente hacer ping al sitio al que está tratando de llegar con Telnet. La respuesta que devuelve su intento de conexión será exactamente lo que ve cURL cuando intenta conectarse (pero que lo ofusca inútilmente). Ahora, dependiendo de lo que vea aquí, puede sacar una de varias conclusiones:

Está intentando conectarse a un sitio web que es un host virtual basado en nombre, lo que significa que no se puede acceder a él a través de la dirección IP. Algo salió mal con el nombre de host; es posible que haya escrito algo mal. Tenga en cuenta que usar GET en lugar de POST para los parámetros le dará una respuesta más concreta.

El problema también puede estar relacionado con el encabezado 100-continue. Intente ejecutar curl_getinfo($ch, CURLINFO_HTTP_CODE)y verifique el resultado.

Felix
fuente
Interesante punto. De hecho, pude obtener el HTML como respuesta con telnet hostnameyGET <url>
Nino Škopac
0

Mi caso se debió a la caducidad del certificado SSL

Druvan
fuente
-1

En mi caso, estaba usando uwsgi, agregué la propiedad http-timeout durante más de 60 segundos, pero no funcionaba debido a un espacio adicional y el archivo de configuración no se cargaba correctamente.

Ankit Adlakha
fuente
-2

Ocurre cuando intenta acceder a un sitio web seguro como Https.

Espero que te hayas perdido

Intente cambiar la URL a curl -sS -u "nombre de usuario: contraseña" https://www.example.com/backup.php

Muthukrishnan
fuente
3
Mucho no. Y por cierto, ¿qué tiene que ver el simple auth "username: password" con https?
Nino Škopac
la parte de autenticación de la respuesta hace que parezca que no sabe por qué es extraño agregar eso a la respuesta.
Skid Kadda