使用nginx和node获取ip用户

时间:2015-06-19 16:38:08

标签: node.js nginx

我有nginx和节点的问题,因为当我想要获取用户节点的ip时,在我的localhost工作正常(不使用nginx)但在我的服务器中不能正常工作。我正在研究并看到节点no是第一个接收ip的节点,是nginx并且在nginx之后将请求发送到节点。然后节点接收的ip是我的服务器而不是用户的ip。查看配置服务器nignx:

location / {
        proxy_pass https://fotogena.co:8000;  <-nginx send req to node
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_connect_timeout   1000;
        proxy_send_timeout      1500;
        proxy_read_timeout      2000;
}

我使用“req.connection.remoteAddress”来了解用户的ip,控制台显示我的服务器的IP。有人知道怎么解决这个问题吗?

谢谢:D

----------- -------- 2016年4月20日

我可以用nginx文件设置

上的这一行解决问题
proxy_set_header X-Real-IP $remote_addr;

和node.js

req.headers['x-forwarded-for']

2 个答案:

答案 0 :(得分:13)

您可以使用以下设置配置NGINX以传递客户端的IP地址:

location / {
        proxy_pass https://fotogena.co:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;  # This line.
        proxy_connect_timeout   1000;
        proxy_send_timeout      1500;
        proxy_read_timeout      2000;
}

然后,您可以使用X-Real-IP中的HTTP标头req.headers["X-Real-IP"]

答案 1 :(得分:1)

proxy_set_header X-Real-IP $remote_addr;对我没有帮助

在代理后面运行Express应用时,必须将应用变量信任代理设置为true。 Express还提供了其他一些信任代理值,您可以在其文档中进行查看,但就目前而言,我们不必介意它们。

事不宜迟,以下是向您的应用程序显示访问者IP地址的步骤:

  1. app.set('trust proxy', true)在您的Express应用中。
  2. 在Nginx配置中为您的服务器块添加proxy_set_header X-Forwarded-For $remote_addr
  3. 您现在可以从 req.header('x-forwarded-for')req.connection.remoteAddress;

类似于下面的Nginx配置

location /  {
            proxy_pass    http://localhost:3001;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;  # this line
            proxy_cache_bypass $http_upgrade; 
    }