由于 nginx 反向代理,无法获取用户 ip

Posted

技术标签:

【中文标题】由于 nginx 反向代理,无法获取用户 ip【英文标题】:Not getting the user ip due to nginx reverse proxy 【发布时间】:2021-09-06 18:41:47 【问题描述】:

我使用节点作为后端服务器,使用 nginx 作为反向代理服务器。

我想将用户 IP 地址存储在我的数据库中。为此,我在博客和论坛上搜索,发现 public-ip npm 模块

之后我在服务器上测试,发现这个模块会返回我的EC2实例公共IP而不是用户公共IP。

在网上找到这个问题后,再次发现这可能是由于使用了反向代理。

为此,我需要在我已经做过的位置块下添加此代码。

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

并且需要在我的快递服务器上添加这段代码

app.set('trust proxy', true)

并调用它来获取 IP

req.header('x-forwarded-for') or req.connection.remoteAddress

更新 这是我的 nginx 配置

location / 
            include /etc/nginx/proxy_params;
            proxy_pass http://127.0.0.1:3001;
        
My proxy_params is
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_redirect off;
proxy_cache_bypass $http_upgrade;

我需要询问如何在某些函数或任何 API 调用中使用它。它肯定会返回我的客户端 IP 吗?

非常感谢任何帮助或建议。 提前致谢。

【问题讨论】:

请向我们展示您的 nginx 配置。 @Marc 我已经更新了这个问题 【参考方案1】:

这应该为你做。

nginx 配置

server 
    listen 80 default_server;
    listen [::]:80;

    server_name nodeapp;

    location / 
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_redirect off;
        proxy_cache_bypass $http_upgrade;
        proxy_pass http://127.0.0.1:8000;
    

快递应用

var express = require('express');
var app = express();

app.set('trust proxy', true);

app.get('/', (req, res) => 
    let ip = req.ip;
    if (ip.substr(0, 7) == '::ffff:') 
        ip = ip.substr(7);
    
    console.log(ip);
    res.end(ip);
);

app.listen(8000, console.log('listening on 8000'));

编辑: 我在 nginx 配置中犯了一些错误,已修复它。

【讨论】:

如果是这样,那么我应该使用 request-ip 模块还是应该从我的包中删除它 其实我更新了答案,所以检查一下。 所以这里没有使用public-ip模块。所以我可以从我的服务器上卸载? 我累了,它在开发中返回 127.0.0.1。未经生产测试。我有一个问题,它就像我需要启动 nginx 服务器的依赖项,因为如果我关闭 nginx 服务器,则会收到错误消息。 我想尝试将XFF 标头记录到控制台,因为这至少对我有用。 Ip 也可能是列表中的第二个。另外,请更新您的问题,但有例外。

以上是关于由于 nginx 反向代理,无法获取用户 ip的主要内容,如果未能解决你的问题,请参考以下文章

nginx反向代理如何获取真实IP?

nginx 在多层代理下获取客户端IP

经过反向代理Server如何优雅的获取用户IP

nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP

nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP

Nginx反向代理下IIS获取真实IP