====== Проксирование 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 "