AWS 刚刚为 ELB 添加了对PROXY 协议的支持,该协议包装 TCP 流并添加客户端 IP 地址(如代理所见),以便后端服务器可以访问客户端的 IP(否则它只会看到 ELB 的 IP) .
我知道 ELB 可以在 HTTP(S) 模式下运行,其中 ELB 插入X-Forwarded-For
标头,但我在 TCP 模式下运行我的 ELB,以便我可以通过SPDY为我的站点提供服务。
如何修改我的 node.js 应用程序(使用 Express)以使用 PROXY 协议?
AWS 刚刚为 ELB 添加了对PROXY 协议的支持,该协议包装 TCP 流并添加客户端 IP 地址(如代理所见),以便后端服务器可以访问客户端的 IP(否则它只会看到 ELB 的 IP) .
我知道 ELB 可以在 HTTP(S) 模式下运行,其中 ELB 插入X-Forwarded-For
标头,但我在 TCP 模式下运行我的 ELB,以便我可以通过SPDY为我的站点提供服务。
如何修改我的 node.js 应用程序(使用 Express)以使用 PROXY 协议?
我制作了一个名为 proxywrap 的模块,它包装 node.jsServer
并自动从连接的流中剥离 PROXY 协议头,并将其重置为在 PROXY 头socket.remoteAddress
中socket.remotePort
找到的值。
它与内置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);
当然,您必须在您的 ELB (或您的应用程序背后的任何代理)上启用 PROXY 协议。