moder
Администратор
Команда форума
Сегодня, с развитием цензуры, анонимайзеры востребованы все больше. В этой статье мы расскажем, как сделать свой собственный анонимайзер на Nginx в связке с модулем Lua. Можно, конечно, поставить готовый скрипт, наподобие Glype Proxy, но решение на Nginx удобнее и производительнее.
На Хабре есть статья Проксируем и Спасаем, где описано, как проксировать сайт через Nginx в связке с модулем ngx_http_substitutions_filter_module. Данное решение годится, только если требуется проксировать какие-то конкретные сайты, но не годится для нашей задачи. Дело в том, что функция subs_filter (для поиска и замены текста в содержимом страницы) модуля ngx_http_substitutions_filter_module не умеет искать по переменной и такая конструкция не сработает:
Эта странная особенность модуля ngx_http_substitutions_filter_module делает его непригодным для создания анонимайзера, если, конечно, не найдутся желающие доработать модуль, либо появится новая версия, где поиск переменной будет работать.
Вместо ngx_http_substitutions_filter_module для замены ссылок в содержимом страницы мы будем использовать модуль Lua.
Скачиваем модуль по ссылке, либо через консоль:
Для сборки Nginx с новым модулем устанавливаем дополнительные пакеты.
Для CentOS:
Для Debian/Ubuntu:
Устанавливаем Lua.
Скачиваем новую версию Nginx:
Смотрим, какие модули уже установлены:
Теперь копируем вывод команды nginx -V в текстовой редактор, начиная от --prefix= и до первого --add-module= (все присутствующие в выводе --add_module= нам не нужны).
Должно получиться примерно следующее:
Теперь добавляем в конфигурацию запись --add-module=/root/lua-5.2.3, где /root/lua-5.2.3 - это пусть, куда мы распаковали модуль Lua.
И собираем Nginx:
Настраиваем конфиг 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:
Редактируем конфиг Nginx (/etc/nginx/nginx.conf):
Осталось перезагрузить Nginx командой:
Если у вас возникли сложности с настройкой, пишите в теме, постараемся помочь.
Также могут пригодиться следующие материалы:
http://firstwiki.ru/index.php/Добавление_модулей_nginx_в_Linux_(Debian/Ubuntu/CentOS)
http://habrahabr.ru/post/130861/
На Хабре есть статья Проксируем и Спасаем, где описано, как проксировать сайт через Nginx в связке с модулем ngx_http_substitutions_filter_module. Данное решение годится, только если требуется проксировать какие-то конкретные сайты, но не годится для нашей задачи. Дело в том, что функция subs_filter (для поиска и замены текста в содержимом страницы) модуля ngx_http_substitutions_filter_module не умеет искать по переменной и такая конструкция не сработает:
Код:
# $domain - проксируемый сайт, $mirror - наше зерало
subs_filter $domain $mirror;
Вместо ngx_http_substitutions_filter_module для замены ссылок в содержимом страницы мы будем использовать модуль Lua.
Скачиваем модуль по ссылке, либо через консоль:
Код:
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
Для CentOS:
Код:
yum install gcc gcc-c++ kernel-devel
yum groupinstall 'Development Tools'
Код:
aptitude install build-essential
Код:
yum install gcc* -y # обновляем репозиторий
yum install libpcre3 libpcre3-dev libperl-dev lua liblua-dev
Код:
wget http://nginx.org/download/nginx-1.6.1.tar.gz
tar –xvf nginx-1.6.1.tar.gz
cd nginx-1.6.1
Код:
nginx -V
Должно получиться примерно следующее:
Код:
--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
И собираем Nginx:
Код:
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
Настраиваем конфиг 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:
Код:
#! 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
Код:
...
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;
}
}
Код:
service nginx restart
Также могут пригодиться следующие материалы:
http://firstwiki.ru/index.php/Добавление_модулей_nginx_в_Linux_(Debian/Ubuntu/CentOS)
http://habrahabr.ru/post/130861/
Последнее редактирование: