Как заставить nginx понимать точки в значениях cookie?

У меня Nginx настроен как простой липкий LB. Одной из ключевых частей конфигурации является сопоставление значения cookie с адресом сервера. Это прекрасно работает:

map $cookie_sessionServer $http_sticky_backend {
    default 0;
    Server_A   192.168.73.210:1337;
    Server_B   192.168.73.210:1338;
}

Теперь я должен добавить точки к значениям cookie (почему это другая история). Но когда я меняю конфиг, он перестает работать.

map $cookie_sessionServer $http_sticky_backend {
    default 0;
    .Server_A   192.168.73.210:1337;
    .Server_B   192.168.73.210:1338;
}

Нет ошибок, ничего полезного в журнале отладки, эта карта просто "возвращает" значение по умолчанию (0) и логика привязки пропускается.

Я пробовал также \.Server_A 192.168.73.210:1337; а также ".Server_A" 192.168.73.210:1337; а также ~^\.Server_A$ 192.168.73.210:1337; а также ~\.Server_A$ 192.168.73.210:1337;

но ничего из этого у меня не получилось =(

1 ответ

Решение

Если вы хотите использовать липкие сессии, альтернативные модули доступны, чтобы избежать nginx плюс коммерческая реализация:

Вам нужно будет перекомпилировать nginx, но это не сложно.

Вы также можете использовать tengine, форк с открытым исходным кодом nginx, также реализующий липкие сессии.

Если вы абсолютно хотите сделать это таким образом, вы потеряете преимущества балансировки нагрузки при отсутствии cookie, пока не напишите некрасиво, если блоки перехватывают это исключение. Кроме того, если вы установите проверки вверх по течению с max_fails а также fail_timeout вы потеряете преимущества объединения ресурсов в восходящем потоке и в конечном итоге будете пытаться перенаправлять запросы на серверы, которые не работают.

Для записи вот способ, которым вы можете сделать это частично (учитывая то, что я только что сказал) с помощью директивы map:

map $cookie_sessionServer $route {
    default 0;
    "~\.Server_A$" 192.168.73.210:1337;
    "~\.Server_B$" 192.168.73.210:1338;
}

server {

    [ ... ]

    location /foo {
        proxy_pass http://$route;
    }

}

Протестировано с nginx 1.6.2

Другие вопросы по тегам