我在一台服务器上安装了 cron 作业,以便在另一台服务器上运行 PHP 中的备份脚本。
我一直使用的命令是
curl -sS http://www.example.com/backup.php
最近,当 Cron 运行时,我一直遇到这个错误:
curl: (52) Empty reply from server
如果我直接进入浏览器的链接,脚本运行良好,我得到了我的小备份 ZIP 文件。
当没有来自服务器的答复时,Curl 会出现这个错误,因为 HTTP 没有对请求做出任何响应是一个错误。
我怀疑您的问题是在您和有问题的主机之间存在某种网络基础设施,比如防火墙或代理。因此,要使这种方法起作用,就需要与负责该硬件的人员讨论这个问题。
在我的案例中,这是由 PHP APC 问题引起的。首先要查看 Apache 错误日志(如果您正在使用 Apache)。
在我的例子中是服务器重定向; curl -L解决了我的问题。
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),并检查结果。
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”)。如果有不止一个监听,那么已经有其他东西占据了该端口。您应该停止该进程或更改新进程的端口。
netstat -a -p TCP -n | grep 3000
空答复的另一个常见原因是超时。检查从 cron 作业运行到 PHP/目标服务器的所有跃点。可能有一个设备/server/nginx/LB/代理沿着这条线的某个位置提前终止请求,导致响应为空。
在 SSL 连接的情况下,这可能是由于较早版本的 nginx 服务器在 curl 和 Safari 请求期间出现 Segfault 问题造成的。这个窃听器是在 nginx 1.10版本左右修复的,但是在互联网上仍然有很多较老的 nginx 版本。
对于 nginx 管理员: 将 ssl_session_cache shared:SSL:1m;添加到 http块应该可以解决这个问题。
ssl_session_cache shared:SSL:1m;
http
我知道 OP 要求的是非 SSL 的情况下,但因为这是谷歌的顶部页面“空回复从服务器”的问题,我在这里留下了 SSL 的答案,因为我是许多敲我的头在墙上与这个问题之一。
在我的例子中(curl 7.47.0) ,这是因为我使用一个由 postman 计算的值手动设置 curl 命令的头 content-length(我使用 postman 生成 curl 命令参数并将它们复制到 shell)。删除头 content-length后,它正常工作。
content-length
在我的例子中,我使用 uwsgi,添加了超过60秒的 http-timeout 属性,但是由于一些额外的空间和配置文件没有被正确加载,它不能工作。
我的情况是由于 SSL 证书过期
如果服务器正在处理数据,也可能发生此错误。 当我把一些文件发布到 REST API 网站时,通常会发生这种情况,因为这些网站有很多条目,需要很长时间才能创建和返回记录
我偶尔碰到这个错误,不能理解。谷歌没有帮助。
我终于发现了。我运行了几个码头集装箱,其中包括 NGINX和 Apache。手边的命令处理一个运行 Apache的特定容器。事实证明,我还有一个 cron工作,有时在同一个集装箱上运行,做一些繁重的工作。取决于这个 cron作业给这个容器带来的负载,它无法及时响应我的命令,导致 error 52 empty reply from server甚至 502 Bad Gateway。
NGINX
Apache
cron
error 52 empty reply from server
502 Bad Gateway
当我注意到我调查的过程花了不到2秒钟的时间,我发现并通过简单的 curl验证了这一点,突然我得到了一个52错误,然后一个502错误,然后再次不到2秒钟-所以肯定不是我的代码没有改变。在容器中使用 ps aux,我看到了其他进程的运行并理解了它们。
curl
ps aux
实际上,我对 NGINX中的 502 Bad Gateway长时间运行的作业感到困扰,无法用适当的参数修复它,所以我最终放弃了,将这些作业切换到 Apache。这就是为什么我对这些错误感到更加困惑的原因。
解决办法很简单。我只是用 docker service scale启动了这个容器的更多实例,就是这样。docker自身的负载平衡。
docker service scale
docker
嗯,这里还有更多的东西,如另一个例子所示。这次我做了一些重复的工作。
一段时间后,我发现 PHP 使用的内存不足,无法回收,因此进程死亡。
为什么?在一台8GB RAM 机器上有十几个容器,我最初认为将 PHP 容器上的 RAM 使用量限制在50MB 是一个好主意。
笨蛋!我忘了,但 swarmpit给了我一个提示。我在类的构造函数中调用 ini_set("memory_limit",-1);,但是最多只能调用50MB。
swarmpit
ini_set("memory_limit",-1);
所以我从我的作文文件中删除了这些限制。现在这些容器可能会使用高达8 GB 的空间。这个过程在 Apache 上运行了几个小时,看起来问题已经解决了,内存使用量上升到远远超过100MB。
另一个警告: 为了便于获取和读取调试消息,我在 Windows下面的 Opera中启动了上述进程。对于很快出现的错误来说,这没什么问题。
Windows
Opera
但是,如果注意到最后一个,那么很自然地,进程就会运行,浏览器中的内存使用量就会增加,最终导致本地机器无法使用。因此,如果发生这种情况,请关闭此选项卡,进程将继续正常运行。
在我看来,这个问题非常开放。我将准确地分享我试图达到的目标以及我是如何解决这个问题的
在端口8999和8990上运行的 Java 应用程序。应用程序在 AWS EC2 Ubuntu 20服务器上作为 docker-compose 堆栈运行。
我添加了一个网络负载均衡器,它必须在 AWS ACM 证书下的 TLS 端口443上接收流量。转发机制必须如下所示
我是从 curl CLI 得到的错误
我意识到有一个私有的 AWS VPC 处理流量。AWS EC2实例在私有子网中运行。AWS EC2实例具有阻塞流量的安全组规则。解决方案是在端口 8990和 8999上向 EC2实例打开所有流量 0.0.0.0/0
8990
8999
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)。
--host 0.0.0.0
我在向使用 gunicorn进行并发的 flask应用程序发出请求时遇到了这个问题。原因是我设置了一个 timeout,它小于服务器处理和响应单个请求所需的时间。下面的 bash 脚本显示了如何在 gunicorn中设置 timeout。
gunicorn
flask
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端口或您需要的任何端口。 这些都是我在弹性堆栈练习中遇到的问题,直到现在。
config/jvm.options
Vim/etc/elasticsearch/elasticsearch.yml
并使 xpack.security.abled: true 到 xpack.security.enable: false