Ответить в теме

[QUOTE="moder, post: 558, member: 1"]

Сегодня, с развитием цензуры,  анонимайзеры востребованы все больше.  В этой статье мы расскажем,  как сделать свой собственный анонимайзер на Nginx в связке с модулем Lua. Можно, конечно, поставить готовый скрипт, наподобие Glype Proxy, но решение на Nginx удобнее и производительнее.


На Хабре есть статья Проксируем и Спасаем, где описано, как проксировать сайт через Nginx в связке с модулем ngx_http_substitutions_filter_module. Данное решение годится, только если требуется проксировать какие-то конкретные сайты, но не годится для нашей задачи. Дело в том, что функция subs_filter (для поиска и замены текста в содержимом страницы) модуля  ngx_http_substitutions_filter_module не умеет искать по переменной и такая конструкция не сработает:

[CODE]# $domain - проксируемый сайт, $mirror - наше зерало

subs_filter $domain $mirror;

[/CODE]

Эта странная особенность модуля ngx_http_substitutions_filter_module делает его непригодным для создания анонимайзера, если, конечно, не найдутся желающие доработать модуль, либо появится новая версия, где поиск переменной будет работать.


Вместо ngx_http_substitutions_filter_module для замены ссылок в содержимом страницы мы будем использовать модуль Lua.

Скачиваем модуль по ссылке, либо через консоль:

[CODE]wget http://www.lua.org/ftp/lua-5.2.3.tar.gz

tar zxf lua-5.2.3.tar.gz

cd lua-5.2.3

make linux test[/CODE]


Для сборки Nginx с новым модулем устанавливаем дополнительные пакеты.


Для CentOS:

[CODE]

yum install gcc gcc-c++ kernel-devel

yum groupinstall 'Development Tools'

[/CODE]


Для Debian/Ubuntu:

[CODE]aptitude install build-essential[/CODE]


Устанавливаем Lua.

[CODE]

yum install gcc* -y # обновляем репозиторий

yum install libpcre3 libpcre3-dev libperl-dev lua liblua-dev

[/CODE]


Скачиваем новую версию Nginx:

[CODE]

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

tar –xvf nginx-1.6.1.tar.gz

cd nginx-1.6.1

[/CODE]


Смотрим, какие модули уже установлены:

[CODE]nginx -V[/CODE]


Теперь копируем вывод команды nginx -V в текстовой редактор, начиная от --prefix= и до первого --add-module= (все присутствующие в выводе --add_module= нам не нужны).

Должно получиться примерно следующее:

[CODE]--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_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-http_gzip_static_module --with-pcre-jit --with-http_ssl_module[/CODE]


Теперь добавляем в конфигурацию запись --add-module=/root/lua-5.2.3, где /root/lua-5.2.3 - это пусть, куда мы распаковали модуль Lua.

И собираем Nginx:

[CODE]cd /root/nginx-1.6.1

./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_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-http_gzip_static_module --with-pcre-jit --with-http_ssl_module --add-module=/home/ngx_http --add-module=/root/lua


make

make install

[/CODE]



Настраиваем конфиг Nginx.


Для удобства, мы сделаем анонимайзер на поддоменах (по такому принципу работает  известный анонимайзер hideme.ru). Так, если основной домен у нас domain.com, то проксируемый сайт будет выглядеть так: website.com.domain.com. Но есть одна проблема. Дело в том, что некоторые провайдеры блокируют запрещенные сайты по маске *website.com*, а значит, адрес вида website.com.domain.com нам не подходит. Необходимо зашифровать ссылку. Например, мы можем использовать вместо точки последовательность цифр 00100, таким образом, проксируемый сайт будет выглядеть так: website00100com.domain.com.


Итак, для начала мы создадим скрипт на lua, который будем подключать в конфиг Nginx. Назовем его replace.lua и поместим в папку /etc/nginx/scripts/.

Содержимое replace.lua:

[CODE]

#! usr/bin/lua

-- /etc/nginx/scripts/subs.lua

response_body = ngx.arg[1]

response_body = response_body:gsub(ngx.var.domain, ngx.var.subdomain)

ngx.arg[1]=response_body

[/CODE]


Редактируем конфиг Nginx (/etc/nginx/nginx.conf):

[CODE]

...

server

{

  listen 80;


  server_name ~^(?<one>[a-z0-9-\.]+)00100(?<two>[a-z0-9\-]+)\..domain.com; # берем из адреса название домена и доменную зону проксируемого сайта


  location /

  {

       root /home/domain.com/www;

       try_files $uri @static;

  }


  location @static

  {

      set $domain $one.$two; # $domain - проксируемый сайт

      set $t 00100$two;

      set $subdomain $one$t.domain.com; # это наш поддомен вида  website00100com.domain.com


      body_filter_by_lua_file /etc/nginx/scripts/replace.lua; # скрипт lua заметит в проксируемом сайте все ссылки вида website.com на website00100com.domain.com


      proxy_set_header Host $domain;

      proxy_cookie_domain $domain $subdomain.domain.com;


      proxy_set_header Accept-Encoding "";


      resolver 8.8.8.8;


      set $backend $domain;


      proxy_pass http://$backend;


      proxy_redirect http://$domain http://$subdomain.domain.com;

      proxy_redirect https://$domain https://$subdomain.domain.com;

      proxy_redirect http://www.$domain http://$subdomain.domain.com;

      proxy_redirect https://www.$domain https://$subdomain.domain.com;


  }

}

[/CODE]


Осталось перезагрузить Nginx командой:

[CODE]service nginx restart[/CODE]


Если у вас возникли сложности с настройкой, пишите в теме, постараемся помочь.


Также могут пригодиться следующие материалы:

http://firstwiki.ru/index.php/Добавление_модулей_nginx_в_Linux_(Debian/Ubuntu/CentOS)

http://habrahabr.ru/post/130861/

[/QUOTE]

Сверху