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

Рисование только мышью.
-—
Я хотел бы разместить свой сайт на своем домашнем сервере, но мне немного страшно, что мой 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-соединение.
Вероятно, это все еще конфликтует.
Лучше бы изменить порт, но я устал, так что сделаю это позже.
Это совсем не организовано, но я оставлю это как заметку, пока не забыл.