51
自宅のRaspberry Piで公開ウェブサイトをホストする方法

時々、インターネットを使って家の中のものを操作してみるのが好きです。ライブストリーミングで照明をオンオフしたり、リビングルームでラジコンカーを走らせたり。こういったプロジェクトを構築する際は、通常、Raspberry Piを使ってウェブトラフィックをリッスンし、誰かがサイトにアクセスしたときにイベントを実行します。

自分のIPアドレスを他の人に教えたり、ルーターのポートをRaspberry Piに転送したりすることもできますが、IPアドレスを非公開にしてネットワークを可能な限り安全にしておきたいのです。SSHトンネル、nginx、そしてクラウド上の仮想マシンを使えば、両方のメリットを享受できます。これらを組み合わせることでリバースプロキシが作成され、訪問者は自宅のネットワークではないパブリックIPアドレスにアクセスし、自宅のLAN内にあるRaspberry Piに誘導されます。

できるだけ安全を保ちながら、Pi でインタラクティブなものを構築したい場合は、次の手順に従ってください。

このプロジェクトに必要なもの 

  • Raspberry Pi 4または Raspberry Pi 3(電源アダプター付き)
  • Raspberry Pi OSを搭載した8GB(またはそれ以上)のmicroSDカード。Raspberry Piに最適なmicroSDカードのリストをご覧ください。 
  • Google Cloud Platform アカウントと gcloud コマンドラインツール、または使い慣れた他のクラウドプロバイダー。受信トラフィックには料金がかかります。今回の場合は月額 5 ドルです。

自宅のRaspberry Piで公開ウェブサイトをホストする方法

始める前に、Raspberry Pi OSがセットアップされていることを確認してください。まだセットアップしていない場合は、Raspberry Piの初回セットアップ方法、またはヘッドレスインストール(キーボードと画面なし)の方法を解説した記事をご覧ください。

1. git をインストールします。これにより、このプロジェクトのコードを複製できるようになります。

sudo apt-get update && sudo apt-get install -y git

2.サンプルコードを含むリポジトリをクローンします。このコードはセンサーとの通信を処理し、ホームネットワーク上に監視用のシンプルなサーバーを構築します。 

cd ~/
git clone https://github.com/rydercalmdown/pi_home_reverse_proxy.git

3.リポジトリに移動したら、インストールコマンドを実行します。これにより、必要なSSHコンポーネントと、サンプルとして使用するシンプルなサーバーであるnginxがインストールされます。

Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。

cd pi_home_reverse_proxy
make install-pi

4. SSH公開鍵/秘密鍵ペアを作成します。秘密鍵はRaspberry Piに保存され、公開鍵と組み合わせてクラウド仮想マシンに接続する際に使用されます。 

ssh-keygen
# press enter to accept all default settings

5. SSH公開鍵をコピーしておきます。クラウドで仮想マシンをセットアップする際に必要になります。

/home/pi/.ssh/id_rsa.pub
# Copy the results

6. Google Cloud Console にアクセスし、VM インスタンス ページに移動します。

7. 「インスタンスの作成」をクリックして新しい仮想マシンを作成します

自宅のRaspberry Piで公開ウェブサイトをホストする方法

(画像提供:Tom's Hardware)

8.インスタンスに覚えやすい名前を付けます。ここでは「home-reverse-proxy」とします。

9.希望するリージョンとゾーンを選択します。これはそれほど重要ではありませんが、低遅延のために近くのものを選択することをお勧めします。 

自宅のRaspberry Piで公開ウェブサイトをホストする方法

(画像提供:Tom's Hardware)

10. マシン構成で、シリーズに「N1」、マシンタイプに「f1-micro」を選択します。これにより、月額料金が約5ドルと最も安くなります。 

自宅のRaspberry Piで公開ウェブサイトをホストする方法

(画像提供:Tom's Hardware)

11. 「ブートディスク」セクションまでスクロールダウンし変更ボタンをクリックします。オペレーティングシステムをUbuntu、バージョンを「Ubuntu 20.04 LTS」に設定し、その他はそのままにして「選択」をクリックします。

自宅のRaspberry Piで公開ウェブサイトをホストする方法

(画像提供:Tom's Hardware)

12.   「ファイアウォール」まで下にスクロールし「HTTPトラフィックを許可する」と「HTTPSトラフィックを許可する」の両方にチェックを入れます。

自宅のRaspberry Piで公開ウェブサイトをホストする方法

(画像提供:Tom's Hardware)

13. インスタンスの一番下までスクロールし、「作成」をクリックします。

14. マシンが起動したら、「SSH」の横にあるドロップダウンをクリックしてSSHコマンドを取得します。「gcloudコマンドを表示」を使用することをお勧めします。このコマンドをターミナルに貼り付けて、クラウド仮想マシンにSSH接続します。 

自宅のRaspberry Piで公開ウェブサイトをホストする方法

(画像提供:Tom's Hardware)

15. 仮想マシンに接続したら、次のコマンドで nginx をインストールします

sudo apt-get update
sudo apt-get install -y nginx

16.次のコマンドを実行して、 nginx が実行中かどうかを確認します。Google Cloud コンソールで仮想マシンの横に表示されている外部 IP アドレスにブラウザでアクセスすることもできます。アクセスすると、nginx のウェルカムページが表示されます。

sudo service nginx status
# Ctrl + C then enter to exit
# It should show “active (running)” in green if all is well

自宅のRaspberry Piで公開ウェブサイトをホストする方法

(画像提供:Tom's Hardware)

17.カスタムリバースプロキシ設定を使用してデフォルト設定を更新します。これにより、nginxは受信したすべてのトラフィックをマシンのポートに転送するようになります。 

cd /etc/nginx/sites-enabled
sudo rm default
sudo touch default
sudo nano default
# copy in the code below

このコードレートは、インタラクティブなプロジェクトの実行中にPiに過負荷をかけないよう、リクエスト数を1秒あたり5件に制限しています。リクエスト数を増やしたい場合は、この値を増やすか、ファイルからlimit_reqで始まる行を削除して制限を解除してください。

limit_req_zone $binary_remote_addr zone=basic:10m rate=5r/s; server { listen 80; location / { limit_req zone=basic; proxy_pass http://0.0.0.0:5000; } }

18. nginx サービスを再起動し、仮想マシンの外部IPアドレスに再度アクセスします。すべてが正常に完了すると、「502 Bad Gateway」ページが表示されます。 

sudo service nginx restart

自宅のRaspberry Piで公開ウェブサイトをホストする方法

(画像提供:Tom's Hardware)

19. 次のコマンドを使用して、仮想マシンに SSH 接続するための pi のユーザーを作成します。

sudo useradd -m -p raspberry -s /bin/bash piconnect

20. SSH ディレクトリと承認済みキー ファイルを作成し、Raspberry Pi からコピーした公開キーをコピーします。 

sudo mkdir /home/piconnect/.ssh/
sudo touch /home/piconnect/.ssh/authorized_keys
sudo nano /home/piconnect/.ssh/authorized_keys
# copy in the public key you copied from your raspberry pi

21. Raspberry Pi に戻り、establish_remote_connection.sh ファイルを編集して、リモート サーバーの IP アドレスを追加します。 

cd ~/pi_home_reverse_proxy
sudo nano scripts/establish_remote_connection.sh
# change REMOTE_HOST=your_remote_ip_address to the external IP you got from the Google Cloud Platform console

22. make connect コマンドを実行して、Raspberry Pi と仮想サーバー間の SSH 接続を確立します。

make connect

23.仮想マシンの IP アドレスにアクセスして、自宅の IP アドレスではなくリモートで提供される Raspberry Pi で実行されているコンテンツを確認します。 

自宅のRaspberry Piで公開ウェブサイトをホストする方法

(画像提供:Tom's Hardware)

これで完了です!Raspberry Pi のコンテンツを、SSH トンネル経由で Google Cloud IP アドレスから配信できるようになりました。この設定はたまにしか使いませんが、より恒久的な設定にする場合は、ドメインを接続し、仮想マシン側で LetsEncrypt を使ってセキュリティ保護することをお勧めします。