Memorando sobre como configurar um proxy reverso com servidor doméstico (Devuan + Apache) + WireGuard + VPS (FreeBSD + NGINX)

Desenhar apenas com o mouse.
-—
Gostaria de hospedar meu próprio site a partir do meu servidor doméstico, mas é um pouco assustador ter meu endereço IP exposto.
E não consegui acessar diretamente do meu domínio, da minha LAN, ou de casa, e cheguei à conclusão de que isso era impossível porque meu roteador doméstico não tinha funcionalidade NAT.
Acessar de casa via endereço IP e de fora via domínio. Isso é inconveniente, então pensei que configurar uma VPN via IP poderia resolver o problema? Havia dois benefícios, então tentei.
No final, como sou um completo amador, foi difícil, mas usar um proxy reverso também pareceu distribuir a carga do servidor, acelerando o processamento, e fiquei muito satisfeito com o resultado.
Então, Suwako-san atualizou um artigo!
【Autonomia Digital】Como hospedar usando WireGuard a partir de um servidor doméstico
Já fiz conexões SSH no passado, e como há informações sobre WireGuard na Arch Wiki, consegui fazê-lo sem problemas, mas vou registrar as partes onde tive dificuldades e as alterações que fiz para backup, caso eu me mude para outro VPS.
Para mais detalhes, consulte a página de Suwako-san.
É quase idêntico ao de Suwako-san, então seguirei qualquer solicitação de exclusão dela.
Isto é para registrar minhas notas sobre o ambiente acima. Deixarei isso na web para mim, especialmente porque provavelmente esquecerei o nginx.
Configurações do lado do VPS
Configurações do Firewall
/etc/pf.conf
set skip on lo
exsrv1 = Endereço IP global atribuído à máquina VPS
insrv1 = 192.168.10.101 #IP privado no VPS para Wireguard?
#insrv2 = 192.168.10.102 #IP privado no VPS para Wireguard? Adicionar se houver outros para conectar
block return
pass
#Abrir a porta 51820/UDP usada no Wireguard
pass in on wg0
pass in inet proto udp from any to any port 51820
# Para conexão SSH WireGuard 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 = Inserir o que foi gerado com wg genkey no VPS
ListenPort = 51820
[Peer]
PublicKey = Inserir o que foi gerado com wg genkey no servidor doméstico
PreSharedKey = Idem
AllowedIPs = 192.168.10.101/32
PersistentKeepalive = 25
*/nginx.conf
Provavelmente está uma bagunça, mas está funcionando, então está bom!
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 #Nome do domínio;
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;
# Cachear apenas conteúdo estático
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 # Certificado SSL;
ssl_certificate_key #Idem
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;
# Cachear apenas conteúdo estático
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;
# Cachear apenas conteúdo estático
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 # Certificado SSL;
ssl_certificate_key #Idem
location / {
proxy_pass http://192.168.10.101; # Por favor, substitua pelo endereço IP do destino do proxy reverso
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;
# Cachear apenas conteúdo estático
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;
}
}
}
Estou tentando acelerar as coisas colocando o cache neste VPS. Se houver problemas, pretendo parar.
O que realmente me pegou foi aqui:
client_max_body_size 500M;
Demorei um pouco para perceber que, embora eu pudesse aumentar o tamanho do arquivo de upload no meu servidor doméstico, o nginx por padrão só permite uploads de até 1MB, e se o nginx não estiver configurado corretamente, não funcionará.
Então, como a configuração de zona causou um erro quando estava tudo junto, criei pastas com `mkdir` e separei as pastas de cache para cada uma.
Além disso, configurei a conexão SSH entre nginx e o servidor doméstico.
Configurações do lado do servidor doméstico (Apache2)
/etc/wireguard/wg0.conf
[Interface]
PrivateKey = #Inserir o que foi gerado com wg genkey no servidor doméstico
ListenPort = 51820
Address = 192.168.10.101/24 #IP privado desta máquina no Wireguard
DNS = 8.8.8.8
[Peer]
PublicKey = #Inserir o que foi gerado com wg genkey no VPS
PreSharedKey = #Inserir a PreSharedKey do servidor doméstico gerada com wg genkey
Endpoint = #Endereço IP global do VPS :51820
AllowedIPs = 192.168.10.0/24
PersistentKeepalive = 25
Uma vez, fiquei preso nesta configuração do Wireguard porque não conseguia conectar sem configurar o DNS.
Estou usando o DNS do Google temporariamente, mas provavelmente mudarei quando tiver mais energia.
E algumas notas diversas
Com as configurações acima, o multi-domínio não funcionava; mesmo registrando um segundo domínio, apenas o primeiro era exibido. Mudar a porta também não ajudou, e eu me perguntava por que, até que percebi que não havia selecionado o diretório de destino do novo domínio em apache2.conf.
<Directory */Onde estão os arquivos do novo domínio/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
</Directory>
Posso considerar que isso permitiu a separação?
Além disso, ao usar um proxy reverso com WordPress por padrão, houve confusão com a autenticação SSL, onde o site era exibido corretamente via HTTP, mas o CSS parava de funcionar com conexões HTTPS. Eu me perguntava por que, e parece que isso pode ser resolvido adicionando o seguinte ao wp-config:
$_SERVER['HTTPS']='on';
Havia outros métodos, mas este foi o que funcionou melhor, pois outros faziam com que a tela de login mudasse repentinamente para comunicação HTTP.
Provavelmente ainda há conflitos com isso.
Seria melhor mudar a porta, mas estou cansado, então farei isso depois.
Não está nada organizado, mas vou deixar isso como um memorando para não esquecer.