Raspberry Pi でローカルWebサーバー 【Python 活用】

Raspberry Pi

ローカルネットワーク内で Webサーバーを Raspberry Pi で動かす手順についてまとめておきます。
ラズパイに標準でついている、Python のサーバー機能を使うことで、余計なインストールの手間なく、最小限の手間、構成、知識で動かせるよう意図しています。ラズパイのローカルサーバーです。

以下の環境で動作確認をしています。
環境の一例:
・ Raspberry Pi 3 model B+ (buster)、Python 3.X (サーバーとして使用する)
・ Windows 10 パソコン(クライアントとして使用する)
・ LAN ネットワーク(ラズパイと Windows 10 パソコンは、LAN ネットワークに接続済み)

背景 ~ ラズパイをそのままサーバー化できないか

Raspberry Pi を複数持っています。
Raspberry Pi は Linux ですので、活用していないものがあれば、自宅などのローカルネットワークで Webサーバーとするなど有効活用したいところです。

Webサーバーのオーソドックスな構成としては、LAMP (Linux, Apache, MySQL, PHP) が知られています。しかし、インストールや設定が煩雑ですし、Raspberry Pi の処理能力の点でも限界がありそうです。

一方、Raspberry Pi にはデフォルトで Python 3.X が入っています。新たなソフトウェアをインストールすることなく、デフォルトの機能のみを用いてそのままサーバーとして動かすことが可能です。

ネットで探すと、Python の標準機能だけを使って Raspberry Pi を Webサーバー化する事例は少ないようです。設定をしてみたところ、「ラズパイサーバー」が簡単に実現しましたので、手順をまとめておきます。

最小限の手間で Webサーバーさえ動けば、例えば、HTML や JavaScript をすでに知っているのであれば(Pythonを知らなくても)、トップページの HTML を修正していくだけで Webサイトの作成・動作確認ができるようになります。
また、cgi も動くので、動的なサイトの技術検討も容易に進められることになります。
何でもできるホームサーバーが実現します!

設定手順 ~ ラズパイWebサーバーの構築

ドキュメントルートと Webページ(index.html)の設定

① あらかじめ、Raspberry Pi とパソコン(Windows)をネットワークに接続しておきます。
② 以下を参考に、ドキュメントルート(公開フォルダ)として使用するフォルダ(”web_server1″)を作成します。
/home/pi/web_server1/
③ ②のフォルダに index.html という名前でテキストファイルを作り、文字列を書き込んでおきます。
例: hello world!

ラズベリーパイのIPアドレスの確認

④ ターミナルで以下を実行し、Raspberry Pi のローカルネットワーク内のIPアドレスを確認します。

hostname -I

例: 192.168.1.6

ラズパイのWebサーバー化

⑤ ラズパイのターミナルを起動し、ドキュメントルート(②のフォルダ)に移動します。

cd /home/pi/web_server1

⑥ 以下を入力し、Webサーバーを起動します。

python3 -m http.server 8000 --cgi

※ [ctrl] + c と入力すると、Webサーバーを終了できます。
※ 8000 の数値は、変更しても問題ありません。以下でブラウザからアクセスする際に使います。
※ 動的なページも動くようにするため、”- -cgi” を加えています。不要であれば加えなくても動作します。
※ 実際に稼働している多くのウェブサイトでは、Linux サーバー上で Apache や Nginx といったプログラムを動かしていると思います。しかし、ここでは、ラズパイにあらかじめ入っている Python 3 のサーバーの機能を使っています。新たなソフトウェアのインストール等の手間なく、ラズパイを、Python Webサーバー化できます。

ブラウザからWebページにアクセス

⑦ 以下を参考に、ネットワーク内にあるパソコンのブラウザ(Windows 10 の Microsoft Edge など)から、ラズベリーパイの URL にアクセスします。
例: 192.168.1.6:8000

→ ③で設定した文字列(”hello world!”)が表示されたら、成功です。

※ 前半の IPアドレスは、④で確認したIPアドレスに一致させてください。
※ 後半の 8000 の数字は、⑥で設定した値と一致させてください。⑥の値を変更しても問題ありません。
※ なお、クライアント(Windows パソコン)側から、ローカルネットワークに接続されている機器の IPアドレスを確認するには、コマンドプロンプト(または、Anaconda Prompt)を起動して、”arp -a” + [enter] と入力すれば表示されます。

うまく動いたら

コマンドのシェルスクリプト化

うまく動いたらつぎに、①~⑥までの手順をシェルスクリプト化して、Webサーバーを一度で起動できるようにしましょう。
⑧ 以下を例に、シェルスクリプト(テキストファイル)を作って、内容を書き込んで保存します。

ファイルの場所およびファイル名: /home/pi/start_server1.sh

内容

#!/bin/bash
cd /home/pi/web_server1
hostname -I
timeout -sKILL 3600 python3 -m http.server 8000 --cgi 

シェルスクリプトの説明

・ 記載は、①~⑦の例に基づいて、そのままスクリプト化しています。②のドキュメントルート(フォルダの場所)などを変更した場合は、シェルスクリプトの記載も修正してください。
・ ブラウザからアクセスするとき、ローカルネットワーク内のラズパイの IPアドレスがわかるように、”hostname -I” も実行し、表示されるようにしています。IPアドレスなどを固定化して、不要となった場合は、この行は削除してください。
・ python3 を実行するところで、”timeout -sKILL 3600″ を入れています。つまり、指定時間(3600秒=1時間)経過後、Webサーバーを停止するようにしています。不要であればこの”timeout -sKILL 3600″の部分は削除してください。
・ Webサーバーを指定時間経過後、停止するようにしたのは、今後の自動起動を踏まえた記載としているためです。
具体的には、上記のシェルスクリプトを crontab に設定するだけで、Webサーバーを自動で起動できるようになります。ところが、終了時間を指定しないと、ラズパイをシャットダウンするまで(または、電源を強制的に OFF にするまで)、Webサーバーがずっと起動したままとなります。
そこで、サーバーの稼働時間を積極的に指定できるよう記載しています。テストでなく実際にローカルネットワーク内などでWebサーバとして使う場合は、使う時間に合わせて時間を設定してください。

シェルスクリプトの設定と使い方

⑨ つぎに、以下を例に、シェルスクリプトが動作するよう、実行権限を設定しておきます。

cd /home/pi/
ls -al
chmod 755 start_server1.sh
ls -al

⑩ シェルスクリプトを実行する場合は、ターミナルに以下を入力し、[enter] キーを押すと実行できます。

/home/pi/web_server1.sh

⑪ シェルスクリプトを実行したら、⑥と同様、ネットワーク上の別のパソコンのブラウザから Webサーバーにアクセスして、サイトが表示されることを確認してください。

カスタマイズ&ラズパイサーバーの発展形

・ ここまで動いたら、上記の index.html を修正して、トップページのカスタマイズをしてみてください。
・ また、動的なページを作る場合は、②のドキュメントルートに “cgi-bin” フォルダを作成し、cgi として使うスクリプト(例: test1.py)をこのフォルダ内に追加してください。このファイルにも実行権限を設定してください。
ブラウザから Python を動かす場合は、以下をブラウザのアドレスに入力します。
(例)192.168.1.6:8000/cgi-bin/test1.py

・ この後、Webサーバーの運用を発展させる場合は、必要により、以下の設定をしていくことになると思います。
(a) Raspberry Pi の IPアドレスの固定化(下記の関連リンク参照)
(b) Raspberry Pi にリモートデスクトップからアクセスできるようにする
(c) Raspberry Pi 本体の自動起動、自動停止
(d) Webサーバーの自動起動、自動停止(シェルスクリプトを crontab -e で設定する)
(e) セキュリティ対策
(f) 安全対策(基板の加熱対策、放熱対策、必要な時間帯/人がいる時間帯だけ動かすようにするなど)、他
(g) トップページの作りこみ、その他のページの追加
(h) 動的な機能の追加

まとめ

Raspberry Pi をローカルWebサーバー化する手順についてまとめました。ラズパイサーバーの実現です。

Python の標準機能を使うだけで、Webサーバーとして簡単に機能させることができます。また、4行程度で手順をシェルスクリプト化でき、実質、最小限の手間、かつ、最短で動かせます。

ラズパイでWebサーバーを作ったとき、SD カードの耐久性・寿命や処理能力の制約が大きいため、外部に公開する用途にはあまり向かないのではないかと思います。
しかし、自宅、工場、植物プラント、医療施設など、ローカルネットワーク内での自動化やデータ処理などを行う場合は、バックアップ手段はいくらでも取ることができ、かつ、気軽にサーバーを実現できるため、非常に有用です。

なお、Webサーバーに関しては、Windows、Raspberry Pi 、レンタルサーバー(CentOS/Linux)の3つのパターンで、Webサーバーを動かして、ポイントをまとめています。
もし関心があるようでしたら、以下の参考リンクも参考にしてみてください。

関連リンク
・ 固定IPアドレスを設定する 【Raspberry Pi】
・ Raspberry Pi を自動で起動、シャットダウンする
・ Python で Web サーバーを動かす 【Windows】
・ Webサーバーで動く Python アプリ 【Windows】
・ Web サーバーの構築手順まとめ 【Linux】

タイトルとURLをコピーしました