✨ Обновлена документация по настройке NGINX и улучшена функция получения IP-адреса клиента
- Изменены разделы документации для настройки NGINX Proxy Manager, добавлены инструкции для приложений, работающих на хосте. - Расширена логика получения IP-адреса клиента с учетом дополнительных заголовков и приоритетов, улучшая обработку запросов через прокси. - Добавлены альтернативные способы подключения для случаев, когда `host.docker.internal` не работает.
This commit is contained in:
parent
0cb0b27f20
commit
ad5a19d27e
@ -58,9 +58,57 @@ location / {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Настройка Docker Compose (если используется)
|
### 2. Настройка для приложения на хосте (не в Docker)
|
||||||
|
|
||||||
Если ваш nginx Proxy Manager работает в Docker, убедитесь, что в docker-compose.yml правильно настроена сеть:
|
Если ваш nginx Proxy Manager работает в Docker, а приложение - на хосте, используйте `host.docker.internal` для подключения:
|
||||||
|
|
||||||
|
#### В настройках прокси-хоста в nginx Proxy Manager:
|
||||||
|
|
||||||
|
**Forward Hostname/IP:** `host.docker.internal`
|
||||||
|
**Forward Port:** `3000` (или ваш порт)
|
||||||
|
|
||||||
|
#### Или в Custom Nginx Configuration:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
location / {
|
||||||
|
proxy_pass http://host.docker.internal:3000;
|
||||||
|
|
||||||
|
# Передача реального IP-адреса
|
||||||
|
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_set_header X-Forwarded-Host $host;
|
||||||
|
proxy_set_header X-Forwarded-Port $server_port;
|
||||||
|
proxy_set_header X-Client-IP $remote_addr;
|
||||||
|
|
||||||
|
# Дополнительные настройки
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Forwarded-Server $host;
|
||||||
|
|
||||||
|
# Таймауты
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 60s;
|
||||||
|
proxy_read_timeout 60s;
|
||||||
|
|
||||||
|
# Буферизация
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_request_buffering off;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Альтернативный способ (если host.docker.internal не работает):
|
||||||
|
|
||||||
|
1. Найдите IP-адрес хоста в Docker сети:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker network inspect bridge | grep Gateway
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Используйте этот IP-адрес вместо `host.docker.internal`
|
||||||
|
|
||||||
|
### 3. Настройка Docker Compose (если приложение тоже в Docker)
|
||||||
|
|
||||||
|
Если оба сервиса в Docker, используйте общую сеть:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
version: "3.8"
|
version: "3.8"
|
||||||
@ -91,7 +139,7 @@ networks:
|
|||||||
driver: bridge
|
driver: bridge
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Проверка работы
|
### 4. Проверка работы
|
||||||
|
|
||||||
После настройки используйте тестовый эндпоинт для проверки:
|
После настройки используйте тестовый эндпоинт для проверки:
|
||||||
|
|
||||||
@ -101,7 +149,7 @@ curl -H "X-Forwarded-For: 192.168.1.100" https://your-domain.com/api/debug/ip
|
|||||||
|
|
||||||
Или откройте в браузере: `https://your-domain.com/api/debug/ip`
|
Или откройте в браузере: `https://your-domain.com/api/debug/ip`
|
||||||
|
|
||||||
### 4. Ожидаемый результат
|
### 5. Ожидаемый результат
|
||||||
|
|
||||||
В ответе должно быть:
|
В ответе должно быть:
|
||||||
|
|
||||||
@ -116,7 +164,7 @@ curl -H "X-Forwarded-For: 192.168.1.100" https://your-domain.com/api/debug/ip
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5. Отладка
|
### 6. Отладка
|
||||||
|
|
||||||
Если IP-адрес все еще неправильный:
|
Если IP-адрес все еще неправильный:
|
||||||
|
|
||||||
@ -124,8 +172,9 @@ curl -H "X-Forwarded-For: 192.168.1.100" https://your-domain.com/api/debug/ip
|
|||||||
2. Убедитесь, что заголовки передаются (используйте `/api/debug/ip`)
|
2. Убедитесь, что заголовки передаются (используйте `/api/debug/ip`)
|
||||||
3. Проверьте настройки сети Docker
|
3. Проверьте настройки сети Docker
|
||||||
4. Убедитесь, что nginx Proxy Manager не находится за дополнительными прокси
|
4. Убедитесь, что nginx Proxy Manager не находится за дополнительными прокси
|
||||||
|
5. Проверьте, что ваше приложение слушает на правильном порту и адресе
|
||||||
|
|
||||||
### 6. Дополнительные настройки
|
### 7. Дополнительные настройки
|
||||||
|
|
||||||
#### Для Cloudflare
|
#### Для Cloudflare
|
||||||
|
|
||||||
@ -142,8 +191,63 @@ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|||||||
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
|
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Специальные настройки для приложений на хосте
|
||||||
|
|
||||||
|
### Проверка доступности приложения из Docker
|
||||||
|
|
||||||
|
Убедитесь, что ваше приложение доступно из Docker контейнера:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверьте, что приложение слушает на всех интерфейсах
|
||||||
|
netstat -tlnp | grep :3000
|
||||||
|
|
||||||
|
# Должно показать что-то вроде:
|
||||||
|
# tcp6 0 0 :::3000 :::* LISTEN 1234/node
|
||||||
|
# или
|
||||||
|
# tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 1234/node
|
||||||
|
```
|
||||||
|
|
||||||
|
**Важно:** Если вы видите `127.0.0.1:3000` или `::1:3000`, то приложение недоступно из Docker контейнера.
|
||||||
|
|
||||||
|
Если приложение слушает только на `127.0.0.1:3000`, измените настройки в `server.js`:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Вместо
|
||||||
|
app.listen(PORT, () => {
|
||||||
|
console.log(`Сервер запущен на порту ${PORT}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Используйте
|
||||||
|
app.listen(PORT, "0.0.0.0", () => {
|
||||||
|
console.log(`Сервер запущен на порту ${PORT}`);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Альтернативные способы подключения
|
||||||
|
|
||||||
|
Если `host.docker.internal` не работает:
|
||||||
|
|
||||||
|
1. **Используйте IP-адрес хоста:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Найдите IP-адрес хоста
|
||||||
|
ip route show default | awk '/default/ {print $3}'
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Используйте режим host network для nginx Proxy Manager:**
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
nginx-proxy-manager:
|
||||||
|
image: jc21/nginx-proxy-manager:latest
|
||||||
|
network_mode: host
|
||||||
|
volumes:
|
||||||
|
- ./data:/data
|
||||||
|
- ./letsencrypt:/etc/letsencrypt
|
||||||
|
```
|
||||||
|
|
||||||
## Примечания
|
## Примечания
|
||||||
|
|
||||||
- После изменения настроек nginx Proxy Manager перезапустите контейнер
|
- После изменения настроек nginx Proxy Manager перезапустите контейнер
|
||||||
- Убедитесь, что ваш Node.js сервер настроен с `app.set("trust proxy", true)`
|
- Убедитесь, что ваш Node.js сервер настроен с `app.set("trust proxy", true)`
|
||||||
|
- Убедитесь, что приложение слушает на `0.0.0.0:PORT`, а не только на `127.0.0.1:PORT`
|
||||||
- Тестовый эндпоинт `/api/debug/ip` можно удалить после настройки
|
- Тестовый эндпоинт `/api/debug/ip` можно удалить после настройки
|
||||||
|
|||||||
57
QUICK_SETUP.md
Normal file
57
QUICK_SETUP.md
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# Быстрая настройка IP-адресов для nginx Proxy Manager
|
||||||
|
|
||||||
|
## Ваша ситуация
|
||||||
|
|
||||||
|
- nginx Proxy Manager работает в Docker
|
||||||
|
- Ваше приложение NoteJS работает на хосте (не в Docker)
|
||||||
|
- IP-адрес всегда показывает 90.189.198.107 (IP прокси)
|
||||||
|
|
||||||
|
## Быстрое решение
|
||||||
|
|
||||||
|
### 1. В nginx Proxy Manager
|
||||||
|
|
||||||
|
1. Откройте настройки вашего прокси-хоста
|
||||||
|
2. В разделе **"Advanced"** → **"Custom Nginx Configuration"** добавьте:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
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_set_header X-Client-IP $remote_addr;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. В настройках прокси-хоста
|
||||||
|
|
||||||
|
- **Forward Hostname/IP:** `host.docker.internal`
|
||||||
|
- **Forward Port:** `3000`
|
||||||
|
|
||||||
|
### 3. Проверка
|
||||||
|
|
||||||
|
Откройте в браузере: `https://your-domain.com/api/debug/ip`
|
||||||
|
|
||||||
|
Должно показать реальный IP-адрес клиента вместо 90.189.198.107.
|
||||||
|
|
||||||
|
### 4. Если не работает
|
||||||
|
|
||||||
|
1. Проверьте, что приложение слушает на всех интерфейсах:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
netstat -tlnp | grep :3000
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Если видите `127.0.0.1:3000`, измените в `server.js`:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
app.listen(PORT, "0.0.0.0", () => {
|
||||||
|
console.log(`🚀 Сервер запущен на порту ${PORT}`);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Перезапустите nginx Proxy Manager:
|
||||||
|
```bash
|
||||||
|
docker restart nginx-proxy-manager
|
||||||
|
```
|
||||||
|
|
||||||
|
## Готово!
|
||||||
|
|
||||||
|
После этих настроек ваше приложение будет получать реальные IP-адреса клиентов.
|
||||||
32
server.js
32
server.js
@ -312,18 +312,26 @@ function getClientIP(req) {
|
|||||||
console.log("ALL HEADERS:", JSON.stringify(req.headers, null, 2));
|
console.log("ALL HEADERS:", JSON.stringify(req.headers, null, 2));
|
||||||
console.log("========================");
|
console.log("========================");
|
||||||
|
|
||||||
// Приоритет заголовков для nginx proxy manager:
|
// Приоритет для получения реального IP клиента:
|
||||||
// 1. X-Real-IP (часто используется nginx)
|
// 1. req.socket.remoteAddress (для случаев с дополнительными прокси)
|
||||||
// 2. X-Forwarded-For (стандартный заголовок)
|
// 2. X-Real-IP (часто используется nginx)
|
||||||
// 3. CF-Connecting-IP (если используется Cloudflare)
|
// 3. X-Forwarded-For (стандартный заголовок)
|
||||||
// 4. X-Client-IP
|
// 4. CF-Connecting-IP (если используется Cloudflare)
|
||||||
// 5. req.ip (Express с trust proxy)
|
// 5. X-Client-IP
|
||||||
// 6. req.socket.remoteAddress (прямое соединение)
|
// 6. req.ip (Express с trust proxy)
|
||||||
|
|
||||||
let ip = null;
|
let ip = null;
|
||||||
|
|
||||||
|
// Проверяем socket_remoteAddress в первую очередь (для случаев с дополнительными прокси)
|
||||||
|
if (
|
||||||
|
req.socket?.remoteAddress &&
|
||||||
|
req.socket.remoteAddress !== "::1" &&
|
||||||
|
req.socket.remoteAddress !== "127.0.0.1"
|
||||||
|
) {
|
||||||
|
ip = req.socket.remoteAddress;
|
||||||
|
}
|
||||||
// Проверяем X-Real-IP (nginx часто использует этот заголовок)
|
// Проверяем X-Real-IP (nginx часто использует этот заголовок)
|
||||||
if (req.headers["x-real-ip"]) {
|
else if (req.headers["x-real-ip"]) {
|
||||||
ip = req.headers["x-real-ip"];
|
ip = req.headers["x-real-ip"];
|
||||||
}
|
}
|
||||||
// Проверяем X-Forwarded-For (берем первый IP из списка)
|
// Проверяем X-Forwarded-For (берем первый IP из списка)
|
||||||
@ -350,14 +358,6 @@ function getClientIP(req) {
|
|||||||
else if (req.ip && req.ip !== "::1" && req.ip !== "127.0.0.1") {
|
else if (req.ip && req.ip !== "::1" && req.ip !== "127.0.0.1") {
|
||||||
ip = req.ip;
|
ip = req.ip;
|
||||||
}
|
}
|
||||||
// В крайнем случае используем socket remoteAddress
|
|
||||||
else if (
|
|
||||||
req.socket?.remoteAddress &&
|
|
||||||
req.socket.remoteAddress !== "::1" &&
|
|
||||||
req.socket.remoteAddress !== "127.0.0.1"
|
|
||||||
) {
|
|
||||||
ip = req.socket.remoteAddress;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Очищаем IP от скобок IPv6, портов и кавычек
|
// Очищаем IP от скобок IPv6, портов и кавычек
|
||||||
if (ip && ip !== "unknown") {
|
if (ip && ip !== "unknown") {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user