0

我使用节点作为后端服务器,使用 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吗?

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

4

1 回答 1

0

这应该为你做。

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 配置中犯了一些错误,修复了它。

于 2021-06-23T08:12:24.933 回答