Nginx Lua, гъвкаво балансиране на натоварването с постоянство на сесията

постоянство

При балансиране на натоварването важен въпрос е постоянството на клиентската сесия. Особено ако зад балансира има някакъв интерактивен бекенд. И още повече, ако искате да направите A / B тестване и гъвкаво да коригирате части от клиенти към различно съдържание. "Nginx plus" предлага такива функции, но какво ще стане, ако искате евтино и бързо?

На помощ идва възможността за разширяване на функционалността на Nginx с помощта на Lua.

Като мощна комбинация от nginx можете да използвате компилацията OpenResty, но за нашите нужди това е излишно, така че ще съберем само необходимата функционалност, базирана на nginx 1.10.3 от хранилището.

Нашите тестови субекти ще бъдат:

Необходими компоненти за монтаж:

Инсталирайте пакети за изграждане на deb пакета:

Последната команда изтегля изходните кодове на nginx от конфигурираното хранилище. Ние използваме nginx: Linux пакети.

Изтеглете и разопаковайте текущите версии на изходните кодове на модула: ngx_devel_kit и lua-nginx-module

Първият модул е ​​необходим за сглобяване на желания втори.

Събираме и инсталираме получения пакет:

Последната команда ще ангажира инсталирания пакет, за да избегне случайното му актуализиране.

Освен това се нуждаем от още две lua библиотеки от проекта OpenResty, които предоставят Nginx API за Lua: lua-resty-core и lua-resty-lrucache. Те са набор от *.lua файлове, инсталирани (по подразбиране) в /usr/local/lib/lua/.

В http <> инициализиране на lua.

*_lua_block блоковете вече съдържат lua код със собствен синтаксис и функции.

Основният сървър, който се грижи за външни заявки.

Блокът нагоре по веригата, който, използвайки lua, замества вграденияnginx логика.

Е, и прост демонстрационен бекенд, до който клиентите в крайна сметка ще дойдат.

Когато стартирате nginx-a с тази конфигурация, в регистрационните файлове ще попадне предупреждение:

Които могат да бъдат премахнати чрез събиране и инсталиране на необходимата версия. Но работи и на 2.0 (libluajit-5.1-2). Сега, използвайки браузър с инструменти за разработчици, можем да проверим работата на сървъра и набора от бисквитки.

Така получихме необходимата гъвкавост за тестване и статистика. И запазването на клиентската сесия е необходимо за правилната работа на бекенда. Е, просто интересно преживяване.

PSПодобни задачи могат да бъдат решени с други методи, например с помощта на haproxy, което ви позволява да балансирате, като вземете предвид сесиите. Или, за да разделите клиентите, използвайте ngx_http_split_clients_module и използвайте map, за да сравните една стойност в зависимост от другата. Но горният вариант на разпространение на клиента и избор на бекенд позволява по-гъвкаво персонализиране на системата. И ако е необходимо, добавете разнообразна логика към работата. При това без възстановяване на сегашната система.

Благодаря за вниманието.

И тук можете да получите грант за тестов период на Yandex.Cloud. Необходимо е само да въведете "Habr" в полето "секретна парола".