2013-07-31 11 views
7

AWS just added support to ELB cho PROXY protocol, bao gồm các luồng TCP và thêm địa chỉ IP của máy khách (như được proxy nhìn thấy) để máy chủ phụ có quyền truy cập vào IP của khách hàng (vì nếu không sẽ chỉ thấy IP của ELB).Làm cách nào để sử dụng giao thức PROXY để nhận địa chỉ IP thực của khách hàng?

Tôi biết rằng ELB có thể chạy ở chế độ HTTP (S), trong đó ELB chèn tiêu đề X-Forwarded-For, nhưng tôi chạy ELB của mình ở chế độ TCP để tôi có thể phục vụ trang web của mình qua SPDY.

Làm cách nào để sửa đổi ứng dụng node.js của tôi (sử dụng Express) để sử dụng giao thức PROXY?

Trả lời

12

I made a module caled proxywrap bao bọc node.js Server s và tự động tách tiêu đề giao thức PROXY khỏi luồng kết nối và đặt lại socket.remoteAddresssocket.remotePort thành giá trị được tìm thấy trong tiêu đề PROXY.

Nó hoạt động với built-in Server module (như http, https, và net) như một sự thay thế thả-in cho các mô-đun:

var http = require('http') 
    , proxiedHttp = require('proxywrap').proxy(http) 
    , express = require('express') 
    , app = express() 
    , srv = proxiedHttp.createServer(app); // instead of http.createServer(app) 

app.get('/', function(req, res) { 
    res.send('IP = ' + req.connection.remoteAddress + ':' + req.connection.remotePort); 
}); 

srv.listen(80); 

Nó cũng làm việc với các spdy module:

var proxiedSpdy = require('proxywrap').proxy(require('spdy').server); 

Tất nhiên, bạn sẽ phải enable the PROXY protocol on your ELB (hoặc bất kỳ proxy nào mà ứng dụng của bạn ở đằng sau).

+0

Nó có hoạt động với socket.io sau ELB không? – ngzhongcai

+1

Có. Điều này làm việc ở mức thấp; nó không quan tâm điều gì xảy ra sau tiêu đề PROXY. – josh3736