curl http_code为000


5

我有一个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”。当发生这种情况时,尽管分布在多次迭代中,但它似乎一次发生多次:

Error code graph

我正在努力解决的问题是,如果这是一个客户端问题,这会导致我的结果出现偏差,或者它是否真的表明服务器端问题会影响整个集群。 000表示连接被丢弃了吗?对应于具有该响应代码的curl迭代的数据库条目对于time_total值返回“0.000”。我发现curl返回代码000的所有搜索结果都与HTTPS不受支持有关,但我的所有测试URL都是HTTP。

(500个错误的峰值是一个完全不相关的问题,昨晚影响了我的服务器。)


2
经过一些搜索后,似乎000表示连接超时。但是,当我直接从命令行运行时看到这一点时,curl命令几乎立即退出(比200响应更快),而不是像你期望的那样挂起。仍在尝试确定此问题是客户端还是服务器端。
Mikkel

这是一个超时连接的样子: curl -I -w "%{http_code}" https://sitename.com HTTP/1.1 522 Origin Connection Time-out ...
ILIV

1
我得到了 000 使用a与https服务器通话时 http:// 网址。好像它可能意味着许多事情。
RobEarl

Answers:


11

响应000表示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

(正如阿伦所回答的那样)

服务器由于某种原因实际返回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。


1

我相信000意味着curl无法解析DNS名称:

$ curl -I -w "%{http_code}" https://zxcvsitename.com curl: (6) Could not resolve host: zxcvsitename.com; Unknown error 000

请注意,它会立即返回此代码。


自从我遇到这个问题并发帖以来,我已经改变了五次团队/工作,但这是一个非常合理的解释。谢谢!
Mikkel

1
Arun指出了另一个可能的原因,所以我已经将接受的答案改为我自己的可能性总结,因为我无法接受多个答案。
Mikkel

1

卷曲000表示超时:   - 超时可能是防火墙阻止您的请求外出的结果。   - 超时可能是连接丢失的结果。   - 超时也可能是因为未能解析dns名称。

我与curl进行了广泛的合作,并密切关注所有响应代码 - 000就是其中之一。在我的情况下,当满足上述三个条件中的任何一个时,我收到了000响应代码。

事实上,我正在运行(正如我所说)一个测试2000+ uris的卷曲脚本。 我的脚本示例(隐藏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会丢万,但有些会丢掉200,这显然意味着它不是dns问题。

如果我返回并点击单个URL抛出000,我通常得到200.在这种情况下,000的原因是连接问题。


它似乎指的是不会导致返回显式HTTP代码的任何条件,包括超时,连接被拒绝和DNS解析失败。我添加了一个答案,总结了这个和其他可能的原因。
Mikkel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.