題 捲曲響應掛起


我在虛擬框中設置了一個站點。我可以通過我的機器上的瀏覽器輕鬆訪問它,但是我無法通過CURL訪問它,而SSH則進入了該框。

當我嘗試時,curl會在顯示響應並退出之前掛起。

這是我運行的: curl -vvv site1.dev/

這是它給出的輸出:

* Hostname was NOT found in DNS cache
*   Trying 192.168.10.10...
* Connected to site1.dev (192.168.10.10) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: site1.dev
> Accept: */*
> 
< HTTP/1.1 200 OK
* Server nginx/1.9.7 is not blacklisted
< Server: nginx/1.9.7
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Cache-Control: no-cache
< Date: Fri, 08 Apr 2016 16:47:30 GMT
< 
* Connection #0 to host site1.dev left intact
hi

請求部分立即發送,但響應掛起幾秒鐘(看起來像120ish),然後curl退出該消息: * Connection #0 to host site1.dev left intact

接下來是適當的回應主體“嗨”。

我有點失落 - 任何指針都會受到讚賞。

編輯4月11日: 我試過wget並看到類似的結果(響應掛起)。我懷疑這是一個網絡配置問題。

如果它是相關的,這裡是虛擬框的一些端口配置。

==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 80 => 8000 (adapter 1)
    default: 443 => 44300 (adapter 1)
    default: 3306 => 33060 (adapter 1)
    default: 5432 => 54320 (adapter 1)
    default: 22 => 2222 (adapter 1)

編輯4月12日:

所以...我決定摧毀這個流浪盒並重新開始......這樣就解決了這個問題。

我懷疑在過去的幾個月裡我改變/破壞了一些東西。重新開始,使用香草盒設置,已經糾正了這個問題。


3
2018-04-08 18:44


起源


你有沒有任何有效的重定向? site1.dev的網絡服務器? - Alex
你可以試試 curl -L site1.dev 讓curl跟隨重定向。 - Alex
謝謝@Alex,該路徑無需重定向即可解析。它最終確實給出了預期的響應......我只是不明白為什麼它在這樣做之前就會掛起......以及“Connection#0 ...”消息。 - Todd
鑑於HTTP響應顯示服務器正在以塊的形式發送響應主體(請參閱 Transfer-Encoding: chunked),我想知道服務器是否只是永遠不會發送終止塊,和 curl 只是“掛起”,等待它...... - Castaglia


答案:


也許nginx被配置為對傳入請求進行ip解析,並且在實際應答請求之前花費時間來解析傳入連接。

但是,有幾個指針,你需要檢查192.168.10.10上的以下內容。

  1. 在/etc/resolv.conf中驗證名稱服務器是否正確
  2. 如果#1 resolv設置對於主要和輔助名稱服務器是正確的,請驗證192.168.10.10是否能夠解析主機。 (簡單的nslookup到google.com是一個很好的測試,如果發生超時,那麼這可能是問題的一部分)
  3. 確保您的nginx服務器能夠通過防火牆從外部或內部查詢名稱服務器(端口53 tcp / udp)
  4. 在nginx配置選項中查找潛在的解析器設置,或者在適用的情況下設置解決方案超時設置並重新啟動nginx。
  5. 如果仍有問題,請嘗試在192.168.10.10上的/ etc / hosts中添加傳入請求連接的主機。

讓我知道這對你有什麼用..

謝謝發帖。


1
2018-04-11 20:25



1. resolv.conf中的名稱服務器是10.0.2.3。 2. google.com上的nslookup很快,看起來不錯。對不起,不知道怎麼做。建議? - Todd
如果#2是你的nginx服務器,那麼#3應該沒問題。我在下一步檢查#4。 - NotAdmin Dave


備註:您可以使用獲取更詳細的計時信息 time curl -vvv site1.dev/

我注意到服務器回复包含 Connection: keep-alive, 這意味著服務器配置為使用 HTTP保持活躍 :

HTTP持久連接,也稱為HTTP keep-alive或HTTP   連接重用,是使用單個TCP連接發送的想法   並且接收多個HTTP請求/響應,而不是打開一個   每個請求/響應對的新連接。較新的   HTTP / 2協議使用相同的想法並進一步允許   多個並發請求/響應將在一個多路復用   連接。

因此,服務器保持連接打開 提供更多要求。這樣,瀏覽器就可以使用相同的TCP連接 接收HTML頁面並立即請求鏈接的圖像 需要建立新的連接。

curl.1手冊頁 指定參數 --no-keepalive :

禁用在TCP連接上使用keepalive消息,如下所示   默認curl啟用它們。

您也可以類似地參數nginx服務器模塊ngx_http_core_module keepalive_timeout :

Syntax:   keepalive_timeout timeout [header_timeout];
Default:  keepalive_timeout 75s;
Context:  http, server, location

第一個參數設置保持活動客戶端的超時   連接將在服務器端保持打開狀態。零值禁用   保持活躍的客戶端連接。可選的第二個參數設置a   “Keep-Alive:timeout = time”響應頭字段中的值。二   參數可能不同。

Mozilla識別“Keep-Alive:timeout = time”標題字段   和Konqueror。 MSIE自己關閉了保持活躍的連接   60秒


1
2018-04-12 06:42



謝謝(你的)信息。使用--no-keepalive運行curl會得到相同的結果。隨時間運行命令提供以下信息: - real 2m0.105s - user 0m0.008s - sys 0m0.004s。 - Todd
還嘗試使用keepalive_timeout = 0禁用服務器中的keepalive。 - harrymc