家用服务器(Devuan + Apache)+WireGuard+VPS(FreeBSD + NGINX)反向代理备忘录

9 min

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

FzwZOZbaQAAEGS3.jpeg

只用鼠标画画。

——

我想用我自己的家用服务器托管我的网站,但直接暴露IP地址有点令人担忧。
而且,我无法从家里、从局域网内通过域名直接访问,最终发现这是因为我的家用路由器不具备NAT功能,所以无法实现。
从家里访问使用IP地址,从外面访问使用域名。这很不方便,所以我想,如果设置一个通过IP的VPN,是不是就能解决问题了?考虑到这两个优点,我尝试了一下。

结果,作为一个完全的门外汉,虽然过程很艰难,但使用反向代理似乎也能分散服务器负载,处理速度也变快了,结果非常令人满意。

然后,诹访子更新了一篇文章!
【数字自主】使用WireGuard从家用服务器进行托管的方法

我以前做过SSH连接,关于WireGuard,Arch Wiki上也有信息,所以进展顺利,但我将记录我遇到的问题以及为了将来迁移到另一个VPS而做的更改。
详情请参阅诹访子的页面。
由于内容与诹访子的基本相同,我将遵从其本人的删除请求。

这是我当前环境的备忘录。特别是Nginx,我可能会忘记,所以私下将其保留在网上。

VPS端设置

防火墙设置

/etc/pf.conf

set skip on lo
exsrv1 = 分配给VPS机器的全局IP地址
insrv1 = 192.168.10.101 #WireGuard上VPS的私有IP?
#insrv2 = 192.168.10.102 #WireGuard上VPS的私有IP?如果有其他要连接的设备则添加

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 = 输入在VPS上通过wg genkey生成的内容
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默认上传文件大小为1MB,即使在家用服务器端设置了更大的上传文件大小,如果Nginx没有相应配置,也无法正常工作,我花了一段时间才意识到这一点。

然后,我发现如果zone设置在一起会报错,所以用mkdir创建了文件夹,并为每个zone分开了缓存文件夹。

然后,我还在Nginx和家用服务器之间进行了SSH连接。

家用服务器端设置(Apache2)

/etc/wireguard/wg0.conf

[Interface]
PrivateKey = # 输入在家用服务器上通过wg genkey生成的内容
ListenPort = 51820
Address = 192.168.10.101/24 # WireGuard上这台机器的私有IP
DNS = 8.8.8.8

[Peer]
PublicKey = # 输入在VPS上通过wg genkey生成的内容
PreSharedKey = # 输入家用服务器的PreSharedKey,通过wg genkey生成的内容
Endpoint =  # VPS的全局IP地址 :51820
AllowedIPs = 192.168.10.0/24 
PersistentKeepalive = 25

我曾在这个WireGuard设置上陷入困境,因为不设置DNS就无法连接。
我暂时使用了Google的DNS,但等我恢复正常后可能会更改。

以及一些杂项记录

如果保持上述设置,多域名将无法工作,即使注册了第二个域名,也只会显示第一个域名。即使更改端口也不行,我当时很困惑,后来才发现我没有在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