題 curl http_code為000


我有一個shell腳本,用於監視我的實時服務器群集上的加載時間和響應代碼。它每5分鐘運行250次迭代,分佈在10個服務器和6個站點上。它使用curl和-w標誌來返回相關信息,然後由我的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個錯誤的峰值是一個完全不相關的問題,昨晚影響了我的服務器。)


3
2017-11-06 17:05


起源


經過一些搜索後,似乎000表示連接超時。但是,當我直接從命令行運行時看到這個,curl命令幾乎立即退出(比200響應更快),而不是像你期望的那樣掛起。仍在嘗試確定此問題是客戶端還是服務器端。 - Mikkel
這是一個超時連接的樣子: curl -I -w "%{http_code}" https://sitename.com HTTP/1.1 522 Origin Connection Time-out ... - ILIV
我得到了 000 使用a與https服務器通話時 http:// 網址。好像它可能意味著許多事情。 - RobEarl


答案:


響應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。


9
2018-05-24 18:08





我相信000意味著curl無法解析DNS名稱:

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

請注意,它會立即返回此代碼。


1
2018-04-07 16:50



自從我遇到這個問題並發帖以來,我已經改變了五次團隊/工作,但這是一個非常合理的解釋。謝謝! - Mikkel
Arun指出了另一個可能的原因,所以我已經將接受的答案改為我自己的可能性總結,因為我無法接受多個答案。 - Mikkel


捲曲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

如果您注意到上述情況,則所有網址的domain_name都相同。雖然有些網址會丟萬,但其他網址會丟200,這顯然意味著它不是dns問題。

如果我返回並點擊單個URL拋出000,我通常得到200.在這種情況下,000的原因是連接問題。


1
2018-05-23 20:44



它似乎指的是不會導致返回顯式HTTP代碼的任何條件,包括超時,連接被拒絕和DNS解析失敗。我添加了一個答案,總結了這個和其他可能的原因。 - Mikkel