#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-адрес также может быть вторым в списке. Кроме того, пожалуйста, обновите свой вопрос за исключением.