2013-02-11 27 views
11

Tôi thỉnh thoảng nhận được lỗi này khi máy chủ của tôi (gọi nó là máy chủ A) gửi yêu cầu tới một tài nguyên trên một một trong những máy chủ của tôi (tất cả nó Server B):Python - ConnectionError: lần thử lại Max vượt

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

Thông báo trong trường hợp ngoại lệ là
message : None: Max retries exceeded with url: /some_url/ (Caused by redirect)
mà tôi đưa vào vì nó có thêm thông tin bổ sung (caused by redirect).

Như tôi đã nói, tôi kiểm soát cả hai máy chủ có liên quan trong yêu cầu này, vì vậy tôi có thể thực hiện thay đổi cho một trong hai và/hoặc cả hai. Ngoài ra, các lỗi xuất hiện để được liên tục, trong đó nó không xảy ra mỗi lần.

Thông tin liên quan có khả năng - Máy chủ A là máy chủ Python đang chạy apache và Máy chủ B là máy chủ NodeJS. Tôi không chính xác là một trình hướng dẫn máy chủ web, do đó, ngoài ra, tôi không chắc chắn chính xác thông tin nào sẽ có liên quan.

Có ai biết chính xác lỗi này có nghĩa là gì không hoặc cách tìm hiểu cách khắc phục sự cố? Hoặc, có ai biết máy chủ nào có thể là vấn đề, máy chủ đưa ra yêu cầu hoặc người nhận được yêu cầu đó không?

Chỉnh sửa: Lỗi cũng đã bắt đầu xảy ra với các cuộc gọi của chúng tôi tới các tài nguyên web bên ngoài.

+0

Bạn có thể cung cấp thêm chi tiết về máy chủ A, như thư viện bạn đang nhập hay không. – user568109

+0

Tôi đang sử dụng thư viện Yêu cầu Python để thực hiện yêu cầu –

+0

Khó mà nói, nhưng có vẻ như bạn đã cấu hình Apache tuyến trước để chuyển hướng URL đến URL khác ** KHÔNG ĐƯỢC CHUYỂN TIẾP ** đến nút. Tôi nghĩ cấu hình apache ở đây là phần dữ liệu quan trọng. – slezica

Trả lời

-1

Điều này trông giống như vòng lặp chuyển hướng ở bên Node.

Bạn đề cập đến máy chủ B là máy chủ nút, bạn có thể vô tình tạo vòng chuyển hướng nếu bạn thiết lập các tuyến không chính xác. Ví dụ, nếu bạn đang sử dụng tốc hành trên máy chủ B - máy chủ Node, bạn có thể có hai tuyến đường, và giả sử bạn giữ logic tuyến đường của bạn trong một mô-đun riêng biệt:

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); 

Sau đó, tuyến đường của bạn/router.js có thể trông như:

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'); 
} 

Ví dụ đó là hiển nhiên, nhưng bạn có thể có vòng chuyển hướng ẩn trong một loạt điều kiện trong một số tuyến đường đó. Tôi bắt đầu với các trường hợp cạnh, giống như những gì xảy ra ở cuối các điều kiện trong các tuyến được đề cập, hành vi mặc định là gì nếu cuộc gọi ví dụ không có tham số đúng và hành vi ngoại lệ là gì?

Là một sang một bên, bạn có thể sử dụng một cái gì đó giống như nút-validator (https://github.com/chriso/node-validator) để giúp xác định và xử lý các yêu cầu hoặc bưu điện thông số không chính xác

// 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); 
    } 
} 

Để giúp xác định nếu nó là một vòng lặp chuyển hướng bạn có thể làm một trong một số thứ, bạn có thể sử dụng curl để nhấn url với cùng thông số bài đăng (giả sử đó là bài đăng, nếu không bạn chỉ có thể sử dụng chrome, nó sẽ lỗi trong bảng điều khiển nếu nó nhận thấy vòng lặp chuyển hướng) hoặc bạn có thể viết stdout trên máy chủ Node hoặc syslog bên trong (các) tuyến vi phạm.

Hy vọng điều đó sẽ giúp ích cho bạn, điều tốt bạn đã đề cập đến phần "gây ra bởi chuyển hướng", đó là tôi nghĩ rằng vấn đề.

Tình huống ví dụ ở trên sử dụng biểu thức để mô tả tình huống, nhưng tất nhiên vấn đề có thể tồn tại chỉ bằng cách kết nối, các khung công tác khác hoặc thậm chí là mã xử lý của riêng bạn nếu bạn không sử dụng bất kỳ khung công tác hoặc thư viện nào.Dù bằng cách nào, tôi sẽ làm cho nó trở thành thói quen để kiểm tra thông số tốt và luôn kiểm tra các trường hợp cạnh của bạn, tôi đã tự đặt mình vào vấn đề này một cách chính xác khi tôi đã vội vàng trong quá khứ.

+0

Lỗi trên là ECONNREFUSED. Đây là một vấn đề IP, chỉ ra rằng quá trình máy chủ không chạy, và không có gì để làm với chuyển hướng HTTP. –

2

Bạn đang nhận CONN bị từ chối trên cổng "some_ip" và cổng. Điều này có thể gây ra bởi - Không máy chủ nào thực sự lắng nghe sự kết hợp cổng/IP đó - Cài đặt tường lửa gửi Conn bị từ chối (ít có khả năng gây ra!) - Thứ ba - máy chủ bị định cấu hình sai (nhiều khả năng) hoặc bận, không thể xử lý yêu cầu.

Tôi tin Khi nào - máy chủ A đang cố gắng kết nối với máy chủ B bạn nhận được lỗi đó. (Giả sử nó là Linux và/hoặc một số dẫn xuất unix) netstat -ln -tcp hiển thị trên máy chủ là gì? (người đàn ông netstat để hiểu những lá cờ - những gì chúng tôi đang làm ở đây là - cố gắng tìm tất cả các chương trình đang lắng nghe trên cổng nào). Nếu điều đó thực sự cho thấy máy chủ của bạn B nghe - iptables -L -n để hiển thị các quy tắc tường lửa. Nếu không có gì sai - đó là một cấu hình xấu của hàng đợi nghe nhất có lẽ. (http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/023/2333/2333s2.html) hoặc google để nghe backlog. Điều này rất có thể là một vấn đề cấu hình xấu trên máy chủ của bạn B. (Lưu ý: một vòng chuyển hướng như ai đó đã đề cập ở trên - không được xử lý đúng cách có thể chỉ làm cho máy chủ bận rộn!), Có thể giải quyết được vấn đề của bạn)

+0

Máy chủ bận không gửi ECONNREFUSED, trừ khi quá trình máy chủ bị treo do tải quá cao. Tuy nhiên, có thể là quy tắc tường lửa về quá nhiều kết nối/giây. Tôi muốn tăng độ dài trên máy chủ được đề cập. Không thể giúp nhiều hơn mà không cần đào bới nhiều hơn nữa. –

Các vấn đề liên quan