ms-dred
@ms-dred
Вечно что то не то и что то не так...

Почему axios не передает IP клиента на сервер API?

Не понимаю почему 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
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы