在Amazon的ELB后面带有node-js的远程IP地址

在弹性负载平衡器(elb)后面的实例存储亚马逊机器上有一个节点应用程序。 但是,远程IP地址似乎总是相同的。 我用这个代码来获取客户端的IP地址(通过connect / express):

req.socket.remoteAddress 

我没有从节点文档中得到任何其他信息。 任何提示?

       

网上收集的解决方案 "在Amazon的ELB后面带有node-js的远程IP地址"

如果您使用快递,请使用以下解决scheme:
根据文档 ,您可以为您的快速实例启用trust proxy ,然后req.ip将填充正确的IP地址。

通过启用通过app.enable('trust proxy')的“信任代理”设置,Express将知道它位于代理之后,并且X-Forwarded- *标头字段可能是可信的,否则可能容易被欺骗。

启用此设置有几个微妙的影响。 第一个是X-Forwarded-Proto可能被反向代理设置为告诉应用程序,它是https或简单的http。 该值由req.protocol反映。

第二个变化是req.ip和req.ips值将被填入X-Forwarded-For的地址列表。

这是一个例子:

 var app = express(); app.enable('trust proxy'); // ... app.use(function(req, res, next) { console.log('client ip address:', req.ip); return next(); }); 

答案为我工作,谢谢。 但是你可以试试:

 var ip_address = null; if(req.headers['x-forwarded-for']){ ip_address = req.headers['x-forwarded-for']; } else { ip_address = req.connection.remoteAddress; } sys.puts( ip_address ); 

您接收到ELB实例的IP,您需要从头文件获取x-forwarded-for的值。 由于我不是node.js专家,我在http://forum.webfaction.com/viewtopic.php?id=4500上find了这个代码

例:

 var http = require( 'http' ), sys = require( 'sys' ); http.createServer( function( req, res ) { var ip_address = null; try { ip_address = req.headers['x-forwarded-for']; } catch ( error ) { ip_address = req.connection.remoteAddress; } sys.puts( ip_address ); } );