2013-02-11 69 views
11

我偶爾會得到這個錯誤時,我的服務器(稱爲服務器A),使在我的服務器的另一個請求的資源(所有的IT服務器B):的Python - ConnectionError:最大重試次數超過

ConnectionError: HTTPConnectionPool(host='some_ip', port=some_port): Max retries exceeded with url: /some_url/ (Caused by : [Errno 111] Connection refused)

該例外的信息是
message : None: Max retries exceeded with url: /some_url/ (Caused by redirect)
這是我包括的,因爲它包含了額外的信息(caused by redirect)

正如我所說,我控制這個請求中涉及的兩臺服務器,所以我可以對其中一個和/或兩個進行更改。此外,錯誤似乎是間歇性的,因爲它不會每次都發生。

潛在的相關信息 - 服務器A是運行apache的Python服務器,服務器B是NodeJS服務器。我不完全是一個Web服務器嚮導,除此之外,我不確定哪些信息是相關的。

有沒有人知道這個錯誤究竟意味着什麼,或者如何去調查修復?或者,有沒有人知道哪個服務器可能成爲問題,提出請求的服務器或收到請求的服務器?

編輯:我們對外部網絡資源的調用也出現錯誤。

+0

你能否提供更多的細節有關服務器A,像什麼庫要導入。 – user568109 2013-02-11 19:55:03

+0

我正在使用Python請求庫來提出請求 – 2013-02-11 20:12:16

+0

很難說,但似乎您已將Apache配置爲將一個URL重定向到另一個** **轉發到nodejs的前端。我認爲這裏的apache配置是重要的一部分數據。 – slezica 2013-02-11 20:26:34

回答

-1

這看起來像是Node側的重定向循環。

您提到服務器B是節點服務器,如果您錯誤地設置了路由,可能會無意中創建重定向循環。例如,如果您使用的是服務器B快遞 - 節點服務器,你可能有兩條路線,並假設你保持你的路線邏輯獨立的模塊:

var routes = require(__dirname + '/routes/router')(app); 
//... express setup stuff like app.use & app.configure 
app.post('/apicall1', routes.apicall1); 
app.post('/apicall2', routes.apicall2); 

然後你的路由/ router.js看起來像:

module.exports = Routes; 

function Routes(app){ 
    var self = this; 
    if (!(self instanceof Routes)) return new Routes(app); 
    //... do stuff with app if you like 
} 

Routes.prototype.apicall1 = function(req, res){ 
    res.redirect('/apicall2'); 
} 
Routes.prototype.apicall2 = function(req, res){ 
    res.redirect('/apicall1'); 
} 

這個例子是顯而易見的,但你可能有一個重定向循環隱藏在其中的一些路線的一堆條件。我將從邊緣案例開始,比如所討論的路由條件末尾會發生什麼情況,例如調用沒有正確的參數和什麼是異常行爲,默認行爲是什麼?

順便說一句,你可以使用類似的節點驗證(https://github.com/chriso/node-validator)以幫助確定和處理不正確的請求或交參數

// Inside router/routes.js: 
var check = require('validator').check; 

function Routes(app){ /* setup stuff */ } 

Routes.prototype.apicall1 = function(req, res){ 
    try{ 
     check(req.params.csrftoken, 'Invalid CSRF').len(6,255); 
     // Handle it here, invoke appropriate business logic or model, 
     // or redirect, but be careful! res.redirect('/secure/apicall2'); 
    }catch(e){ 
     //Here you could Log the error, but don't accidentally create a redirect loop 
     // send appropriate response instead 
     res.send(401); 
    } 
} 

爲了幫助確定它是否是一個重定向循環,你可以做一個有幾件事情,你可以使用curl使用相同的post參數來訪問url(假設它是一個post,否則你可以使用chrome,如果它發現重定向循環,它會在控制檯中出錯),或者你可以寫在有問題的路由中標出節點服務器或syslog。

希望有所幫助,你提到的好東西是「重定向引起的」部分,那就是我認爲的問題。

上面的示例情況使用express來描述情況,但是當然,如​​果您根本沒有使用任何框架或庫,則只需使用連接,其他框架或甚至您自己的處理程序代碼就可以存在問題。無論哪種方式,我都會習慣於進行良好的參數檢查,並且始終測試您的邊緣情況,而過去我一直匆忙的時候,我已經將自己陷入了這個問題。

+0

上述錯誤是ECONNREFUSED。這是一個IP問題,表明服務器進程沒有運行,並且與HTTP重定向沒有任何關係。 – 2014-01-24 11:52:04

2

您在「some_ip」和端口上得到CONN拒絕。這可能是由於 - 沒有服務器實際監聽該端口/ IP組合 - 發送Conn Refused的防火牆設置(不太可能是原因!) - 第三 - 錯誤配置(更有可能)或繁忙的服務器,無法處理請求。

我相信當 - 服務器A試圖連接到服務器B,你會得到這個錯誤。 (假設它是Linux和/或一些unix衍生產品)netstat -ln -tcp在服務器上顯示的是什麼? (man netstat來理解標誌 - 我們在這裏做的是 - 試圖找出哪個程序正在哪個端口上監聽)。如果這確實顯示你的服務器B監聽 - iptables -L -n來顯示防火牆規則。如果沒有什麼問題 - 這很可能是偵聽隊列的錯誤配置。 (http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/023/2333/2333s2.html)或谷歌收聽積壓。

這很可能是您的服務器B上的一個錯誤的配置問題。(注意:上面提到的一個重定向循環 - 沒有正確處理可能最終導致服務器忙碌!所以可能的解決方案也可以解決您的問題)

+0

繁忙的服務器不會發送ECONNREFUSED,除非由於負載太高而導致服務器進程崩潰。不過,可能是關於每秒連接數過多的防火牆規則。我會調查有問題的服務器上的詳細程度。沒有更多的挖掘,不能幫助更多。 – 2014-01-24 11:57:36

相關問題