ChatGPT解决这个技术问题 Extra ChatGPT

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

我在一台服务器上设置了一个 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

B
Benoit Duffez

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

例子:

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

这就是我的情况。 curl localhost:8443 给了我空回复错误。 curl -k https://localhost:8443 正确地提供了页面。
我刚刚偶然发现了这一点,我完全错过了丢失的 s 。我想知道为什么没有更明确的错误(即使连接被拒绝:它会更有意义)。
在我的例子中,VPN 服务切断了响应。
S
Steve Knight

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

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


这可能是错误的故障排除方法。空回复意味着它能够连接到 IP/端口,但服务器在回复中没有返回任何内容。这可能是服务本身的问题。
嗯,不完全是。当这发生在我身上时,是因为我的身份验证代理没有连接到远程主机。所以实际上服务本身没有问题。
在我的情况下,我有代理,它在服务器运行的环回接口上被禁用。
在我的例子中,一个 NGINX Web 缓存服务器没有剩余硬盘空间。
就我而言,是我组织的 VPN 切断了持续时间超过 60 秒的 HTTP 请求。关闭它可以解决问题。
J
Jayaprakash

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

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


M
Matt Seymour

就我而言,这是服务器重定向; curl -L 解决了我的问题。


g
garbagecollector

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


S
SiliconMind

在 SSL 连接的情况下,这可能是由旧版本的 nginx 服务器中的问题引起的,该问题在 curl 和 Safari 请求期间出现段错误。 This bug 在 nginx 的 1.10 版左右已修复,但互联网上仍有许多旧版本的 nginx。

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

我知道 OP 要求的是非 SSL 案例,但由于这是 goole 中“来自服务器的空回复”问题的首页,所以我将 SSL 答案留在这里,因为我是众多让我头疼的人之一在这个问题上碰壁。


T
Tomerikoo

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


你能再解释一下吗?这怎么可能是由 APC 引起的?我什至没有在 PHP 中运行它,我只是在使用命令行。
这是很久以前的事了,我不记得 APC 是这个问题的原因。对不起,我帮不上忙。
T
Thiago Conrado

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


k
kklepper

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

我终于发现了。我运行了几个 docker 容器,其中包括 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。

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

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

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


T
Tomerikoo

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


D
Dharman

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

语境

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 实例具有阻止流量的安全组规则。解决方案是在端口 89908999 上打开到 EC2 实例的所有流量 0.0.0.0/0

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


R
RamenChef

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

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

该问题也可能与 100-continue 标头有关。尝试运行 curl_getinfo($ch, CURLINFO_HTTP_CODE),并检查结果。


有趣的一点。我实际上能够通过 telnet hostnameGET <url> 获得 HTML 作为响应
o
omar

你可以尝试这个 curl -sS "http://www.example.com/backup.php" 通过将你的 URL 放入对我有用的 "" 我不知道确切的原因,但我认为将 URL 放入 "" 完成对服务器的请求或只是完成标头请求。


g
ginna

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

找到这个的简单方法:

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


这是你提到的一个非常具体的案例。通常,这不是 curl 返回此响应的原因。事实证明,这个问题需要在服务器端而不是客户端处理。 This 是我理解的地方。
Y
YouCL

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


D
Druvan

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


h
hafiz031

我在向使用 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

根据Gunicorn | timeout

沉默超过这么多秒的工人被杀死并重新启动。值为正数或 0。将其设置为 0 会通过完全禁用所有工作人员的超时来产生无限超时的效果。通常,默认值 30 秒就足够了。如果您确定对同步工作人员的影响,请仅将其设置得更高。对于非同步工作人员,这仅意味着工作进程仍在通信,并且与处理单个请求所需的时间长度无关。


z
zawhtut

在“http://www.example.com”的端口 80 中允许(白名单)您的主机 IP。我的意思是,如果您使用的是 AWS。


A
Ankit Adlakha

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


c
cypma5

在我的情况下,反向代理 Nginx 正在路上,服务器直接发送 500 代码,通过 NGINX curl: (52) Empty reply from server


正如目前所写的那样,您的答案尚不清楚。请edit添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以找到有关如何写出好答案的更多信息in the help center
这并没有真正回答这个问题。如果您有其他问题,可以点击 Ask Question 提出问题。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以通过add a bounty来引起对这个问题的更多关注。 - From Review
M
Muthukrishnan

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

我希望你错过了's'

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


非常没有。顺便说一句,简单的身份验证“用户名:密码”与 https 有什么关系?