Qual é o erro curl 52 “resposta vazia do servidor”?

101

Eu tenho uma configuração de cron job em um servidor para executar um script de backup em PHP que está hospedado em outro servidor.

O comando que estou usando é

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

Ultimamente tenho recebido este erro quando o Cron é executado:

curl: (52) Empty reply from server

Se eu acessar o link diretamente em meu navegador, o script será executado bem e recebo meu pequeno arquivo ZIP de backup.

Paul Sheldrake
fonte
Isso realmente não tem nada a ver com o PHP, já que o curl não se importa com o processador do arquivo de saída.
Kevin Peno
1
Seu script de backup pode estar em execução há tanto tempo que faz com que o curltempo limite seja esgotado? Você já tentou aumentar as esperas de onda padrão para conectar --connect-timeout <seconds>e para toda a operação executar --max-time <seconds>?
Yzmir Ramirez
@YzmirRamirez curl código de erro de tempo limite é 28. Src: ec.haxx.se/usingcurl-timeouts.html
Luckylooke
Com Docker + Uvicorn (FastAPI), me ajudou a definir --host 0.0.0.0
TechWisdom

Respostas:

77

Isso pode acontecer se curl for solicitado a fazer HTTP simples em um servidor que faz HTTPS.

Exemplo:

$ curl http://google.com:443
curl: (52) Empty reply from server
Benoit Duffez
fonte
8
Essa foi a situação no meu caso. curl localhost:8443me deu o erro de resposta vazia. curl -k https://localhost:8443veiculou a página corretamente.
lowly_junior_sysadmin 01 de
1
Acabei de tropeçar nisso e perdi completamente o que faltava. Eu me pergunto por que não há um erro mais claro (mesmo como conexão recusada: faria mais sentido).
ShinTakezou
45

O Curl dá esse erro quando não há resposta de um servidor, pois é um erro do HTTP não responder nada a uma solicitação.

Suspeito que o problema que você tem é que existe alguma peça de infraestrutura de rede, como um firewall ou um proxy, entre você e o host em questão. Para que isso funcione, portanto, você precisará discutir o problema com as pessoas responsáveis ​​por esse hardware.

Steve Knight
fonte
20
Esta é provavelmente a abordagem errada para a solução de problemas. Resposta vazia significa que ele foi capaz de se conectar ao IP / porta, mas o servidor não retornou nada na resposta. Provavelmente é um problema no próprio serviço.
Robert Christian
4
Bem, não exatamente. Quando isso aconteceu comigo, foi porque meu proxy de autenticação não estava se conectando ao host remoto. Portanto, na verdade, não houve nenhum problema no serviço em si.
Steve Knight
No meu caso tenho proxy, que está desabilitado para interface de loopback onde o servidor está rodando.
rbaleksandar de
No meu caso, um servidor de cache da web NGINX sem espaço no disco rígido.
Alien Life Form
9

No meu caso, foi o redirecionamento do servidor; curl -Lresolveu meu problema.

Guillermo Prandi
fonte
9

Isso pode acontecer quando o servidor não responde devido a 100% de utilização da CPU ou da memória.

Recebi este erro quando estava tentando acessar a API do sonarqube e o servidor não estava respondendo devido à utilização total da memória

Jayaprakash
fonte
8

Outro motivo comum para uma resposta vazia é o tempo limite. Verifique todos os saltos de onde o cron job está sendo executado para seu servidor PHP / de destino. Provavelmente existe um dispositivo / servidor / nginx / LB / proxy em algum lugar ao longo da linha que encerra a solicitação antes do esperado, resultando em uma resposta vazia.

coletor de lixo
fonte
5

No caso de conexões SSL, isso pode ser causado por problemas em versões mais antigas do servidor nginx que apresentam falha em segfault durante solicitações curl e Safari. Este bug foi corrigido na versão 1.10 do nginx, mas ainda existem muitas versões antigas do nginx na internet.

Para administradores nginx: adicionar ssl_session_cache shared:SSL:1m;ao httpbloco deve resolver o problema.

Estou ciente de que OP estava pedindo um caso não SSL, mas como esta é a página inicial do goole para o problema de "resposta vazia do servidor", estou deixando a resposta SSL aqui, pois fui um dos muitos que estava batendo a cabeça contra a parede com este problema.

SiliconMind
fonte
3

No meu caso, isso foi causado por um problema de PHP APC. O primeiro lugar a ser examinado são os logs de erros do Apache (se você estiver usando o Apache).

Espero que isso ajude alguém.

Andrew McCombe
fonte
Você pode explicar um pouco mais? Como isso pode ser causado pelo APC? Não estou nem executando isso dentro do PHP, estou apenas usando a linha de comando.
Nino Škopac,
Isso foi há tanto tempo que não consigo me lembrar por que a APC é a causa desse problema. Desculpe, não posso ajudar.
Andrew McCombe,
2

esse erro também pode ocorrer se o servidor estiver processando os dados. Geralmente acontece comigo quando posto alguns arquivos em sites da API REST que têm muitas entradas e demoram muito para a criação e o retorno dos registros

Thiago Conrado
fonte
1

você pode tentar este curl -sS " http://www.example.com/backup.php " colocando seu URL em "" que funcionou para mim. Não sei o motivo exato, mas suponho que colocar o url em " "conclui a solicitação ao servidor ou apenas conclui a solicitação de cabeçalho.

omar
fonte
1

Eu já tive esse problema antes. Descobri que tinha outro aplicativo usando a mesma porta (3000).

Maneira fácil de descobrir isso:

No terminal, digite netstat -a -p TCP -n | grep 3000(substitua a porta que você está usando por '3000'). Se houver mais de um ouvindo, algo mais já está ocupando essa porta. Você deve interromper esse processo ou alterar a porta para seu novo processo.

ginna
fonte
2
Este é um caso muito específico que você mencionou. Em geral, não é por isso que curl retorna esta resposta. Acontece que esse problema precisa ser tratado no lado do servidor e não no lado do cliente. Este é o lugar onde eu entendi.
Aashish Chaubey
1

No meu caso (curl 7.47.0), é porque eu configurei o cabeçalho content-lengthno comando curl manualmente com um valor que é calculado pelo postman (usei o postman para gerar parâmetros do comando curl e copiá-los para o shell). Depois de excluir o cabeçalho content-length, ele funciona normalmente.

YouCL
fonte
0

Tente isto -> Em vez de usar o cURL, tente fazer o ping do site que está tentando acessar com o Telnet. A resposta que sua tentativa de conexão retorna será exatamente o que cURL vê quando ele tenta se conectar (mas que inutilmente ofusca de você). Agora, dependendo do que você vê aqui, você pode tirar uma das várias conclusões:

Você está tentando se conectar a um site que é um host virtual baseado em nome, o que significa que não pode ser alcançado por meio do endereço IP. Algo deu errado com o nome do host - você pode ter digitado algo errado. Observe que o uso de GET em vez de POST para parâmetros fornecerá uma resposta mais concreta.

O problema também pode estar relacionado ao cabeçalho de 100 continuações. Experimente correr curl_getinfo($ch, CURLINFO_HTTP_CODE)e verifique o resultado.

Felix
fonte
Ponto interessante. Na verdade, consegui obter o HTML como resposta com telnet hostnameeGET <url>
Nino Škopac
0

Meu caso foi devido à expiração do certificado SSL

Druvan
fonte
0

Eu encontrei esse erro esporadicamente e não conseguia entender. Googling não ajudou.

Eu finalmente descobri. Eu administro alguns contêineres docker, entre eles NGINXe Apache. O comando em questão endereça um contêiner específico, em execução Apache. Acontece que também tenho crontrabalho para fazer trabalho pesado, às vezes, no mesmo contêiner. Dependendo da carga que este crontrabalho coloca neste contêiner, ele não foi capaz de responder ao meu comando em tempo hábil, resultando em error 52 empty reply from serverou mesmo 502 Bad Gateway.

Eu descobri e verifiquei isso claramente curlquando percebi que o processo que investiguei levou menos de 2 segundos e de repente eu obtive um erro 52 e depois um erro 502 e novamente menos de 2 segundos - então definitivamente não era meu código que não foi alterado. Usando ps auxdentro do contêiner, vi o outro processo em execução e entendi.

Na verdade, eu estava incomodado 502 Bad Gatewaypela partir NGINXde trabalhos de execução longa e não pode corrigi-lo com os parâmetros apropriados, então eu finalmente desistiu e mudou essas coisas Apache. É por isso que fiquei ainda mais confuso com esses erros.

O remédio é simples. Eu apenas acionei mais algumas instâncias deste contêiner docker service scalee foi isso. dockerbalanços de carga por conta própria.

kklepper
fonte
-1

No meu caso, eu estava usando uwsgi, adicionei a propriedade http-timeout por mais de 60 segundos, mas ela não estava funcionando por causa de algum espaço extra e o arquivo de configuração não estava sendo carregado corretamente.

Ankit Adlakha
fonte
-2

Acontece quando você está tentando acessar um site seguro como o Https.

Eu espero que você tenha perdido 's'

Tente alterar o URL para curl -sS -u "nome de usuário: senha" https://www.example.com/backup.php

Muthukrishnan
fonte
3
Muito não. E btw o que é simples auth "nome de usuário: senha" tem a ver com https?
Nino Škopac
a parte auth da resposta faz parecer que você não sabe por que é estranho adicionar isso à resposta.
Skid Kadda