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

13 min

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

FzwZOZbaQAAEGS3.jpeg

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.

Related Posts