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

Как заставить 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;

но у меня ничего из этого не сработало = (

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

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

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

Если вы действительно хотите сделать это так, вы потеряете преимущества балансировки нагрузки, когда cookie отсутствует пока вы не напишете некрасивые блоки if, перехватывающие это исключение. Также, если вы настроили восходящие проверки с помощью 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