Raspberry Piとnginxでwebページを公開してみる

はじめに

この記事はフィヨルドブートキャンプ Part 1 Advent Calendar 2022 - Adventarの6日目の記事です。
昨日はトミーさんの2年半無職→ハイブリッド出社のWebエンジニアになってから買ったものリストでした。 フィヨルドブートキャンプの今年のアドベントカレンダーはこちらです。

憧れてたんですよね、アドベントカレンダー
FBCでもやってるよってことで勢いで参加しちゃいましたが、上手にアドベントできるかな!?

nginxの学習をしました

Fjord Boot CampのプラクティスでnginxをDebianにインストールしました。
次はVirtualHostを使って複数ドメインの登録の方法も学ぶことになるのですが、そのためには外部に公開するwebサーバーが必要になります。
これまで学んだ知識にちょっとプラスしたら、家で暇そうにしてるラズパイちゃんが自宅サーバーになるのでは?と考え挑戦してみることにしました。
やってみるとあちこちで躓き、nginx、ラズパイ(linux)、ルータードメイン、ネームサーバーと複合的な知識が必要になるのでなかなかやりごたえのある内容でした。
以下、やったことの記録になります。
ちなみにですが、この記事ではnginxの設定ファイルの中身を公開していますので、プラクティスで今まさにそこをやっている方は注意してください。
そしてFBCのプラクティスでこの設定をそのまま提出すると再提出になりますのでそこも注意してください。

前提

お名前ドットコムでドメイン(今回はrira100000000.com)を取得しています。
今回使ったのはRaspberry Pi2 Bです。
最近のモデルと比べるとWi-Fiがなかったりするので若干作業内容が変わるかもしれません。

初期設定

とりあえず0からやりたいのでラズパイを初期化します。
Raspberry pi imager を使えば簡単に初期化、インストールができます。 Raspberry Pi OS – Raspberry Pi

ssh接続の有効化

メインPCから接続、操作できるようにします。
手順はこちらのページがわかりやすかったです。
ラズベリーパイをリモート操作(SSHコマンド)

セキュリティ設定

ラズパイ3(Raspberry Pi)で自宅webサーバー構築してみた
こちらの記事に従いセキュリティ対策をします。

  • デフォルトユーザーpiがいないことを確認
  • ssh接続のポートをデフォルトの22番から変更
  • ssh接続に公開鍵認証を設定
  • /etc/hosts.allowと/etc/hosts.allowでローカルからのみssh接続を許可
  • ファイアウォールのインストールと設定

nginxのインストール

コマンドラインからnginxをインストールします。
sudo apt install nginx

nginxの実行

サーバーを起動させます。
sudo /etc/init.d/nginx start

webページにアクセスしてみる

ifconfigコマンドでIPアドレスを調べます。

赤枠部分がIPアドレスです
ブラウザからIPアドレスにアクセスしてみます。
ブラウザにIPアドレスを入力する

無事表示されました!
同一LAN内限定ですが、webサーバーを使ったページの公開ができました。
ここまではとっても簡単!そう、ここまではね・・・!

サーバーを公開する

ここからは一般的なwebページのようにインターネット上に公開する手順です。

プライベートIPを固定する。

IPアドレスグローバルIPとプライベートIPの2種類あります。
まずはプライベートIPの固定をします。
※この作業は使っているルーターによって画面の操作方法などが異なります。
ifconfigラズベリーパイのMACアドレスを調べます。

ラズパイのMACアドレスを調べる
次に、ルーターの管理画面からDHCP固定割り当て設定を行います。
ルーターのメーカーにより名称が異なる場合がありますが、プライベートIPをMACアドレスに紐づけて登録するのがポイントです。
プライベートIPの固定
ルーターで設定できない場合、ラズパイ側での設定も可能です。
Linuxで固定IP設定(設定ファイル・コマンド) - Qiita
(ただし、Wi-Fiで設定する場合eth0ではないはずです。私の環境だと確かめられないので断定的なことは言えませんが、wlan0とかだと思います。)

設定したら一度Raspberry Piを再起動して、ifconfigしてみます。
指定したIPになっていれば設定完了です。
ちなみにDHCP固定割り当てはルーターによって設定可能なIPに縛りがあったり色々ややこしいので、ルーター側で指定する場合は一度公式マニュアルを確認したほうがいいです。

バーチャルサーバの設定

ポート80に届いたリクエストをラズパイのバーチャルサーバで受け取る設定をします。
/etc/nginx/conf.d下に設定ファイルを作ります。
sudo vi /etc/nginx/conf.d/rira.conf

server {
    listen       80;
    server_name  rira100000000.com;

    charset UTF-8;
    access_log  /var/log/nginx/rira100000000.com.access.log  main;

    location / {
        root   /home/rira/web/public;
        index  index.html;
    }
}

server_nameディレクトリ構成は自分のものに置き換えてください。
nginxの設定ファイルを開きます。sudo vi /etc/nginx/nginx.conf
ここにconf.d下のファイルを読み込ませる設定を追加します。
include /etc/nginx/conf.d/*.conf;

ルーターのポートマッピング設定

ルーターに届いたリクエストをラズパイに送るよう設定します。
これもルーターによって画面や機能名が異なる場合がありますが、重要なのはポート80に届いたリクエストを固定したラズパイのIPアドレスに送ることです。
ポート80(http)とポート443(https)を設定した画面です。

ポートマッピング設定

ネームサーバーの設定

グローバルIPを固定するためにDDNSを設定します。
正確に言うとグローバルIPを固定するわけではなく、「グローバルIPが変更されるたびにドメイン提供サービスにIPを登録しなおす」設定をします。
今回はMyDNSを使います。
こちらの記事に従って設定します。
MyDNS.JPで使う独自ドメインを設定する。

最後の 4. 独自ドメインを取得したレジストラでネームサーバーの設定をします。
についてですが、お名前.comの場合ドメインNavi(お名前.com Naviログイン後)から設定できます。
ページ中段の「他のネームサーバーを利用」タブを選択し、プライマリネームサーバーとセカンダリネームサーバーを設定します。 設定後に実際に適用されるまでは最大72時間かかるそうです(私は15分くらいでした)。

DDNSグローバルIPを設定

アクセス情報【使用中のIPアドレス確認】
↑で自分のグローバルIPを確認します。
MyDNSに戻り、「IP Address Direct」ページの「IPv4 Address」フォームにグローバルIPを入力します。

DDNSの自動更新設定

DDNSが自動で更新されるように設定します。
MyDNSのIP自動更新 - Qiita こちらの記事に従い設定します。とても簡単です。

アクセスしてみる

取得したドメインにアクセスしてみます。
Welcome to nginx!が表示されていればラズパイサーバー完成です!

うまく表示できない場合

  • nginx startはできているか確認してください。起動時の自動実行を設定していないのでRaspberryPiの起動のたびにする必要があります。
  • 自分のグローバルIPをブラウザのアドレス欄に入力してアクセスできるかチェックしてみてください。
    アクセスできる場合、ネームサーバーの設定がうまくいっていない可能性が高いです。
    アクセスできない場合、ルーター、nginxの設定で失敗している可能性があります。
  • ポートチェック【外部からポート開放確認】で80番が解放できているかチェックしましょう。できていない場合、ルーターの設定を見直す必要があるかもしれません。ルーターによってはファイアーウォールやパケットフィルタリングの設定が必要かもしれません。

以上です

FBCのプラクティスではさらにSSL対応サイトにしたりするのですが、今回はここまで。