Nginx: Проксирование cookies

Date November 17th, 2011 Author Vitaly Agapov

— Этот лимонад из настоящих лимонов?
— Да, из настоящих.
— Я попробую его, если вы купите у меня скаутское печенье.
— А это печенье из настоящих скаутов?

– Х/Ф «Моральные ценности семейства Аддамсов»

cookie-monster
При работе web-сервера в качестве фронтэнда к некоторому приложению может возникнуть необходимость изменять на лету содержимое Cookies, отдаваемых приложением пользователю. Это может быть название домена, путь к приложению… да всё, что угодно – ситуации бывают разные. Если мы используем Apache, то всё решается с помощью директив ProxyPassReverseCookieDomain и ProxyPassReverseCookiePath модуля mod_proxy. Если же судьба связала нас с nginx, то решение чуть менее простое. Но зато их как минимум несколько. Один из них – это модуль интерпретатора Lua, который кроме описанной задачи сможет решить нам ещё большое количество других.

Но начнём с самого начала.

Установка из репозитория

Если речь идёт об Ubuntu, то можно поставить nginx из соответствующих репозиториев:

echo "deb http://nginx.org/packages/ubuntu/ lucid nginx" >> /etc/apt/sources.list
echo "deb-src http://nginx.org/packages/ubuntu/ lucid nginx" >> /etc/apt/sources.list
apt-get update
apt-get install nginx

В большинстве случаев этого будет достаточно, но если нужна дополнительная функциональность (как в нашем случае), то смысла в этом немного, разве что для создания православной структуры конфигов со всеми этими sites-enabled, а также для возможности посмотреть стандартные параметры скрипта configure.

Установка вручную

Доустанавливаем пакеты, которые пригодятся для модуля Lua:

apt-get install libpcre3 libpcre3-dev libperl-dev lua5.1 liblua5.1-dev libssl-dev

Качаем lua-nginx-module с https://github.com/chaoslawful/lua-nginx-module

wget https://github.com/chaoslawful/lua-nginx-module/zipball/master
unzip master

Качаем модуль substitutions4nginx

svn checkout http://substitutions4nginx.googlecode.com/svn/trunk/ substitutions4nginx

Ставим nginx:

wget http://nginx.org/download/nginx-1.0.8.tar.gz
tar -xzvf nginx-1.0.8.tar.gz
cd nginx-1.0.8
./configure --prefix=/etc/nginx/ --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_sub_module --with-http_gzip_static_module --with-http_stub_status_module --with-file-aio --with-ipv6 --with-http_perl_module --add-module=../substitutions4nginx/ --add-module=../chaoslawful-lua-nginx-module*/
make && make install

Стандартные аргументы для скрипта configure можно посмотреть командой nginx -V, убрать лишнее, добавить нужное.

В общем, после всего этого nginx с нужными модулями собран и установлен.

Конфигурация nginx

Теперь для проксирования кук в конфиге nginx (внутри server{} и, например, location{} ) пишем что-то в этом роде:

header_filter_by_lua '
   local headers = ngx.header["Set-Cookie"]
   if headers then
      if type(headers) == "string" then
         headers = {headers}
      end
      for i, header in ipairs(headers) do
         local cookie = ngx.re.match(header, "JSESSIONID=([^;]+); Path=/backPath([^;]*)", "io")
         if cookie then
            headers[i] = "JSESSIONID=" .. cookie[1] .. "; Path=/frontPath" .. cookie[2] .. ";"
         end
      end
   ngx.header["Set-Cookie"] = headers
   end
';

Готово. Получите, распишитесь.

Tags:
Category: Nginx | No comments »

Comments

Leave a comment

 Comment Form