Не удается получить IP-адрес пользователя из-за обратного прокси-сервера nginx

#node.js #nginx #ip #clientip

Вопрос:

Я использую узел в качестве внутреннего сервера и использую nginx в качестве обратного прокси-сервера.

Я хочу сохранить IP-адрес пользователя в своей базе данных. Для этого я поискал в блогах и на форуме и нашел модуль npm public-ip

После этого я протестировал на сервере и обнаружил, что этот модуль вернет мой общедоступный IP-адрес экземпляра EC2 вместо общедоступного 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-адрес клиента?

Любая помощь или предложение действительно приветствуются. Заранее спасибо.

Комментарии:

1. Пожалуйста, покажите нам вашу конфигурацию nginx.

2. @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, исправил ее.

Комментарии:

1. ЕСЛИ это так, то мне нужно использовать модуль request-ip или я должен удалить его из своего пакета

2. На самом деле я обновил ответ, так что проверьте его.

3. Таким образом, это означает, что модуль public-ip здесь не используется. Чтобы я мог удалить программу со своего сервера?

4. Я устал, и он возвращается на 127.0.0.1 при разработке. Не тестировался на производстве. У меня есть вопрос, который похож на зависимость, необходимую мне для запуска сервера nginx, потому что, если я закрою сервер nginx, я получу ошибку.

5. Я думаю, попробуйте войти XFF в заголовок консоли, потому что это сработало, по крайней мере, для меня. Ip-адрес также может быть вторым в списке. Кроме того, пожалуйста, обновите свой вопрос за исключением.