什么是 curl 错误 52“来自服务器的空回复”?
Posted
技术标签:
【中文标题】什么是 curl 错误 52“来自服务器的空回复”?【英文标题】:What is the curl error 52 "empty reply from server"? 【发布时间】:2010-12-27 19:43:41 【问题描述】:我在一台服务器上设置了一个 cron 作业,以运行托管在另一台服务器上的 php 备份脚本。
我一直使用的命令是
curl -sS http://www.example.com/backup.php
最近我在 Cron 运行时遇到了这个错误:
curl: (52) Empty reply from server
如果我直接在浏览器中访问该链接,脚本运行良好,并且我得到了我的小 ZIP 备份文件。
【问题讨论】:
这真的与 PHP 无关,因为 curl 不关心输出文件处理器是什么。 您的备份脚本运行时间是否会导致curl
超时?您是否尝试过增加默认 curl 等待与--connect-timeout <seconds>
连接以及整个操作与--max-time <seconds>
一起执行?
@YzmirRamirez curl 超时错误代码为 28。src:ec.haxx.se/usingcurl-timeouts.html
使用 Docker + Uvicorn (FastAPI) 它帮助我设置了 --host 0.0.0.0
【参考方案1】:
当没有来自服务器的回复时,Curl 会给出此错误,因为 HTTP 不响应任何请求是错误的。
我怀疑您遇到的问题是您和相关主机之间存在一些网络基础设施,例如防火墙或代理。因此,要使其正常工作,您需要与负责该硬件的人员讨论该问题。
【讨论】:
这可能是错误的故障排除方法。空回复意味着它能够连接到 IP/端口,但服务器在回复中没有返回任何内容。这可能是服务本身的问题。 嗯,不完全是。当这发生在我身上时,是因为我的身份验证代理没有连接到远程主机。所以实际上服务本身没有问题。 在我的情况下,我有代理,它在服务器运行的环回接口中被禁用。 在我的例子中是一个 nginx Web 缓存服务器,没有剩余硬盘空间。 在我的例子中,是我组织的 *** 切断了持续时间超过 60 秒的 HTTP 请求。关闭它可以解决问题。【参考方案2】:在我的情况下,这是由 PHP APC 问题引起的。首先要查看的是 Apache 错误日志(如果您使用的是 Apache)。
【讨论】:
你能再解释一下吗?这怎么可能是由 APC 引起的?我什至没有在 PHP 中运行它,我只是在使用命令行。 这是很久以前的事了,我不记得 APC 是导致此问题的原因。抱歉,我帮不上忙。【参考方案3】:在我的例子中是服务器重定向; curl -L
解决了我的问题。
【讨论】:
【参考方案4】:当您尝试访问像 Https 这样的安全网站时会发生这种情况。
希望你错过了's'
尝试将 URL 更改为 curl -sS -u "username:password" https://www.example.com/backup.php
【讨论】:
非常不。顺便说一句,简单的身份验证“用户名:密码”与 https 有什么关系?【参考方案5】:尝试this -> 尝试使用 Telnet ping 您尝试访问的站点,而不是通过 cURL。您的连接尝试返回的响应将正是 cURL 在尝试连接时看到的(但它无益地混淆了您)。现在,根据您在此处看到的内容,您可能会得出以下几个结论之一:
您正在尝试连接到基于名称的虚拟主机的网站,这意味着无法通过 IP 地址访问它。主机名出了点问题——你可能打错了一些东西。请注意,使用 GET 而不是 POST 作为参数会给你一个更具体的答案。
该问题也可能与 100-continue 标头有关。尝试运行curl_getinfo($ch, CURLINFO_HTTP_CODE)
,并检查结果。
【讨论】:
有趣的地方。我实际上能够使用telnet hostname
和GET <url>
获得HTML 作为响应【参考方案6】:
你可以试试这个 curl -sS "http://www.example.com/backup.php" 通过将您的 URL 放入对我有用的“”中,我不知道确切的原因,但我认为将 url 放入“”可以完成对服务器的请求或只是完成标头请求。
【讨论】:
【参考方案7】:如果要求 curl 在执行 HTTPS 的服务器上执行纯 HTTP,就会发生这种情况。
例子:
$ curl http://google.com:443
curl: (52) Empty reply from server
【讨论】:
这就是我的情况。curl localhost:8443
给了我空回复错误。 curl -k https://localhost:8443
正确地提供了页面。
我刚刚偶然发现了这个,我完全错过了丢失的 s。我想知道为什么没有更明确的错误(即使连接被拒绝:它会更有意义)。
就我而言,***
服务切断了响应。【参考方案8】:
当服务器由于 100% 的 CPU 或内存利用率而没有响应时,可能会发生这种情况。
我在尝试访问 sonarqube API 时遇到此错误,但由于内存已满,服务器没有响应
【讨论】:
【参考方案9】:我以前遇到过这个问题。发现我有另一个应用程序使用相同的端口(3000)。
找出这个的简单方法:
在终端中,输入netstat -a -p TCP -n | grep 3000
(将您使用的端口替换为“3000”)。如果有多个侦听,则其他东西已经在占用该端口。您应该停止该进程或更改新进程的端口。
【讨论】:
这是您提到的一个非常具体的案例。通常,这不是 curl 返回此响应的原因。事实证明,这个问题需要在服务器端而不是客户端处理。 This 是我理解的地方。【参考方案10】:空回复的另一个常见原因是超时。检查从运行 cron 作业的位置到 PHP/目标服务器的所有跃点。沿线某处可能有一个设备/服务器/nginx/LB/proxy 比您预期的更早终止请求,导致响应为空。
【讨论】:
【参考方案11】:在 SSL 连接的情况下,这可能是由于旧版本的 nginx 服务器中的问题导致 curl 和 Safari 请求期间出现段错误。 This bug 已在 nginx 1.10 版左右修复,但互联网上仍有很多旧版本的 nginx。
对于 nginx 管理员:将 ssl_session_cache shared:SSL:1m;
添加到 http
块应该可以解决问题。
我知道 OP 要求的是非 SSL 案例,但由于这是 goole 中“来自服务器的空回复”问题的首页,因此我将 SSL 答案留在这里,因为我是其中之一许多人在这个问题上把我的头撞到了墙上。
【讨论】:
【参考方案12】:在我的情况下(curl 7.47.0),这是因为我在 curl 命令上手动设置了标题content-length
,其值由邮递员计算(我使用邮递员生成 curl 命令参数并将它们复制到 shell) .删除headercontent-length
后,就可以正常使用了。
【讨论】:
【参考方案13】:在我使用 uwsgi 的情况下,添加了属性 http-timeout 超过 60 秒,但由于一些额外的空间和配置文件未正确加载,它无法正常工作。
【讨论】:
【参考方案14】:我的情况是由于 SSL 证书过期
【讨论】:
【参考方案15】:如果服务器正在处理数据,也会发生此错误。 当我将一些文件发布到有很多条目并且需要很长时间创建和返回记录的 REST API 网站时,通常会发生这种情况
【讨论】:
【参考方案16】:我偶尔遇到这个错误,无法理解。谷歌搜索没有帮助。
我终于知道了。我运行了几个 docker 容器,其中有 NGINX
和 Apache
。手头的命令针对特定容器,运行Apache
。事实证明,我还有一个cron
工作,有时在同一个容器上运行一些繁重的工作。根据cron
作业对该容器的负载,它无法及时响应我的命令,导致error 52 empty reply from server
甚至502 Bad Gateway
。
我发现并通过普通curl
验证了这一点,当时我注意到我调查的过程不到 2 秒,突然间我收到 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
开始了上述过程。很快就会出现错误,这很好。
但是,如果最后一个得到照顾,很自然地,该进程会运行并运行,并且浏览器中的内存使用量会增加,最终使我的本地计算机无法使用。因此,如果发生这种情况,请终止此选项卡,并且该进程会继续正常运行。
【讨论】:
【参考方案17】:在我看来,这个问题非常开放。我将准确分享我试图实现的目标以及我如何解决问题
上下文
Java 应用程序在端口 8999 和 8990 上运行。应用程序在 AWS EC2 Ubuntu 20 服务器中作为 docker-compose 堆栈运行。
我添加了一个网络负载均衡器,它必须在 AWS ACM 证书下的 TLS 端口 443 上接收流量。转发机制必须如下
-
来自 NLB 的 TLS 443 端口 --> EC2 实例中的 TCP 端口 8990
来自 NLB 的 TCP 22 端口 --> EC2 实例中的 TCP 端口 8999
我从curl
CLI 收到错误
解决方案
我意识到有一个私有 AWS VPC 可以处理流量。 AWS EC2 实例在私有子网中运行。 AWS EC2 实例具有阻止流量的安全组规则。解决方案是在端口8990
和8999
上打开所有流量0.0.0.0/0
到EC2 实例
在 AWS 负载均衡器中,我看到我的目标组进行了健康检查,并且在一些客户端重新启动和清除 DNS 缓存后,我能够通过 HTTPS 访问应用程序。
【讨论】:
【参考方案18】:在我的例子中,反向代理 Nginx 正在路上,服务器直接发送 500 代码,通过 NGINX curl: (52) Empty reply from server
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review【参考方案19】:要将@TechWisdom 的comment 转换为答案:使用Docker + Uvicorn (FastAPI),您需要使用Uvicorn 命令行选项--host 0.0.0.0
(默认为127.0.0.1)绑定到Docker 主机。
【讨论】:
【参考方案20】:我在向我的flask
应用程序发出请求时遇到了这个问题,该应用程序使用gunicorn
进行并发。原因是我设置了一个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
根据Gunicorn | timeout:
静默超过这么多秒的工人将被杀死并重新启动。 值为正数或 0。将其设置为 0 通过完全禁用所有工作人员的超时来产生无限超时的效果。 通常,默认值 30 秒就足够了。如果您确定对同步工作人员的影响,请仅将其设置得更高。对于非同步工作者,它只是意味着工作者进程仍在通信,并且与处理单个请求所需的时间长度无关。
【讨论】:
以上是关于什么是 curl 错误 52“来自服务器的空回复”?的主要内容,如果未能解决你的问题,请参考以下文章
“本地主机没有发送数据。ERR_EMPTY_RESPONSE”和“curl:(52)来自服务器的空回复”
php guzzle [curl] 52 来自服务器的空回复
curl: (52) 来自服务器的空回复通过 ssh 端口转发