我在一台服务器上设置了一个 cron 作业,以运行托管在另一台服务器上的 PHP 备份脚本。
我一直在使用的命令是
curl -sS http://www.example.com/backup.php
最近,当 Cron 运行时,我遇到了这个错误:
curl: (52) Empty reply from server
如果我直接在浏览器中访问链接,脚本运行良好,我得到了我的小备份 ZIP 文件。
curl
超时?您是否尝试过增加默认 curl 等待与 --connect-timeout <seconds>
连接以及整个操作与 --max-time <seconds>
一起执行?
如果要求 curl 在执行 HTTPS 的服务器上执行纯 HTTP,则可能会发生这种情况。
例子:
$ curl http://google.com:443
curl: (52) Empty reply from server
当没有来自服务器的回复时,Curl 会给出此错误,因为 HTTP 不响应任何请求是错误的。
我怀疑您遇到的问题是您和相关主机之间存在一些网络基础设施,例如防火墙或代理。因此,要使其正常工作,您需要与负责该硬件的人员讨论该问题。
当服务器由于 100% 的 CPU 或内存利用率而没有响应时,可能会发生这种情况。
当我尝试访问 sonarqube API 时出现此错误,并且由于内存已满,服务器没有响应
就我而言,这是服务器重定向; curl -L
解决了我的问题。
空回复的另一个常见原因是超时。检查从运行 cron 作业的位置到 PHP/目标服务器的所有跃点。沿线某处可能有一个设备/服务器/nginx/LB/proxy 比您预期的更早终止请求,从而导致空响应。
在 SSL 连接的情况下,这可能是由旧版本的 nginx 服务器中的问题引起的,该问题在 curl 和 Safari 请求期间出现段错误。 This bug 在 nginx 的 1.10 版左右已修复,但互联网上仍有许多旧版本的 nginx。
对于 nginx 管理员:将 ssl_session_cache shared:SSL:1m;
添加到 http
块应该可以解决问题。
我知道 OP 要求的是非 SSL 案例,但由于这是 goole 中“来自服务器的空回复”问题的首页,所以我将 SSL 答案留在这里,因为我是众多让我头疼的人之一在这个问题上碰壁。
就我而言,这是由 PHP APC 问题引起的。首先要查看的是 Apache 错误日志(如果您使用的是 Apache)。
如果服务器正在处理数据,也会发生此错误。当我将一些文件发布到具有许多条目并且需要很长时间来创建和返回记录的 REST API 网站时,通常会发生这种情况
我偶尔遇到这个错误,无法理解。谷歌搜索没有帮助。
我终于发现了。我运行了几个 docker 容器,其中包括 NGINX
和 Apache
。手头的命令针对运行 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
中开始了所述过程。很快就会出现错误,这很好。
但是,如果最后一个被照顾,很自然地,该进程运行并运行并且浏览器中的内存使用量增加,最终使我的本地机器无法使用。因此,如果发生这种情况,请终止此选项卡,该过程将继续正常运行。
要将 @TechWisdom 的 comment 变成答案:使用 Docker + Uvicorn (FastAPI),您需要使用 Uvicorn 命令行选项 --host 0.0.0.0
绑定到 Docker 主机(默认值为 127.0.0.1)。
在我看来,这个问题非常开放。我将准确分享我试图实现的目标以及我如何解决问题
语境
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
上打开到 EC2 实例的所有流量 0.0.0.0/0
在 AWS 负载均衡器中,我通过健康检查看到了我的目标组,并且在一些客户端重新启动和清除 DNS 缓存后,我能够通过 HTTPS 访问应用程序。
试试 this ->尝试使用 Telnet ping 您尝试访问的站点,而不是通过 cURL。您的连接尝试返回的响应将正是 cURL 在尝试连接时所看到的(但它无益地混淆了您)。现在,根据您在此处看到的内容,您可能会得出以下几个结论之一:
您正在尝试连接到基于名称的虚拟主机的网站,这意味着无法通过 IP 地址访问它。主机名出了点问题——你可能打错了一些东西。请注意,使用 GET 而不是 POST 作为参数将为您提供更具体的答案。
该问题也可能与 100-continue 标头有关。尝试运行 curl_getinfo($ch, CURLINFO_HTTP_CODE)
,并检查结果。
telnet hostname
和 GET <url>
获得 HTML 作为响应
你可以尝试这个 curl -sS "http://www.example.com/backup.php" 通过将你的 URL 放入对我有用的 "" 我不知道确切的原因,但我认为将 URL 放入 "" 完成对服务器的请求或只是完成标头请求。
我以前遇到过这个问题。发现我有另一个应用程序使用相同的端口(3000)。
找到这个的简单方法:
在终端中,键入 netstat -a -p TCP -n | grep 3000
(用您正在使用的端口替换“3000”)。如果有多个侦听,则其他东西已经在占用该端口。您应该停止该进程或更改新进程的端口。
在我的情况下(curl 7.47.0),这是因为我在 curl 命令上手动设置了标题 content-length
,其值由邮递员计算(我使用邮递员生成 curl 命令参数并将它们复制到 shell)。在我删除标题 content-length
后,它可以正常工作。
我的情况是由于 SSL 证书过期
我在向使用 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 秒就足够了。如果您确定对同步工作人员的影响,请仅将其设置得更高。对于非同步工作人员,这仅意味着工作进程仍在通信,并且与处理单个请求所需的时间长度无关。
在“http://www.example.com”的端口 80 中允许(白名单)您的主机 IP。我的意思是,如果您使用的是 AWS。
在我的情况下,我使用的是 uwsgi,添加了属性 http-timeout 超过 60 秒,但由于一些额外的空间和配置文件未正确加载,它无法正常工作。
在我的情况下,反向代理 Nginx 正在路上,服务器直接发送 500 代码,通过 NGINX curl: (52) Empty reply from server
当您尝试访问 Https 等安全网站时,就会发生这种情况。
我希望你错过了's'
尝试将 URL 更改为 curl -sS -u "username:password" https://www.example.com/backup.php
curl localhost:8443
给了我空回复错误。curl -k https://localhost:8443
正确地提供了页面。VPN
服务切断了响应。