====== Проксирование c помощью nginx ======
** или как создать зеркало интернет-сайта в сети Yggdrasil **
Здесь будет описан способ создания зеркала сайта в сети Yggdrasil с использованием возможности web-сервера nginx работать в качестве прокси-сервера.
Всё описанное доступно для реализации как под управлением ОС Linux, так и Windows.\\
Мы рассмотрим конфигурирование nginx, установленного в OC linux (на базе Debian).
Для создания корректно функционирующего зеркала сайта необходимы базовые знания языка гипертекстовой разметки (HTML), а так же, Java Script, CSS, и понимание принципов взаимодействия браузера и web-сервера.
Если ранее вы не занимались конфигурированием web-сервера nginx, настоятельно рекомендую ознакомиться со структурой конфигурационного файла, базовыми настройками, встроенными переменными и с примерами простейших конфигураций.\\
Документация nginx доступна на официальном сайте проекта:\\
https://nginx.org/ru/docs/\\
Руководство для начинающих:\\
https://nginx.org/ru/docs/beginners_guide.html
В процессе исследования проксируемого сайта, скорее всего, вам понадобятся инструменты отладки, встроенные в популярные браузеры. С ними так же желательно предварительно ознакомиться.\\
Краткое описание инструментов разработчика в браузере Firefox: https://developer.mozilla.org/ru/docs/Tools
Если nginx еще не установлен, необходимо его установить:
sudo apt-get install nginx
Базовой установки (с поставляемыми по-умолчанию модулями) в большинстве случаев будет достаточно.
Конфигурационные файлы nginx находятся в директории ''/etc/nginx/''.\\
Общие настройки сервера (''nginx.conf'') мы рассматривать не будем, перейдем непосредственно к конфигурированию проксирования конкретного сайта. Тем, кто впервые установил nginx рекомендую, как минимум, просмотреть файл ''/etc/nginx/nginx.conf'' и, желательно, прочитать о директивах, которые там содержатся.
В качестве примера возьмем новостной сайт https://www.interfax.ru/
^ Небольшое отступление ^
| Конфигурационные файлы конкретных сайтов обычно размещаются в директории ''/etc/nginx/sites-available/''.\\ А в директории ''/etc/nginx/sites-enabled/'', как правило, помещают символические ссылки на конфигурации из ''/etc/nginx/sites-available/''.\\ Всё, что находится в ''/etc/nginx/sites-enabled/'' nginx считывает при запуске.\\ Таким образом можно легко включать и отключать какой-то сайт на сервере.\\ Например, если в ''/etc/nginx/sites-available/'' есть файл ''homesite.conf'', можно создать на него ссылку в ''/etc/nginx/sites-enabled/''\\ \\ ''$ sudo ln -s /etc/nginx/sites-available/homesite.conf /etc/nginx/sites-enabled/homesite.conf''\\ \\ Перезапустив nginx, мы сможем зайти на сайт, настроенный в этом конфигурационном файле.\\ \\ ''$ sudo systemctl restart nginx''\\ \\ Если мы захотим сделать сайт недоступным, мы просто удаляем ссылку из ''/etc/nginx/sites-enabled/'' и перезапускаем nginx.\\ \\ ''$ sudo rm -f /etc/nginx/sites-enabled/homesite.conf && sudo systemctl restart nginx'' \\ \\ Cайт более не работает, а его конфигурация осталась в ''/etc/nginx/sites-available/''.|
Для экспериментов временно добавим IP-адрес на интерфейс tun0.
sudo ip address add 300:529f:150c:eafe::7/64 dev tun0:1
Подробнее о том, как добавить несколько адресов на один интерфейс можно прочесть статье [[yggdrasil:subnet_setting|Короткий адрес из подсети 300::/64]].
Создадим файл ''/etc/nginx/sites-available/interfax.ru.conf''\\
И внесем в него такое содержимое:
server {
#установка заголовков, которые позволят понять серверу, что запросы пришли через прокси-сервер
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
listen [300:529f:150c:eafe::7]:80;
location / {
proxy_pass https://www.interfax.ru/;
}
}
Таким образом мы сообщаем серверу, на каком интерфейсе (адресе) и порту должен работать сайт, и что при обращении к корневой директории необходимо сделать запрос на https://www.interfax.ru/ и выдать нам результат.
Создаем ссылку в ''/etc/nginx/sites-enabled/'' и перезапускаем nginx.
sudo ln -s /etc/nginx/sites-available/interfax.ru.conf /etc/nginx/sites-enabled/interfax.ru.conf && sudo systemctl restart nginx
Если сейчас мы откроем браузер и перейдем по адресу http://[300:529f:150c:eafe::7]/, мы уже увидим страницу с новостями.\\
Но это еще не всё. Откроем панель инструментов разработчика, перейдем на закладку Сеть и обновим страничку.\\
Видно, что часть скриптов запрашивается браузером с других адресов (static.smi2.net др.)...\\
Пользователи, не имеющие доступа в интернет (подключенные к Yggdrasil, например, посредством [[yggdrasil:mesh_setup|радио-линка]]), не смогут загрузить эти скрипты.\\
Исправим это, а заодно заблокируем лишнее (баннеры, счетчики и т.п.).
server {
listen [300:529f:150c:eafe::7]:80;
#установка заголовков, которые позволят понять серверу, что запросы пришли через прокси-сервер
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
sub_filter_once off; #нужно заменять все совпадения, не только первое
sub_filter_last_modified on; #сохранение поля Last-Modified в исходном ответе
location / {
proxy_set_header Accept-Encoding ""; # сообщаем серверу, что данные не нужно сжимать, иначе не будут работать фильтры sub_filter
sub_filter "https://static.smi2.net/" "$scheme://$host/staticsmi2net/";
sub_filter "//smi2.ru/" "//$host/smi2ru/";
sub_filter "https://www.interfax.ru/" "$scheme://$host/";
sub_filter "https://fonts.googleapis.com/" "$scheme://$host/ftsgapis/";
sub_filter "https://cdn.onthe.io/" "$scheme://$host/cdnontheio/";
#обрезаем лишнее
sub_filter "https://yastatic.net" "$scheme://$host/_empty";
sub_filter "//www.googletagmanager.com/" "//$host/_empty";
sub_filter "/js/prebid.min.js" "/_empty";
sub_filter "https://static.videonow.ru/" "$scheme://$host/_empty";
sub_filter "https://stats2.videonow.ru/" "$scheme://$host/_empty";
sub_filter "https://cdn.videonow.ru/" "$scheme://$host/_empty";
sub_filter "http://imasdk.googleapis.com/" "$scheme://$host/_empty";
sub_filter "https://s0.2mdn.net/" "$scheme://$host/_empty";
sub_filter "" "" "/ tns-counter.ru -->";
sub_filter "" "" "/Yandex.Metrika counter -->";
sub_filter "" "" " /Global site tag (gtag.js) - Google Analytics -->";
sub_filter "" "" "/noindex-->";
sub_filter "containerId: '" "containerId: '-";
sub_filter "/css/ads.css" "/_empty";
sub_filter "cntimg.src = \"/cnt/\" + cntParseReferer()" "cntimg.src = \"/_empty\"";
#скроем ненужные элементы
sub_filter "class=\"toplinks\"" "style=\"visibility: hidden;\"";
sub_filter "class=\"header__soc\"" "style=\"visibility: hidden;\"";
sub_filter "class=\"but__enter\"" "style=\"visibility: hidden;\"";
sub_filter "