🏠

自宅サーバーに入門した

に公開

はじめに

インフラの学習目的 + 興味で自宅サーバーをやってみた記事です。
ミニPCにUbuntu入れて、自宅サーバーを立ち上げ、独自ドメインでアクセスできるまでのプロセスを簡単にまとめました。

やったこと

ざっくり手順はこんな感じです。

  1. ミニPCを購入してUbuntuをインストール
  2. Nginxで簡易Webサーバーを立ち上げ
  3. 独自ドメインを取得してDNS設定
  4. ルーターでポート転送設定
  5. Let's EncryptでSSL化してHTTPS対応

資材の準備

主に使用した資材は以下です。合計で2万円くらいだったので割と低コストでできたと思います。

  • ミニPC
    • サーバーの本丸。Amazonでセール中だったこちらのミニPCを18000円ほどで購入しました。
      https://amzn.asia/d/1v6v5h1
  • USBメモリ
    • Ubuntuのインストーラーとして16GBのものを用意。こちらは近所の家電量販店で1000円程度で購入しました。
  • キーボード
  • マウス
    • 自宅に転がっていた有線のものがあったのでそれを利用

UbuntuをミニPCにインストール

まずは公式サイト: https://ubuntu.com/desktop から、最新の Ubuntu 24.04.2 LTS のISOファイルをダウンロードします。ダウンロード先は普段使っているMacのローカルです。

次に、ダウンロードしたISOファイルをUSBメモリに書き込みます。balenaEtcher というツールをMacにダウンロードして利用しました。直感的に使えるツールで、ISOファイルを選んでUSBメモリを指定するだけで書き込みが完了しました。

USBにISOを書き込み中

USBメモリをミニPCに挿し、電源をON。起動時にBIOS(または起動メニュー)を開いて、USBから起動するように設定します。すると「Try or Install Ubuntu」というメニューが表示されるので、それを選択。

あとはUbuntuのインストーラーの指示に従って進めるだけで、無事にクリーンインストールが完了しました。

Nginxの設定

CasaOSのような手軽にサーバーを立てられるツールもありますが、今回は勉強を兼ねて、Nginxを設定してみることにしました。

まずはUbuntuにNginxをインストールします。

sudo apt install -y nginx

次に、Nginxで表示するHTMLファイルを配置します。今回はシンプルに「こんにちは、自宅サーバー!」と表示されるだけのページを用意しました。

echo '<h1>こんにちは、自宅サーバー!</h1>' | sudo tee /var/www/html/index.html

続いて、Nginxの設定ファイル /etc/nginx/sites-available/default を確認します。アクセスしたときに文字化けしていたので文字コードの指定(charset utf-8;)も追加しておきます。

server {
    listen 80;
    server_name localhost;
    root /var/www/html;
    index index.html;
    charset utf-8;

    location / {
        try_files $uri $uri/ =404;
    }
}

設定が正しいかテストし、問題なければNginxをリロードして設定を反映させます。

sudo nginx -t && sudo systemctl reload nginx

最後に、同じネットワーク内の別の端末から、ミニPCのプライベートIPアドレスにブラウザでアクセスしてみたところ「こんにちは、自宅サーバー!」が表示されました!

ドメイン取得 / DNS設定

続いて、ドメインを設定していきます。
ドメインは お名前.com で取得しました。検索して、空いているもの(無料で使えるもの)を選ぶだけでOK。とても簡単に取得できて、めっちゃ便利です。

取得したドメインを自宅サーバーに紐づけるためのDNS設定を行います。まずは、自分のグローバルIPアドレスを確認します。

curl ipv4.icanhazip.com

取得したグローバルIPアドレスをもとに、お名前.comの管理画面にログインし、DNS設定からAレコードの項目にIPアドレスを登録します。ネームサーバーの設定も合わせて変更しました。

ある程度反映されるまでに時間がかかりますが、これで取得したドメイン名をブラウザに入力するだけで、自宅のミニPC(Nginxサーバー)にアクセスできるようになります。

ローカルIP固定/ルーター転送ルール設定

自宅サーバーをインターネット越しにアクセスできるようにするため、ローカルIPの固定をしてルーターにポート転送(ポートフォワーディング)の設定を追加します。

まず最初にやっておくべきなのが、サーバーのローカルIPアドレスを固定することです。これはUbuntuの netplan を編集することで設定できます。ローカルIPアドレスが毎回変わってしまうと、ルーターの転送ルールが意味をなさなくなるからです。サーバーを再起動するたびにアクセスできなくなることを防ぐためにも、ここはしっかりやっておきます。

まず現在のIPアドレスを確認します。

ip a

このコマンドで出力される中に、以下のような行があれば、サーバーの現在のIPアドレスが 192.168.1.19、ネットワーク帯が 192.168.1.0/24、そしてデフォルトゲートウェイが 192.168.1.1 であることがわかります。

3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
    inet 192.168.1.19/24 ...

この情報をもとに、/etc/netplan/90-NM-*.yaml の設定ファイルを編集します。

dhcp4: no
dhcp6: no
addresses:
  - 192.168.1.19/24
gateway4: 192.168.1.1
nameservers:
  addresses:
    - 8.8.8.8
    - 1.1.1.1

ポイントは以下の3つです:

  • DHCPを無効化して、自動割り当てを防ぐ
  • IPアドレスを直接指定する
  • デフォルトゲートウェイを明示する

この設定をしておくことで、毎回同じIPアドレスでサーバーが起動するようになります。自宅サーバーは必要なときだけ電源を入れる運用なので、アクセス先が毎回同じであることは重要です。

ローカルIPを固定できたら、次はルーター側の設定です。ルーターの管理画面にログインし、ポート転送と内部ホストの設定を追加します。

Nginxはポート80番でHTTPリクエストを受け付けているので、ルーター側でも 外部ポート80 → 内部ポート80(宛先は先ほど固定したローカルIPアドレス) という転送ルールを設定します。

これで外部からドメインを通じてアクセスしてきたリクエストが、自宅サーバーのNginxまで届くようになります。

SSL化

ドメインでアクセスできるようになったので、最後にSSL化します。Let's Encrypt を使って、無料のSSL証明書を取得し、Nginxに設定していきます。

まずは、指定したドメインに対して正しく反応するように、Nginxの設定ファイルに server_name を追加しておきます。

server {
    ...
    server_name <ドメイン名>;
    ...
}

次に、SSL証明書を発行してくれるツール certbot をインストールします。Nginxの設定を自動で行ってくれるプラグインも一緒に入れておきます。

sudo apt install certbot python3-certbot-nginx

準備ができたら、以下のコマンドを実行して証明書を取得&Nginxに自動反映させます。
このコマンドを実行すると、Let's Encrypt からSSL証明書が発行され、Nginxの設定ファイルに証明書のパスやHTTPS用のリスナー設定(ポート443)が自動で追加されます。

sudo certbot --nginx -d <ドメイン名>

最後に、ルーターのポート転送ルールをもう1つ追加します。今回はHTTPS用なので、外部ポート443 → 自宅サーバーのポート443 への転送ルールを設定します。

これで外からHTTPSでアクセスできるようになりました!

感想

スマホのWi-Fiを切って、5Gで自宅サーバーにアクセスできたときは、素直に嬉しかったです。こいつ(ミニPC)が今コンテンツ返してるんだなと思うとかわいく思えてきます。

実際にサーバーを構築してみると、手軽なわりにサーバーってこうなってるのかと解像度が高まりとても良い学習になりました。触ってみないと分からないこと、たくさんありますね。

今回の自宅サーバー構築を通じて、ここからさらに発展させていくことが楽しみです。

Discussion