什么是 curl 错误52“空服务器回复”?

我在一台服务器上安装了 cron 作业,以便在另一台服务器上运行 PHP 中的备份脚本。

我一直使用的命令是

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

最近,当 Cron 运行时,我一直遇到这个错误:

curl: (52) Empty reply from server

如果我直接进入浏览器的链接,脚本运行良好,我得到了我的小备份 ZIP 文件。

452969 次浏览

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

我怀疑您的问题是在您和有问题的主机之间存在某种网络基础设施,比如防火墙或代理。因此,要使这种方法起作用,就需要与负责该硬件的人员讨论这个问题。

在我的案例中,这是由 PHP APC 问题引起的。首先要查看 Apache 错误日志(如果您正在使用 Apache)。

在我的例子中是服务器重定向; curl -L解决了我的问题。

当你试图访问像 Https 这样的安全网站时,就会发生这种情况。

我希望你没打中“ s”

尝试将 URL 更改为 curl-sS-u“ username: password”https://www.example.com/backup.php

尝试使用 这个-> 而不是通过 cURL,尝试使用 Telnet 连接到您要访问的站点。连接尝试返回的响应与 cURL 尝试连接时看到的响应完全一致(但是它对您进行了无益的模糊处理)。现在,根据你在这里看到的,你可能会得出几个结论之一:

您试图连接到一个基于名称的虚拟主机网站,这意味着无法通过 IP 地址访问该网站。主机名出了问题ーー你可能打错了。注意,对参数使用 GET 而不是 POST 将给出更具体的答案。

这个问题也可能与100-ContinuteHeader 有关。尝试运行 curl_getinfo($ch, CURLINFO_HTTP_CODE),并检查结果。

你可以试试这个卷发的 http://www.example.com/backup.php 我不知道确切的原因,但我认为将 URL 放入“”可以完成对服务器的请求,或者只是完成头部请求。

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

例如:

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

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

我在尝试访问 sonarqubeAPI 时得到了这个错误,由于内存利用率过高,服务器没有响应

我以前也遇到过这个问题,发现我有另一个应用程序使用同一个端口(3000)。

找出答案的简单方法是:

在终端中,键入 netstat -a -p TCP -n | grep 3000(将使用的端口替换为“3000”)。如果有不止一个监听,那么已经有其他东西占据了该端口。您应该停止该进程或更改新进程的端口。

空答复的另一个常见原因是超时。检查从 cron 作业运行到 PHP/目标服务器的所有跃点。可能有一个设备/server/nginx/LB/代理沿着这条线的某个位置提前终止请求,导致响应为空。

在 SSL 连接的情况下,这可能是由于较早版本的 nginx 服务器在 curl 和 Safari 请求期间出现 Segfault 问题造成的。这个窃听器是在 nginx 1.10版本左右修复的,但是在互联网上仍然有很多较老的 nginx 版本。

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

我知道 OP 要求的是非 SSL 的情况下,但因为这是谷歌的顶部页面“空回复从服务器”的问题,我在这里留下了 SSL 的答案,因为我是许多敲我的头在墙上与这个问题之一。

在我的例子中(curl 7.47.0) ,这是因为我使用一个由 postman 计算的值手动设置 curl 命令的头 content-length(我使用 postman 生成 curl 命令参数并将它们复制到 shell)。删除头 content-length后,它正常工作。

在我的例子中,我使用 uwsgi,添加了超过60秒的 http-timeout 属性,但是由于一些额外的空间和配置文件没有被正确加载,它不能工作。

我的情况是由于 SSL 证书过期

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

我偶尔碰到这个错误,不能理解。谷歌没有帮助。

我终于发现了。我运行了几个码头集装箱,其中包括 NGINXApache。手边的命令处理一个运行 Apache的特定容器。事实证明,我还有一个 cron工作,有时在同一个集装箱上运行,做一些繁重的工作。取决于这个 cron作业给这个容器带来的负载,它无法及时响应我的命令,导致 error 52 empty reply from server甚至 502 Bad Gateway

当我注意到我调查的过程花了不到2秒钟的时间,我发现并通过简单的 curl验证了这一点,突然我得到了一个52错误,然后一个502错误,然后再次不到2秒钟-所以肯定不是我的代码没有改变。在容器中使用 ps aux,我看到了其他进程的运行并理解了它们。

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

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


嗯,这里还有更多的东西,如另一个例子所示。这次我做了一些重复的工作。

一段时间后,我发现 PHP 使用的内存不足,无法回收,因此进程死亡。

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

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

所以我从我的作文文件中删除了这些限制。现在这些容器可能会使用高达8 GB 的空间。这个过程在 Apache 上运行了几个小时,看起来问题已经解决了,内存使用量上升到远远超过100MB。


另一个警告: 为了便于获取和读取调试消息,我在 Windows下面的 Opera中启动了上述进程。对于很快出现的错误来说,这没什么问题。

但是,如果注意到最后一个,那么很自然地,进程就会运行,浏览器中的内存使用量就会增加,最终导致本地机器无法使用。因此,如果发生这种情况,请关闭此选项卡,进程将继续正常运行。

在我看来,这个问题非常开放。我将准确地分享我试图达到的目标以及我是如何解决这个问题的

背景

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

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

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

我是从 curl CLI 得到的错误

解决方案

我意识到有一个私有的 AWS VPC 处理流量。AWS EC2实例在私有子网中运行。AWS EC2实例具有阻塞流量的安全组规则。解决方案是在端口 89908999上向 EC2实例打开所有流量 0.0.0.0/0

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

在我的情况下,反向代理 NGINX 是在路上,服务器直接发送500代码,通过 NGINX curl: (52)空回复从服务器

要将 @ TechWisdom评论转换为答案: 使用 Docker + Uvicorn (FastAPI) ,您需要使用 Uvicorn 命令行选项 --host 0.0.0.0绑定到 Docker 主机(默认值为127.0.0.1)。

我在向使用 gunicorn进行并发的 flask应用程序发出请求时遇到了这个问题。原因是我设置了一个 timeout,它小于服务器处理和响应单个请求所需的时间。下面的 bash 脚本显示了如何在 gunicorn中设置 timeout

#!/bin/bash


# Start Gunicorn processes
echo Starting Gunicorn.
exec $PWD/venv/bin/gunicorn server:app --worker-class sync --timeout 100000 --keep-alive 60 --error-logfile error.log --capture-output --log-level debug \
--bind 0.0.0.0:9999

根据 独角兽 | 暂停:

沉默超过这么多秒的工人被杀死并重新启动。 值是一个正数或0。将其设置为0会完全禁用所有工作线程的超时,从而产生无限超时的效果。 一般来说,30秒的默认时间应该足够了。只有当你确定对同步工作者的影响时,才会将这个值设置得高一些。对于非同步工作进程,它只意味着工作进程仍在通信,并且不与处理 只有一个要求所需的时间长度挂钩。

允许(白名单)你的主机 ip 在端口80的“ http://www.example.com" ; 。

我遇到了同样的问题,我想使一个 curl post 请求摄取一个文件到一个弹性搜索节点,它返回这个错误。 我所做的只是改变了 config/jvm.options中的堆值,使它尽可能地大,并且它工作了,补充说明我使用的是 https 而不是 http,这根本不会引起任何问题。 如果出现其他问题,请尝试重新启动您正在使用的机器。 您可能会遇到防火墙的一些问题,因此您必须允许例如9300端口或您需要的任何端口。 这些都是我在弹性堆栈练习中遇到的问题,直到现在。

Vim/etc/elasticsearch/elasticsearch.yml

并使 xpack.security.abled: true 到 xpack.security.enable: false