Nginx: Проксирование cookies
Date November 17th, 2011 Author Vitaly Agapov
— Да, из настоящих.
— Я попробую его, если вы купите у меня скаутское печенье.
— А это печенье из настоящих скаутов?
При работе 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: Nginx
Category:
Nginx |
No comments »