自宅鯖(Devuan + Apache)+WireGuard+VPS(FreeBSD + NGINX)でリバースプロキシを行う備忘録

6 min read

FzwZOZbaQAAEGS3.jpeg

マウスだけでお絵描き。

----

せっかくある自宅サーバーから自分のサイトをホスティングしたいけど、IPアドレスがもろに出てしまうのはちょっと怖いです。
そして自宅から、LAN内からドメインから直接アクセスすることができずにこれは自宅ルーターがNAT機能を搭載していないことから無理なのだという結果に落ち着きました。
自宅からアクセスはIPアドレス、外ではドメインから。これでは不便なのでIPを介するVPNを設定すれば解決できるのでは?という2つのメリットがあったので行ってみました。

結果的にはこんなずぶの素人なので、大変ではありましたがリバースプロキシを利用するとサーバー負荷の分散にもなるようで処理も高速になりとても満足する結果となりました。

そしたら、諏訪子さんが記事を更新していました!
【デジタル自主】自宅サーバーから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までということで自宅鯖側での設定でアップロードできるファイルサイズ大きくても、nginxも設定できていないと正しく動作しないことに気づくまでにしばらく掛かりました。

そして、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

一回このWiregurd設定で沼ったのはDNS設定しないと繋がりませんでした。
仮でGoogleのDNSを使ってますが多分元気戻ったら変えます。

そして雑記で細々としたこと

上記設定のままではマルチドメインで動作せず2つ目のドメインを登録しても表示されるのは1つ目のドメイン。ポートの変更をしてもだめなのでなんでだろうと思っていたら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通信になったりしてこれが一番うまく行った方法でした。

多分これでも競合しているはず。
ポート変更したほうがいいが、疲れたので後でします。

全くまとまっていないですが、忘れないうちに備忘録として残しておきます。