Назад | Перейти на главную страницу

Прилипающие сессии с прокси Nginx

У меня есть приложение, работающее на двух разных экземплярах AWS, и я хотел бы включить «липкие» или «постоянные» сеансы на основе IP, чтобы я мог использовать преимущества технологий веб-сокетов определенным образом.

У меня есть две разные настройки, в каждой из которых используется ip_hash чтобы включить эти липкие сеансы.

При первой настройке процессы приложения выполняются в том же экземпляре, что и конфигурация Nginx. Это работает, сеансы постоянны, как и ожидалось.

upstream my_app {
    ip_hash;
    # local servers
    server 127.0.0.1:3001 weight=100 max_fails=5 fail_timeout=300;
    server 127.0.0.1:3002 weight=100 max_fails=5 fail_timeout=300;
    keepalive 8;
}

Во второй настройке я указываю на внешние экземпляры и пытаюсь добиться того же эффекта. Эта установка не работает. Другими словами, сеансы по-прежнему балансируются по нагрузке.

upstream my_app {
    ip_hash;
    # external servers
    server 111.11.11.11:3001 weight=100 max_fails=5 fail_timeout=300;
    server 222.22.22.22:3002 weight=100 max_fails=5 fail_timeout=300;
    keepalive 8;
}

Я использую ip_hash правильно? Как я могу включить "липкие" IP-сессии для внешних серверов?

Согласно документации Nginx, поддержка Sticky-сессий доступна только для их дорогой версии Plus. Я исследовал альтернативы, и чем ближе я был, тем больше оказался этот старый форк, несовместимый с Nginx 1.5+. https://github.com/lusis/nginx-sticky-module

Я также попытался создать модуль LUA, но для выбора однорангового узла нет API-хуков, только для перечисления и блокировки.

Балансировка нагрузки Nginx Plus

Обновить

Я нашел еще один отличный модуль, см. https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src

Мой сервер находился за балансировкой нагрузки AWS, поэтому мне нужно было передать правильные заголовки в восходящий поток, чтобы он всегда отражал IP-адрес клиента. Следующая конфигурация устранила мою проблему (см. Строку с комментариями):

upstream my_app {
    ip_hash;
    server 111.11.11.11:3001 weight=100 max_fails=5 fail_timeout=300;
    server 222.22.22.22:3002 weight=100 max_fails=5 fail_timeout=300;
    keepalive 8;
}

server {
    server_name my-app.com;

    location / {
        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 Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        # This is necessary to pass the correct IP to be hashed
        real_ip_header X-Real-IP;

        proxy_pass http://my_app/;
        proxy_redirect off;
    }
}