我在一台服务器上设置了一个cron作业,以便在另一台服务器上托管的PHP中运行备份脚本。我一直使用的命令格式如下:
curl -sS http://www.example.com/backup.php
最近我在Cron运行时遇到了这个错误
curl: (52) Empty reply from server
我不知道这意味着什么。如果我直接在我的浏览器中找到链接,脚本运行正常,我得到我的小备份zip文件。
任何人都可以提供有关它的任何信息吗?
答案 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 容器,其中包括 NGINX
和 Apache
。手头的命令寻址特定容器,运行 Apache
。事实证明,我还有一项 cron
工作,有时会在同一个容器上运行一些繁重的工作。根据此 cron
作业在此容器上的负载,它无法及时响应我的命令,导致 error 52 empty reply from server
甚至 502 Bad Gateway
。
当我注意到我调查的过程花了不到 2 秒的时间时,我发现并通过普通的 curl
验证了这一点,突然间我收到了 52 错误,然后是 502 错误,然后又不到 2 秒- 所以这绝对不是我的代码没有改变。在容器内使用 ps aux
我看到另一个进程正在运行并理解。
实际上,我对来自 502 Bad Gateway
的 NGINX
长时间运行的作业感到困扰,无法使用适当的参数修复它,所以我最终放弃并将这些东西切换到 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 上接收流量。转发机制必须如下
我从 curl
CLI 收到错误
我意识到有一个私有 AWS VPC 来处理流量。 AWS EC2 实例在私有子网中运行。 AWS EC2 实例具有阻止流量的安全组规则。解决方案是在端口 0.0.0.0/0
和 8990
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)
答案 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;
}
}
}
}
,然后检查结果。