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

只用滑鼠繪圖。
-—
我想從我擁有的家用伺服器託管我的網站,但直接暴露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通訊。
這可能仍然存在衝突。
最好更改埠,但我累了,所以稍後再做。
雖然完全沒有整理,但我還是把它作為備忘錄記錄下來,以免忘記。