卷曲错误52来自服务器的空回复


96

我在一台服务器上设置了cron作业,以便在另一台服务器上托管的PHP中运行备份脚本。我一直在使用的命令的格式如下:

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

最近我在Cron运行时遇到了这个错误

curl: (52) Empty reply from server

我不知道这是什么意思。如果我直接在浏览器中转到该链接,则脚本运行良好,并且我得到了少量备份zip文件。

谁能提供有关它的任何信息?


实际上,这与PHP无关,因为curl不在乎输出文件处理器是什么。
凯文·佩诺

1
备份脚本是否可以运行太长时间以至于导致curl超时?您是否尝试过增加默认的curl等待连接--connect-timeout <seconds>并进行整个操作--max-time <seconds>
伊兹密尔·拉米雷斯

@YzmirRamirez卷曲超时错误代码为28。Src
Luckylooke

使用Docker + Uvicorn(FastAPI),它帮助我设置--host 0.0.0.0
TechWisdom

Answers:


72

如果要求curl在执行HTTPS的服务器上执行纯HTTP,则会发生这种情况。

例:

$ curl http://google.com:443
curl: (52) Empty reply from server

7
就我而言就是这种情况。curl localhost:8443给了我空的答复错误。curl -k https://localhost:8443正确投放了该页面。
lowly_junior_sysadmin

1
我刚刚跌跌撞撞,完全错过了失踪的人。我想知道为什么没有更明确的错误(即使拒绝连接也是如此:这样做更有意义)。
ShinTakezou '18 -10-4

45

当没有来自服务器的答复时,Curl会给出此错误,因为HTTP不响应请求是任何错误。

我怀疑您遇到的问题是,您与所讨论的主机之间存在某些网络基础结构,例如防火墙或代理。因此,要使其正常工作,将需要您与负责该硬件的人员讨论该问题。


18
这可能是错误的故障排除方法。空答复表示它能够连接到IP /端口,但是服务器在答复中未返回任何内容。服务本身可能是一个问题。
罗伯特·克里斯蒂安

4
好吧,不完全是。当我发生这种情况时,这是因为我的身份验证代理未连接到远程主机。因此,实际上,服务本身没有问题。
史蒂夫·奈特

就我而言,我有代理,该代理在运行服务器的环回接口中被禁用。
rbaleksandar

以我为例,NGINX Web缓存服务器没有硬盘空间。
外星人生命表格


8

当服务器由于100%CPU或内存利用率而无响应时,可能会发生这种情况。

当我尝试访问sonarqube API时出现此错误,并且由于内存已满,服务器没有响应


7

空回复的另一个常见原因是超时。检查从cron作业运行到您的PHP /目标服务器的所有跃点。可能在某处有设备/服务器/ nginx / LB /代理,它比您预期的要早终止请求,从而导致响应为空。


5

如果是SSL连接,这可能是由于Nginx服务器的旧版本在curl和Safari请求期间出现段错误而引起的。这个错误已在nginx 1.10版附近修复,但互联网上仍存在许多较旧的nginx版本。

对于Nginx管理员:添加ssl_session_cache shared:SSL:1m;http阻止应该可以解决该问题。

我知道OP要求使用非SSL的情况,但是由于这是goole中“服务器的空回复”问题的首页,因此我将SSL答案留在这里,因为我是困扰我的众多人之一靠着这个问题。


3

就我而言,这是由PHP APC问题引起的。首先要看的是Apache错误日志(如果使用的是Apache)。

希望这对某人有帮助。


你能解释更多吗?APC怎么引起的?我什至没有在PHP中运行它,我只是在使用命令行。
NinoŠkopac17年

这是很久以前的事,我不记得APC成为此问题的原因的原因。对不起,我帮不上忙。
安德鲁·麦康伯

1

您可以通过将URL放入对我有用的“”中来尝试使用curl -sS“ http://www.example.com/backup.php ”,我不知道确切的原因,但我想将URL放入“ ”即可完成对服务器的请求,也可以仅完成标头请求。


1

我以前有这个问题。弄清楚我有另一个使用相同端口(3000)的应用程序。

找出这一点的简单方法:

在终端中,键入netstat -a -p TCP -n | grep 3000(用“ 3000”代替您使用的端口)。如果有多个监听,则该端口已经占用了其他端口。您应该停止该进程或更改新进​​程的端口。


2
您提到的这是一个非常具体的情况。通常,这不是为什么curl返回此响应的原因。原来,这个问题需要在服务器端而不是客户端端解决。是我了解的地方。
Aashish Chaubey

1

在我的情况下(curl 7.47.0),这是因为我content-length手动将curl命令的标头设置为由邮递员计算的值(我使用邮递员生成curl命令参数并将其复制到shell)。我删除header后content-length,它可以正常工作。


1

如果服务器正在处理数据,也会发生此错误。当我确实将一些文件发布到REST API网站上时,通常会发生这种情况,这些网站有很多条目,并且需要很长时间来创建和返回记录


0

试试这个->而不是通过cURL,而是尝试ping您要通过Telnet访问的站点。您的连接尝试返回的响应将与cURL尝试连接时看到的完全一样(但会无益地使您困惑)。现在,根据您在此处看到的内容,您可能会得出以下结论之一:

您正在尝试连接到基于名称的虚拟主机的网站,这意味着无法通过IP地址访问该网站。主机名出了点问题-您可能输入了错误的内容。请注意,使用GET而不是POST作为参数将为您提供更具体的答案。

该问题也可能与100个继续标头有关。尝试运行curl_getinfo($ch, CURLINFO_HTTP_CODE),然后检查结果。


有趣的一点。我实际上可以通过telnet hostnameGET <url>
NinoŠkopac'17



-2

当您尝试访问Https之类的安全网站时,就会发生这种情况。

我希望你错过了“ s”

尝试更改URL以卷曲-sS -u“ username:password” https://www.example.com/backup.php


3
非常不 顺便说一句,简单的auth“ username:password”与https有什么关系?
NinoŠkopac17年

答案的auth部分使您似乎不知道为什么将其添加到答案中很奇怪。
滑倒Kadda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.