AWS 刚刚添加了对 PROXY protocol 的支持,该协议可以包装TCP流并添加客户端IP地址(由代理服务器看到),以便后端服务器可以访问客户端的IP地址(否则只能看到ELB的IP)。
我知道ELB可以在HTTP(S)模式下运行,在这种模式下,ELB会插入一个X-Forwarded-For
头,但我将我的ELBs运行在TCP模式下,以便我可以通过SPDY提供我的站点。
我如何修改我的node.js应用程序(使用Express)以使用PROXY协议?
AWS 刚刚添加了对 PROXY protocol 的支持,该协议可以包装TCP流并添加客户端IP地址(由代理服务器看到),以便后端服务器可以访问客户端的IP地址(否则只能看到ELB的IP)。
我知道ELB可以在HTTP(S)模式下运行,在这种模式下,ELB会插入一个X-Forwarded-For
头,但我将我的ELBs运行在TCP模式下,以便我可以通过SPDY提供我的站点。
我如何修改我的node.js应用程序(使用Express)以使用PROXY协议?
我创建了一个名为proxywrap的模块,它可以包装node.js Server
并自动从连接的流中删除PROXY协议头,并将socket.remoteAddress
和socket.remotePort
重置为在PROXY头中找到的值。
它与内置的Server
模块(如http
,https
和net
)一起工作,可以作为该模块的即插即用替代品:
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);
它还可以与spdy模块一起使用:
var proxiedSpdy = require('proxywrap').proxy(require('spdy').server);
当然,您需要在负载均衡器上启用PROXY协议(或者您的应用程序所在的任何代理)。