はじめに
「性能が低いVPSじゃないと料金高すぎる…」と「自宅に余ってるノートPCをサーバーにして遊びたいけどポート開放、IP固定化とか面倒だからしたくない…」その悩みを、TailscaleとNginxのリバースプロキシで解決しました。
初心者が書いてる記事です。半分備忘録で書いてます...
構成
- VPS: CPU1コア,メモリ1GB ドメインとSSL証明書を保持
- 自宅ノートPC: メモリ8GB 実際のサービスをDocker等で動かす
- トンネル(Tailscale): 固定IP不要・ポート開放不要で両者を接続
1.tailscaleを作る
まず、両方のサーバーにTailscaleをインストールしてログイン
Tailscale Download Linux
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4
上記のコマンドで出てきたTailscaleのIPをメモってください。
2.自宅サーバー側のNginxの設定
/etc/nginx/conf.d/default.confをいじります。
複数のサービスをポート別に公開したい場合、Nginxでポートごとに server ブロックを分けます。
# 8080ポート: サービスA (note)
server {
listen 8080;
location / {
root /var/www/note;
index index.html;
}
}
# 7000ポート: サービスB (app)
server {
listen 7000;
location / {
root /var/www/app;
index index.html;
}
}
sudo nginx -t
sudo sudo systemctl reload nginx
上記のコマンドで設定ファイルの構文チェックと設定変更を適応させてください。
3.VPS側の設定
VPSに届いたリクエストを、Tailscale経由で自宅サーバーへ飛ばします。
location /note/ {
proxy_pass http://100.70.123.4:8080/; # 末尾の / が重要!
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;
}
location /app/ {
proxy_pass http://100.70.123.4:7000/;
# 以降、同様のヘッダー設定
}
※各自で証明書・ドメインなどの設定をしてください。
sudo nginx -t
sudo sudo systemctl reload nginx
自宅サーバーと同様に、上記のコマンドで設定ファイルの構文チェックと設定変更を適応させてください。
4.確認
Step1: 自宅サーバー側でテスト用のサーバーを立てる
# 確認用の簡易コマンド (自宅サーバー側で実行)
python3 -m http.server 8080 --bind 0.0.0.0
※注意点:python3 -m http.server は、実行したディレクトリ内のファイルがすべてブラウザから丸見えになります。本番環境でそのまま使い続けるのは非常に危険です。疎通確認できたらすぐ終了させてください。
Step2: VPSから自宅ノートPCを叩く
次に、VPSのターミナルから自宅ノートPCのTailscale IPに対してリクエストを送ります。
curl -I http://100.70.123.4:8080/
HTTP/1.1 200 OK が返ってきたら成功!:VPSと自宅PCの間のトンネルは開通しています。
Failed to connect になる場合:TailscaleのACL設定、または自宅PCのファイアウォール(ufw)で止まっています。
Step 3: VPSのNginx越しに叩く
最後に、VPSのドメイン経由でアクセスできるか確認します。
curl -I https://あなたのドメイン.com/note/
⚠注意点
ハマるポイントその1:ACLタグ
マシンにタグ(例:tag:server)を付けている場合、デフォルトでは通信が遮断されます。Tailscale管理画面のACLに以下を追記する必要があります。ポートを追加する場合は"dst"にtagを追加してください。自分はNextcloud用にタグが付けてあったので意味がわからず困惑しました。
"acls": [
{
"action": "accept",
"src": ["autogroup:member"],
"dst": ["tag:server:8080", "tag:server:7000"],
}
]
ハマるポイントその2:ファイアウォール
自宅サーバー側でufwを使っている場合、ポートを許可してください。502 Bad Getewayになります。
sudo ufw allow 8080/tcp
ハマるポイントその3:待ち受けアドレス
アプリを起動する際、localhost (127.0.0.1) だけで待機していると外部から繋がりません。必ず 0.0.0.0(すべてのインターフェース)で待ち受けるように設定してください。
# 確認用の簡易コマンド (自宅サーバー側で実行)
python3 -m http.server 8080 --bind 0.0.0.0
※注意点:python3 -m http.server は、実行したディレクトリ内のファイルがすべてブラウザから丸見えになります。本番環境でそのまま使い続けるのは非常に危険です。あくまで確認用として使い、確認が終わったら自分のアプリ(Docker,Python)に切り替えましょう。
Cloudflare Tunnel ではなく Tailscale を選んだ理由
自宅サーバー公開の定番といえば Cloudflare Tunnel ですが、今回はあえて Tailscale + VPSリバースプロキシ を選びました。
1. 既存ドメインとSSLの流用
すでにVPS側で取得済みのドメインや、Nginxで設定したSSL証明書をそのまま使いたかったためです。
2. ネットワークの透過性
Tailscaleなら、VPSから自宅サーバーへは「同じLAN内にいる」かのようにアクセスできます。
ポートを変えて複数のサービスを立てる際も、VPS側のNginxの設定ファイルを一行書き換えるだけで完結し、デバッグ(curlやpingでの疎通確認)も非常に容易でした。
3. VPSの「看板」としての活用
1GBの低スペックVPSでも、Nginxの中継機能だけなら負荷はほぼゼロです。
「看板(VPS)は固定して、中身(自宅PC)を自由に入れ替える」という運用が、Tailscaleのおかげで非常にスムーズになりました。
おわりに
この構成なら、月額数百円のVPSひとつで、自宅の強力なリソースを安全に世界へ公開できます。メモリ管理など気にせず大量にサービスを公開できます。自宅のネットワークが微妙でも案外早く応答します。