に公開
自宅サーバーを建ててから半年が経ちました。実際に運用してみての知見などを記事にしてみます。
(建てた当時の投稿: https://w.cho-ice.xyz/blog/tateta-ouchi-server )
自分は普段フロントエンドを中心にやっているので、インフラ周りは初心者です。変なことを言っていたらすみません。その時はX(https://x.com/_avaice)で教えていただけると幸いです🙇♂️
サーバー構成

建てた当初と構成に大きな変わりはありませんが、サーバー機を買い替えました。
(普段使っているメインPCが故障したので当時のサーバー機がメインPCに昇格しました...。)
新しいサーバー機はIntel N100搭載のミニPCで、メモリ16GB, SSD512GBで2万円強でした。静かだし安いしパフォーマンスも今のところは意外と気になっていないので満足しています。

今日も元気に稼働中☆
自宅サーバーでやってみたこと
2段プロキシをした
ユーザーがWebアプリサーバーに接続するまでの流れは以下のようになります。
(ここでは例として、app1.cho-ice.xyz
というURLにアクセスしています。)

- ユーザーが
app1.cho-ice.xyz
にアクセスする - リバースプロキシがリクエストを受け取り、
123.456.789.0:8080/App1
(自宅サーバー)へProxyする - 自宅サーバーがリクエストを受け取り、
localhost:3000
へProxyする - App1に繋がった!!😃
ここで特徴的だと思っているのが、リバースプロキシサーバーと自宅サーバーの2段でリクエストのプロキシをしているところです。
この2段プロキシの手法を使えば、いくらサーバーのコンテナを動かしていてもリバースプロキシからは123.456.789.0:8080/{アプリ名}
のような感じにアクセスすれば良いので、自宅サーバー側で開けるポートは1つで済みます。
プロキシを多重にすることによって多少のオーバーヘッドはあるかと思いますが、セキュリティの懸念となりそうな穴はできるだけ塞いだ状態で運用したいと思い、このようにしました。(そもそもインフラ初心者が自宅サーバーを建てること自体が脆弱じゃないか!というツッコミは勘弁してください🥺)
結果、何かあったらポート1つ閉じれば通信を遮断できる状態にできていますし、「もう使ってないポートが開いたまま!」みたいな事も未然に防げているかと思います。
また、自宅サーバーはUFW(Uncomplicated Firewallの略らしい)を使ってリバースプロキシ以外からの接続は全部遮断しています。これにより、外部からは直接アクセスできないようになっています。
パフォーマンスを最適化した
サーバーレスポンスの鮮度がそこまで重要でないアプリケーションは、リバースプロキシでレスポンスのキャッシュをしました。
例えば、某社のコーディング試験問題(https://notion.yumemi.co.jp/採用関連資料公開/フロントエンドコーディング試験)を自宅サーバーにデプロイした時を例に説明します。
これは現在以下にアクセスすると実際に確認できます。
都道府県別の総人口推移を表示するWebアプリです。
この「都道府県別の総人口推移」データは日々変わるものでもないのですが、サーバー側で外部APIを参照するので取得に200msくらいかかります。
そこで、NGINXで以下のように設定しました。
proxy_pass {アプリケーションをデプロイした先のアドレス};
proxy_cache zone1;
proxy_cache_valid 200 12h;
proxy_cache_use_stale updating;
proxy_cache_lock on;
12時間はリバースプロキシ側でデータをキャッシュしてくれるようになり、また、キャッシュしてから12時間経過した場合もstale-while-revalidate(一度古いデータを返してその間に裏で新しいキャッシュを作る挙動。詳細: https://datatracker.ietf.org/doc/html/rfc5861)しています。
実際にアクセスしていただければわかりますが、大体20msくらいに応答速度を改善できています。10倍の速度改善です!
こういうチューニングができるのも自分でサーバーを建てる醍醐味かな〜と思いました!
その他細かいこと
電気代
サーバーは24時間稼働なので、電気代がどのくらい上がるのか気になっていましたが、昨年とたいして変わりませんでした。これはIntel N100というTDP6W(参考: Ryzen7 5700Xは65W)の省電力なCPUを使ったサーバーだからかと思います。
バックアップどうしよう問題
これは最初の方に貼った、自宅サーバーを建てた当時の記事でも悩んでいましたが、結果として以下のような形に落ち着きました。
- データのバックアップは諦めた
- 飛んだら困るデータは置かないようにしました。あくまでアプリケーションのデプロイ先としてだけ使っています。
- 稼働率の保証も諦めた
- 個人サーバーですし、別に落ちたら迷惑がかかるようなものもデプロイしていないので、諦めました。
ただ、これらは解決すべきテーマとしては面白いと思うので、今後考えていこうと思います。
どこに置こう問題
これもサーバーを建てた当時悩んでいましたが、小さくて静かで熱もそんなに持たないので、普通に机の上に置いています。ベストプラクティスがあったら教えてください。
おわりに
最近は世の流れ的にクラウドが中心なので実際にサーバーを建てようと思うきっかけはなかなかないですが、やってみたら意外と面白いです!
特にセキュリティやサーバー側のパフォーマンスチューニング等は普段触れづらい部分ではあるので、いろいろ勉強になっています。
また何か知見が溜まったら記事にしたいと思います〜。
記事についてご意見、ご感想がありましたらぜひX(https://x.com/_avaice)までお願いします😖