我有一个 shell 脚本,用于监控实时服务器集群上的加载时间和响应代码。它每 5 分钟总共运行 250 次迭代,分布在 10 台服务器和 6 个站点上。它使用带有 -w 标志的 curl 返回相关信息,然后由我的 shell 脚本进行解析:
curl -svw 'monitor_load_times %{time_total} %{http_code}' -b 'server=$server' -m 15 -o /dev/null $url 2>&1
然后,图形脚本会解析这些信息,并显示许多不同的响应。但是,curl 偶尔会返回响应代码“000”。当这种情况发生时,尽管分布在多次迭代中,但它似乎会同时发生多次:
我想要弄清楚的是,这是客户端问题导致的结果偏差,还是实际上表明服务器端问题影响了整个集群。000 是否表示连接已断开?具有该响应代码的 curl 迭代对应的数据库条目为 time_total 值返回“0.000”。我发现的 curl 返回代码 000 的所有搜索结果都与不支持 HTTPS 有关,但我的所有测试 URL 都是 HTTP。
(500 个错误的激增与昨晚影响我的服务器的问题完全无关。)
答案1
响应 000 表示 cURL 由于某种原因无法执行。在这种情况下,您应该测试 cURL 退出代码,而不是做出假设。请参阅curl 手册页以获取退出代码及其含义的完整列表。
DNS 解析失败 (6)
$ curl -w "%{http_code}\n" http://example.invalid/ ; echo "Exit code: $?"
000
curl: (6) Could not resolve host: example.invalid
Exit code: 6
(ILIV 的回答)
连接被拒绝 (7)
$ curl -w "%{http_code}\n" http://localhost:81/ ; echo "Exit code: $?"
000
curl: (7) Failed to connect to localhost port 81: Connection refused
Exit code: 7
连接超时(28)
$ curl -w "%{http_code}\n" -m 5 http://10.255.255.1/ ; echo "Exit code: $?"
000
curl: (28) Connection timed out after 5001 milliseconds
Exit code: 28
(正如 Arun 所回答的)
服务器实际上由于某种原因返回 000 (0)
启动一个虚假服务器:
$ nc -l -p 65535 & <<EOF
> HTTP/1.1 000 Fake Status Code
> Content-Length: 0
> Connection: close
>
> EOF
客户要求:
$ curl -w "%{http_code}\n" http://localhost:65535/ ; echo "Exit code: $?"
000
Exit code: 0
不知道为什么在现实世界中会发生这种情况,但是嘿。如果 cURL 根本没有获得有效的状态代码,它会假定为 200。
答案2
Curl 000 表示超时: - 超时可能是由于防火墙阻止您的请求发出。 - 超时可能是由于连接断开。 - 超时也可能是无法解析 DNS 名称的结果。
我广泛使用 curl,并密切关注所有响应代码 - 000 就是其中之一。在我的案例中,当满足上述三个条件中的任何一个时,我都会收到 000 响应代码。
事实上,我目前正在运行(正如我所说)一个 curl 脚本,测试 2000 多个 uri。我的脚本示例(隐藏 ips 和域名):
Response code from <currentip> to http://<domain_name>/category/gifts/category1/category2/12142/ = 200
Response code from <currentip> to http://<domain_name>/category/gifts/category1/category2/12143/ = 000
Response code from <currentip> to http://<domain_name>/category/gifts/category1/category2/12144/ = 000
Response code from <currentip> to http://<domain_name>/category/gifts/category1/category2/12145/ = 200
如果您注意到上述内容,您会发现所有 URL 的 domain_name 都是相同的。虽然有些 URL 会抛出 000,但其他 URL 会抛出 200,这显然表明这不是 DNS 问题。
如果我返回并点击出现 000 的单个 URL,我通常会得到 200。在这种情况下,出现 000 的原因是连接问题。
答案3
我认为 000 表示 curl 无法解析 DNS 名称:
$ curl -I -w "%{http_code}" https://zxcvsitename.com curl: (6) Could not resolve host: zxcvsitename.com; Unknown error 000
请注意,它会立即返回此代码。
答案4
我遇到了同样的问题,http 返回 000,但退出代码为 0。原因是负载均衡器返回 200,因为它可以满足请求,但其背后的服务无法满足。