Заметки о настройке обратного прокси с домашним сервером (Devuan + Apache) + WireGuard + VPS (FreeBSD + NGINX)

13 min

language: ja bn en es hi pt ru zh-cn zh-tw

FzwZOZbaQAAEGS3.jpeg

Рисование только мышью.

-—

Я хотел бы разместить свой сайт на своем домашнем сервере, но мне немного страшно, что мой IP-адрес будет полностью виден.
Кроме того, я не мог получить прямой доступ к нему из дома, из локальной сети или по доменному имени, и пришел к выводу, что это невозможно, потому что мой домашний маршрутизатор не имеет функции NAT.
Доступ из дома осуществляется по IP-адресу, а извне — по доменному имени. Это неудобно, поэтому я подумал, что настройка VPN через IP может решить эту проблему? Учитывая эти два преимущества, я решил попробовать.

В итоге, будучи полным новичком, это было сложно, но использование обратного прокси, похоже, также распределяет нагрузку на сервер, ускоряя обработку, и я остался очень доволен результатом.

Затем Сувако обновила свою статью!
【Цифровая автономия】Как разместить сайт с домашнего сервера с помощью WireGuard

Я уже делал SSH-подключения раньше, и что касается WireGuard, информация есть в Arch Wiki, так что я справился без особых проблем, но я запишу те моменты, где я застрял, и изменения, которые я внес для резервного копирования на случай перехода на другой VPS.
Подробности смотрите на странице Сувако.
Поскольку это почти то же самое, что и у Сувако, я буду следовать ее запросам на удаление.

Это для моих заметок в вышеуказанной среде. Я оставлю это в сети для себя, так как я, вероятно, забуду про nginx.

Настройки на стороне VPS

Настройки брандмауэра

/etc/pf.conf

set skip on lo
exsrv1 = Глобальный IP-адрес, назначенный машине VPS
insrv1 = 192.168.10.101 #Приватный IP на VPS для WireGuard?
#insrv2 = 192.168.10.102 #Приватный IP на VPS для WireGuard? Добавить, если есть другие подключаемые объекты

block return
pass

#WireGuard использует порт 51820/UDP, поэтому откройте его
pass in on wg0
pass in inet proto udp from any to any port 51820

# Для SSHWireGuard SSH-подключения
pass in on wg0 proto tcp from 192.168.10.0/24 to any port 22
block in on egress proto tcp from any to any port 22

/etc/wireguard/wg0.conf

[Interface]
Address = 192.168.10.1/24
PrivateKey = Введите ключ, сгенерированный wg genkey на VPS
ListenPort = 51820

[Peer]
PublicKey = Введите ключ, сгенерированный wg genkey на домашнем сервере
PreSharedKey = То же самое
AllowedIPs = 192.168.10.101/32
PersistentKeepalive = 25

*/nginx.conf
Вероятно, это полный беспорядок, но работает, так что сойдет!

worker_processes  1;

events {
    worker_connections  4096;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile on;
    tcp_nopush on;
    keepalive_timeout  300;
    
proxy_buffering on;
proxy_buffer_size     8k;
proxy_buffers         100 8k;
   proxy_cache_path              /var/cache/nginx/cache/zone1 levels=1:2 keys_zone=zone1:64m inactive=7d max_size=2048m;
    proxy_cache_path              /var/cache/nginx/cache/zone2 levels=1:2 keys_zone=zone2:64m inactive=7d max_size=2048m;
        proxy_cache_path              /var/cache/nginx/cache/zone3 levels=1:2 keys_zone=zone3:64m inactive=7d max_size=2048m;
            proxy_cache_path              /var/cache/nginx/cache/zone4 levels=1:2 keys_zone=zone4:64m inactive=7d max_size=2048m;
  proxy_temp_path               /var/cache/nginx/temp;


server {
    listen 80;
    server_name #Имя домена;
        client_max_body_size 10240M;

    location / {
        proxy_pass http://192.168.10.101/;
        proxy_set_header Host $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;
        
         # Кэшировать только статический контент
                if ($uri ~* "\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)$") {
                    set $do_not_cache 0;
                }

                proxy_no_cache          $do_not_cache;
                proxy_cache_bypass      $do_not_cache;

                proxy_cache             zone1;
                proxy_cache_key         $scheme$proxy_host$uri$is_args$args;
                proxy_cache_valid       200 201 6h;
                proxy_cache_valid       302 3h;
                proxy_cache_valid       301 1d;
                proxy_cache_valid       404 5m;
                proxy_cache_lock        on;
                proxy_buffering         on;
        
    }
}

server {
    listen 443 ssl;
    server_name Имя домена;
        client_max_body_size 10240M;


    ssl_certificate # SSL-сертификат;
    ssl_certificate_key #То же самое

    location / {
        proxy_pass http://192.168.10.101;
        proxy_set_header Host $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;
        
                        # Кэшировать только статический контент
                if ($uri ~* "\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)$") {
                    set $do_not_cache 0;
                }

                proxy_no_cache          $do_not_cache;
                proxy_cache_bypass      $do_not_cache;

                proxy_cache             zone2;
                proxy_cache_key         $mobile$scheme$proxy_host$uri$is_args$args;
                proxy_cache_valid       200 201 6h;
                proxy_cache_valid       302 3h;
                proxy_cache_valid       301 1d;
                proxy_cache_valid       404 5m;
                proxy_cache_lock        on;
                proxy_buffering         on;
    }
}



server {
    listen 80;
    server_name soulminingrig.com;
    client_max_body_size 500M;

    location / {
        proxy_pass http://192.168.10.101;
        proxy_set_header Host $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;
        
                        # Кэшировать только статический контент
                if ($uri ~* "\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)$") {
                    set $do_not_cache 0;
                }

                proxy_no_cache          $do_not_cache;
                proxy_cache_bypass      $do_not_cache;

                proxy_cache             zone3;
                proxy_cache_key         $mobile$scheme$proxy_host$uri$is_args$args;
                proxy_cache_valid       200 201 6h;
                proxy_cache_valid       302 3h;
                proxy_cache_valid       301 1d;
                proxy_cache_valid       404 5m;
                proxy_cache_lock        on;
                proxy_buffering         on;
    }
}


server {
    listen 443 ssl;
    server_name soulminingrig.com www.soulminingrig.com;
    
        client_max_body_size 500M;

    ssl_certificate # SSL-сертификат;
    ssl_certificate_key #То же самое
    

    location / {
        proxy_pass http://192.168.10.101;  # Пожалуйста, замените на IP-адрес назначения обратного прокси
        proxy_set_header Host $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;
        
                        # Кэшировать только статический контент
                if ($uri ~* "\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)$") {
                    set $do_not_cache 0;
                }

                proxy_no_cache          $do_not_cache;
                proxy_cache_bypass      $do_not_cache;

                proxy_cache             zone1;
                proxy_cache_key         $mobile$scheme$proxy_host$uri$is_args$args;
                proxy_cache_valid       200 201 6h;
                proxy_cache_valid       302 3h;
                proxy_cache_valid       301 1d;
                proxy_cache_valid       404 5m;
                proxy_cache_lock        on;
                proxy_buffering         on;
    }
}

    }

Я пытаюсь ускорить работу, разместив кэш на этом VPS. Планирую прекратить, если возникнут проблемы.
Особенно меня зацепило вот что:
client_max_body_size 500M;
Мне потребовалось некоторое время, чтобы понять, что по умолчанию размер загружаемого файла в nginx составляет 1 МБ, и даже если настройки на домашнем сервере позволяли загружать файлы большего размера, это не будет работать правильно, если nginx не настроен.

Кроме того, я получил ошибку, когда объединил настройки зон, поэтому я создал папки с помощью mkdir и разделил папки кэша для каждой.

И я также настрою SSH-соединения между nginx и домашним сервером.

Настройки на стороне домашнего сервера (Apache2)

/etc/wireguard/wg0.conf

[Interface]
PrivateKey = #Введите ключ, сгенерированный wg genkey на домашнем сервере
ListenPort = 51820
Address = 192.168.10.101/24 #Приватный IP для этой машины в WireGuard
DNS = 8.8.8.8

[Peer]
PublicKey = #Введите ключ, сгенерированный wg genkey на VPS
PreSharedKey = #Введите PreSharedKey, сгенерированный wg genkey на домашнем сервере
Endpoint =  #Глобальный IP-адрес VPS :51820
AllowedIPs = 192.168.10.0/24 
PersistentKeepalive = 25

Однажды я застрял с этой настройкой WireGuard, потому что она не подключалась без настроек DNS.
Я временно использую DNS Google, но, вероятно, изменю его, когда вернусь к этому.

И разные заметки

При вышеуказанных настройках он не работал с несколькими доменами; даже если я регистрировал второй домен, отображался только первый. Изменение порта также не помогло, и я задавался вопросом, почему, пока не понял, что не выбрал каталог нового домена в apache2.conf.

<Directory */где находятся файлы нового домена/>
#	Options Indexes FollowSymLinks
#	AllowOverride None
#	Require all granted
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
</Directory>

Правильно ли я понимаю, что это позволило разделить?

Кроме того, при использовании обратного прокси с WordPress по умолчанию возникала путаница с SSL-аутентификацией: по HTTP все отображалось правильно, но при HTTPS-соединении CSS переставал работать. Я задавался вопросом, почему, и, похоже, это можно было решить, добавив следующее в wp-config.

$_SERVER['HTTPS']='on';

Были и другие методы, но этот оказался наиболее успешным, так как другие иногда приводили к тому, что экран входа внезапно переключался на HTTP-соединение.

Вероятно, это все еще конфликтует.
Лучше бы изменить порт, но я устал, так что сделаю это позже.

Это совсем не организовано, но я оставлю это как заметку, пока не забыл.

Related Posts