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

时间:2009-12-17 20:41:03

标签: curl cron

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

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

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

curl: (52) Empty reply from server

我不知道这意味着什么。如果我直接在我的浏览器中找到链接,脚本运行正常,我得到我的小备份zip文件。

任何人都可以提供有关它的任何信息吗?

17 个答案:

答案 0 :(得分:42)

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

示例:

JScrollPane

答案 1 :(得分:39)

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

我怀疑你遇到的问题是你和有问题的主机之间有一些网络基础设施,比如防火墙或代理。因此,要使其工作,将要求您与负责该硬件的人员讨论该问题。

答案 2 :(得分:5)

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

当我尝试访问sonarqube API并且服务器由于内存使用率不足而没有响应时出现此错误

答案 3 :(得分:3)

在我的情况下,这是由PHP APC问题引起的。首先要看的是Apache错误日志(如果您使用的是Apache)。

希望这有助于某人。

答案 4 :(得分:3)

在我的情况下,它是服务器重定向; curl -L解决了我的问题。

答案 5 :(得分:3)

我偶尔遇到这个错误并且无法理解。谷歌搜索没有帮助。

我终于知道了。我运行了几个 docker 容器,其中包括 NGINXApache。手头的命令寻址特定容器,运行 Apache。事实证明,我还有一项 cron 工作,有时会在同一个容器上运行一些繁重的工作。根据此 cron 作业在此容器上的负载,它无法及时响应我的命令,导致 error 52 empty reply from server 甚至 502 Bad Gateway

当我注意到我调查的过程花了不到 2 秒的时间时,我发现并通过普通的 curl 验证了这一点,突然间我收到了 52 错误,然后是 502 错误,然后又不到 2 秒- 所以这绝对不是我的代码没有改变。在容器内使用 ps aux 我看到另一个进程正在运行并理解。

实际上,我对来自 502 Bad GatewayNGINX 长时间运行的作业感到困扰,无法使用适当的参数修复它,所以我最终放弃并将这些东西切换到 Apache。这就是为什么我对这些错误更加困惑。

解决办法很简单。我刚刚用 docker service scale 启动了这个容器的更多实例,就是这样。 docker 自行进行负载平衡。


好吧,正如另一个示例所示,还有更多内容。这次我做了一些重复的工作。

我发现一段时间后我用完了无法回收的PHP使用的内存,所以进程终止了。

为什么?在 8GB RAM 的机器上有十多个容器,我最初认为将 PHP 容器上的 RAM 使用量限制为 50MB 是个好主意。

笨蛋!我忘记了,但 swarmpit 给了我一个提示。我在我的类的构造函数中调用了 ini_set("memory_limit",-1);,但只有 50MB。

所以我从我的撰写文件中删除了这些限制。现在这些容器最多可以使用 8GB。该进程现在与 Apache 一起运行了几个小时,看起来问题已经解决了,内存使用量上升到远远超过 100MB。


另一个警告:为了轻松获取和阅读调试消息,我在 Opera 下的 Windows 中启动了上述过程。很快就会出现错误。

但是,如果处理最后一个,很自然地,该进程会运行并运行,并且浏览器中的内存使用量会增加,最终使我的本地机器无法使用。因此,如果发生这种情况,请终止此选项卡,该进程将继续正常运行。

答案 6 :(得分:3)

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

答案 7 :(得分:2)

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

答案 8 :(得分:2)

在使用SSL连接的情况下,这可能是由于Nginx服务器的旧版本在curl和Safari请求期间出现段错误而导致的。 This bug已在nginx 1.10版本附近修复,但互联网上仍存在许多较旧的nginx版本。

对于nginx管理员:将ssl_session_cache shared:SSL:1m;添加到http块应该可以解决问题。

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

答案 9 :(得分:1)

我认为这个问题非常开放。我将准确分享我想要实现的目标以及我如何解决问题

上下文

Java 应用程序在端口 8999 和 8990 上运行。应用程序在 AWS EC2 Ubuntu 20 服务器中作为 docker-compose 堆栈运行。

我添加了一个网络负载均衡器,它必须在 AWS ACM 证书下的 TLS 端口 443 上接收流量。转发机制必须如下

  1. 来自 NLB 的端口 TLS 443 --> EC2 实例中的 TCP 端口 8990
  2. 来自 NLB 的 TCP 22 端口 --> EC2 实例中的 TCP 端口 8999

我从 curl CLI 收到错误

解决方案

我意识到有一个私有 AWS VPC 来处理流量。 AWS EC2 实例在私有子网中运行。 AWS EC2 实例具有阻止流量的安全组规则。解决方案是在端口 0.0.0.0/08990

上打开所有到 EC2 实例的流量 8999

在 AWS 负载均衡器中,我看到我的目标组进行了健康检查,在一些客户端重新启动和清除 DNS 缓存后,我能够通过 HTTPS 访问应用程序。

答案 10 :(得分:1)

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

轻松找到答案:

在终端中,键入netstat -a -p TCP -n | grep 3000(替换您用于' 3000'的端口)。如果有多个监听,则其他东西已占用该端口。您应该停止该过程或更改新过程的端口。

答案 11 :(得分:1)

你可以试试这个curl -sS" http://www.example.com/backup.php" 将您的网址放入""对我有用的我不知道确切的原因,但我想把网址放到""完成对服务器的请求或只完成标头请求。

答案 12 :(得分:1)

当您尝试访问Https等安全网站时会发生这种情况。

我希望你错过了''

尝试将网址更改为curl -sS -u“用户名:密码”https://www.example.com/backup.php

答案 13 :(得分:0)

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

答案 14 :(得分:0)

在我使用uwsgi的情况下,添加了http-timeout属性超过60秒,但是由于一些额外的空间而无法正常工作,并且配置文件未正确加载。

答案 15 :(得分:0)

我的案件是由于SSL证书到期

答案 16 :(得分:0)

尝试this - >而不是通过cURL,尝试ping您尝试使用Telnet访问的网站。您的连接尝试返回的响应将正是cURL在尝试连接时所看到的响应(但它无助于您的连接)。现在,根据您在此处看到的内容,您可能会得出以下几个结论之一:

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

该问题也可能与100-continue标题有关。尝试运行private void SubstractList(ref List<string> l1, List<string> l2) { foreach (string s2 in l2) { for (int i = 0; i < l1.Count; i++) { if (l1[i] == s2) { l1.RemoveAt(i); break; } } } } ,然后检查结果。