NGINX & APACHE2

Reverse proxy с NGINX на Apache2

от автора

в

Задача

Есть два сервера: «Сервер 1» и «Сервер 2».1 Оба сервера работают под управлением Debian 12.

«Сервер 1» и «Сервер 2» связаны с помощью VPN Wireguard.

«Сервер 1» доступен только в локальной сети, на нем вертится сайт на Apache2 с доменным именем mysite.ru, прописанным в конфиге. IP-адрес в сети VPN — 10.0.0.2.

«Сервер 2» доступен из Интернета, с белым IP-адресом. На него ведет доменное имя mysite.ru. IP-адрес в сети VPN — 10.0.0.1.

Нужно настроить на «Сервер 1» шифрование трафика и сделать сайт доступным из Интернета. Также, сделать переадресацию пользователей на зашифрованное соединение.

Сервер 2

Для решения задачи на «Сервер 2» ставим nginx.

root@server2:/# apt-get install nginx

Создаем файл конфигурации для nginx.

root@server2:/# nano /etc/nginx/sites-available/00-mysite.ru

server {
  server_name mysite.ru;
  listen 80;
  location / {
    proxy_pass http://10.0.0.2:80;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

server {
  server_name mysite.ru;
  listen 443;
  location / {
    proxy_pass https://10.0.0.2:443;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Перезагружаем nginx.

root@server2:/# systemctl restart nginx.service

В результате, все запросы к mysite.ru по http и https (80 и 443 порты) будут по VPN переданы на «Сервер 1». Если открыть сайт http://mysite.ru, то он уже будет работать. Теперь надо настроить шифрование соединения пользователя с сайтом.

Сервер 1

Приведу пример конфига apache2 сайта mysite.ru:

root@server1:/# cat /etc/apache2/sites-available/mysite.ru.conf

<VirtualHost *:80>
    ServerName mysite.ru
    DocumentRoot /srv/www/mysite.ru
    <Directory /srv/www/mysite.ru>
        Options FollowSymLinks
        AllowOverride Limit Options FileInfo
        DirectoryIndex index.php
        Require all granted
    </Directory>
</VirtualHost>

На «Сервер 1» ставим скрипт certbot для получения бесплатного сертификата от Let’s Encrypt.

root@server1:/# apt-get install certbot python3-certbot-apache

Запускаем certbot и следуем его инструкциям.

root@server1:/# certbot

В процессе работы certbot будет выдан сертификат для сайта mysite.ru, проверена доступность этого сайта и изменен конфиг apache2 для переадресации с http на https.

Задача решена

Сайт, доступный только в локальной сети, теперь доступен и из Интернета по шифрованному соединению. При этом, осуществляется редирект с http на https.

  1. К примеру, домашний сервер как «Сервер 1» и дешевый арендованный VDS с минимальной памятью как «Сервер 2» ↩︎