Липкие сессии с прокси Nginx

10

У меня есть приложение, которое работает на двух разных экземплярах 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 для внешних серверов?

Himmel
источник
На вашем Nginx установлен "ngx_http_upstream_module"? Я не знаю, включено ли оно по умолчанию или нет. «nginx -V» обычно выводит модули, с которыми он собран. Мой (построен из источника) не упоминает об этом
Тим

Ответы:

7

Мой сервер находился за балансировкой нагрузки 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;
    }
}
Himmel
источник
7

Согласно документации Nginx, поддержка Sticky session доступна только для их дорогой версии 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

Мистер баг
источник
Можете ли вы дать ссылку на эту документацию?
Джеймс Шиви