使用家用伺服器 (Devuan + Apache) + WireGuard + VPS (FreeBSD + NGINX) 進行反向代理的備忘錄

9 min

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

FzwZOZbaQAAEGS3.jpeg

只用滑鼠繪圖。

-—

我想從我擁有的家用伺服器託管我的網站,但直接暴露IP位址有點可怕。
而且我無法從家裡、從LAN內部直接透過網域存取,結果發現這是因為我的家用路由器沒有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 #WiregurdでのVPS上のプライベートIP?
#insrv2 = 192.168.10.102 #WiregurdでのVPS上のプライベートIP?他に接続する物があれば追加する

block return
pass

#Wiregurd上でポート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),它也無法正常工作。

然後,由於zone設定放在一起會導致錯誤,所以我用mkdir創建了資料夾,並將每個快取資料夾分開。

然後,我也在nginx和家用伺服器之間設定了SSH連線。

家用伺服器端的設定(Apache2)

/etc/wireguard/wg0.conf

[Interface]
PrivateKey = #自宅鯖上でwg genkeyで発行されたものを入力
ListenPort = 51820
Address = 192.168.10.101/24 #Wiregurd上でのこのマシンでのプライベート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