Nginx: Проксирование cookies
Date November 17th, 2011 Author Vitaly Agapov
— Да, из настоящих.
— Я попробую его, если вы купите у меня скаутское печенье.
— А это печенье из настоящих скаутов?
При работе web-сервера в качестве фронтэнда к некоторому приложению может возникнуть необходимость изменять на лету содержимое Cookies, отдаваемых приложением пользователю. Это может быть название домена, путь к приложению… да всё, что угодно – ситуации бывают разные. Если мы используем Apache, то всё решается с помощью директив ProxyPassReverseCookieDomain и ProxyPassReverseCookiePath модуля mod_proxy. Если же судьба связала нас с nginx, то решение чуть менее простое. Но зато их как минимум несколько. Один из них – это модуль интерпретатора Lua, который кроме описанной задачи сможет решить нам ещё большое количество других.
Но начнём с самого начала.
Установка из репозитория
Если речь идёт об Ubuntu, то можно поставить nginx из соответствующих репозиториев:
1.
echo
"deb http://nginx.org/packages/ubuntu/ lucid nginx"
>> /etc/apt/sources.list
2.
echo
"deb-src http://nginx.org/packages/ubuntu/ lucid nginx"
>> /etc/apt/sources.list
3.
apt-get update
4.
apt-get
install
nginx
В большинстве случаев этого будет достаточно, но если нужна дополнительная функциональность (как в нашем случае), то смысла в этом немного, разве что для создания православной структуры конфигов со всеми этими sites-enabled, а также для возможности посмотреть стандартные параметры скрипта configure.
Установка вручную
Доустанавливаем пакеты, которые пригодятся для модуля Lua:
1.
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
2.
unzip master
Качаем модуль substitutions4nginx
1.
svn checkout http://substitutions4nginx.googlecode.com/svn/trunk/ substitutions4nginx
Ставим nginx:
1.
wget http://nginx.org/download/nginx-1.0.8.
tar
.gz
2.
tar
-xzvf nginx-1.0.8.
tar
.gz
3.
cd
nginx-1.0.8
4.
./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*/
5.
make
&&
make
install
Стандартные аргументы для скрипта configure можно посмотреть командой nginx -V, убрать лишнее, добавить нужное.
В общем, после всего этого nginx с нужными модулями собран и установлен.
Конфигурация nginx
Теперь для проксирования кук в конфиге nginx (внутри server{} и, например, location{} ) пишем что-то в этом роде:
01.
header_filter_by_lua '
02.
local headers = ngx.header["Set-Cookie"]
03.
if headers then
04.
if type(headers) == "string" then
05.
headers = {headers}
06.
end
07.
for i, header in ipairs(headers) do
08.
local cookie = ngx.re.match(header, "JSESSIONID=([^;]+); Path=/backPath([^;]*)", "io")
09.
if cookie then
10.
headers[i] = "JSESSIONID=" .. cookie[1] .. "; Path=/frontPath" .. cookie[2] .. ";"
11.
end
12.
end
13.
ngx.header["Set-Cookie"] = headers
14.
end
15.
';
Готово. Получите, распишитесь.
Tags: Nginx
Category:
Nginx |
No comments »