Table of Contents

Установка пререквизитов и компиляция минимального nginx для reverse-proxy

apt-get install build-essential libwww-perl libpcre3-dev zlib1g-dev libssl-dev

wget http://nginx.org/download/nginx-1.0.14.tar.gz

tar -xvf nginx-1.0.14.tar.gz
cd nginx-1.0.14

make clean; ./configure --without-http_autoindex_module --without-http_browser_module --without-http_fastcgi_module --without-http_geo_module --without-http_empty_gif_module --without-http_map_module --without-http_memcached_module --without-http_ssi_module --without-http_userid_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-http_split_clients_module --without-http_uwsgi_module --without-http_scgi_module --without-http_referer_module --without-http-cache --without-http_upstream_ip_hash_module --with-http_ssl_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

make

make install

Запуск nginx

/usr/local/nginx/sbin/nginx

Перезапуск nginx

kill $(cat /usr/local/nginx/logs/nginx.pid) && /usr/local/nginx/sbin/nginx

После первого запуска:

chown www-data /usr/local/nginx/proxy_temp -R
chmod 777 /usr/local/nginx/proxy_temp

/usr/local/nginx/conf/nginx.conf

user  www-data;
worker_processes  20;
worker_rlimit_nofile 32768;

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  10240;
}


http {

#log_format upstream   '$upstream_addr | $request - [ $upstream_response_time ]';

server_tokens off;
client_header_timeout 3m;
send_timeout 3m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
output_buffers 1 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
client_max_body_size 20M;
tcp_nodelay on;
keepalive_timeout 75 20;
server_names_hash_bucket_size 128; # this seems to be required for some vh

log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;

# default virtual host
server {
listen 80 default;
server_name _;

#access_log /var/log/nginx/upstream_access.log  upstream;
access_log /var/log/nginx/default-access.log main;

server_name_in_redirect off;

location / {
index index.html;
root /var/www/default/htdocs;
}
}

# here resides my virtual host configurations
include /usr/local/nginx/conf/virtual.conf;

}

/usr/local/nginx/conf/virtual.conf

server {
listen 80;
listen 443;
include /usr/local/nginx/conf/ssl.conf;

server_name autosys.tk;

location / {
proxy_pass http://autosys.tk;
 proxy_set_header   X-Real-IP $remote_addr;
 proxy_set_header   Host $http_host;
 proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

}
}

/usr/local/nginx/conf/ssl.conf

ssl                     on;
ssl_protocols           SSLv3 TLSv1;
ssl_certificate         /usr/local/nginx/conf/ssl/cert.pem;
ssl_certificate_key     /usr/local/nginx/conf/ssl/cert.key;
mkdir /usr/local/nginx/conf/ssl

Для большей безопасности ограничиваем доступ к сертификатам:

chown www-data:www-data /usr/local/nginx/conf/ssl
chmod 700 /usr/local/nginx/conf/ssl

Перейдем в эту папку и с генерируем сертификат:

cd /usr/local/nginx/conf/ssl
openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.key

Если через nginx не проходят куки!

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

Устанавливаем LuaJIT-2.0

wget http://luajit.org/download/LuaJIT-2.0.0-beta10.tar.gz
tar -xvf LuaJIT-2.0.0-beta10.tar.gz
cd LuaJIT-2.0.0-beta10
make && make install
ln -s /usr/local/lib/liblua5.1.so /usr/local/lib/liblua.so
export LUAJIT_LIB=/usr/local/lib/
export LUAJIT_INC=/usr/local/include/luajit-2.0/
LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH

Скачиваем и распаковываем ngx_devel_kit

wget https://github.com/simpl/ngx_devel_kit/tarball/master
tar -xvf master.1

Скачиваем и распаковываем lua-nginx-module

wget https://github.com/chaoslawful/lua-nginx-module/tarball/master
tar -xvf master

Конфигурируем и компилируем и устанавливаем nginx
Надо следить за

--add-module=/root/chaoslawful-lua-nginx-module-d0d9140/ --add-module=/root/simpl-ngx_devel_kit-4192ba6/ 


в конце строки.

make clean; ./configure --without-http_autoindex_module --without-http_browser_module --without-http_fastcgi_module --without-http_geo_module --without-http_empty_gif_module --without-http_map_module --without-http_memcached_module --without-http_ssi_module --without-http_userid_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-http_split_clients_module --without-http_uwsgi_module --without-http_scgi_module --without-http_referer_module --without-http-cache --without-http_upstream_ip_hash_module --with-http_ssl_module  --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log  --add-module=/root/chaoslawful-lua-nginx-module-d0d9140/ --add-module=/root/simpl-ngx_devel_kit-4192ba6/

make -j2
make install

После make install не забываем перезапустить nginx.

Перезапускаем

kill $(cat /usr/local/nginx/logs/nginx.pid) && /usr/local/nginx/sbin/ngin  

И смотрим что же получилось? А получилась вот такая великолепная штука: http://wiki.nginx.org/HttpLuaModule, которая по уверению его создателей на среднем настольном ПК тянет 25 тысяч запросов в секунду. Внимательно изучив документацию становится понятно, что в среде исполнения Lua доступны все события и внутренние обработчики Nginx. Конкретно для нашей задачи мы будем использовать директиву header_filter_by_lua . Открываем конфигурационный файл, выбираем нужный 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=([^;]+);", "io")
                if cookie then
                    headers[i] = "JSESSIONID=" .. cookie[1] .. "; domain=.frontend.com; path=/newpath;"
                end
            end
            ngx.header["Set-Cookie"] = headers
        end
';

Тут приведен самый простой вариант обработчика — первый код на lua который я увидел в своей жизни. Можно и нужно написать универсальный парсер хедеров Set-Cookie, страна уже ждет своего героя в комментариях!