Не понимаю почему axios передает user-agent, а вот IP клиента не передает, вместо него фигурирует IP сервера. Что я не так делаю?
На сервере next.js конфиг nginx
upstream site.ru {
zone upstreams 64K;
server IP_SERVER:8000 max_fails=1 fail_timeout=2s;
keepalive 2;
}
server {
server_name site.ru;
listen 443 ssl;
http2 on;
error_log /var/log/nginx/site.errors.log notice;
include ssl/site.conf;
include acme.conf;
set $root /var/www/site/.next;
set $build $root/.next;
location @proxy {
# Было burst=50
limit_req zone=one burst=50 nodelay;
limit_req_log_level warn;
limit_req_status 429;
proxy_pass http://site.ru;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect http://127.0.0.1:8000/ https://site.ru/;
proxy_next_upstream error timeout http_500;
}
location / {
root $root;
if ($limit_bots = 1) {
return 403;
}
try_files $uri $uri/index.html @proxy;
}
}
В next.js в getServerSideProps перед запросом формирую необходимые заголовки
const axiosPushHeadersSSRInformation = AxiosPushHeadersSSRInformation(req?.headers)
результат axiosPushHeadersSSRInformation
/*
Это на локалке IP ::1
{
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
'x-forwarded-for': '::1'
}
*/
AxiosPushHeadersSSRInformation
export const AxiosPushHeadersSSRInformation = (headers: any) => {
if (headers) {
return Object.entries(headers)
.filter(([key]) => ["user-agent", "x-forwarded-for", "x-real-ip"].includes(key))
.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {})
}
}
Там же в getServerSideProps создаю запрос на сервер API
const [
responseDocuments,
responseCount
] = await Promise.all([
await DocumentService.get(queries, axiosPushHeadersSSRInformation),
await DocumentService.getCount(queries, axiosPushHeadersSSRInformation)
])
DocumentService
static async get(n: SearchInterface, headers?: any): Promise<AxiosResponse<DocumentModel[]>> {
return $api.get<DocumentModel[]>("/get", {
headers,
params: n
})
}
На сервере API nginx
upstream api.site.ru {
zone upstreams 64K;
server IP_SERVER_API:7000 max_fails=1 fail_timeout=2s;
keepalive 2;
}
server {
server_name api.site.ru;
listen 443 ssl;
http2 on;
error_log /var/log/nginx/api.errors.log notice;
access_log /var/log/nginx/api.log;
include ssl/api.conf;
include acme.conf;
root /var/www/api.site.ru;
location / {
limit_req zone=one burst=40 nodelay;
limit_req_log_level warn;
limit_req_status 429;
proxy_pass http://api.site.ru;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_redirect http://127.0.0.1:7000/ https://api.site.ru/;
proxy_next_upstream error timeout http_500;
}
}
В логах api фигурирует не IP клиента, а IP сервере (next.js и api сервере находятся на одном сервере)
Почему так происходит, или я что то не так делаю? Возможно ли что на сервере API IP перезаписывается?
При всем при этом, на сервере стоит pm2 и в pm2 logs я не вижу IP сервера, там все IP клиентов, а вот в nginx логах и IP клиентов есть и IP сервера тоже
При нагрузках из за этого в api.error.log вываливаются ошибки
limiting requests, excess: 40.800 by zone "one", client: IP_SERVER, server: a