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 ネットワークに接続済み)

背景 ~ できるだけ簡単にラズパイをWebサーバー化したい

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 や PHP を知らなくても)、トップページの 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

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

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

うまく動いたら

ラズパイのコマンドのシェルスクリプト化

うまく動いたらつぎに、①~⑥までの手順をシェルスクリプト化して、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アドレスは可変となっています。つまり、ネットワークにつなぐごとにラズパイの IP アドレスが変化する可能性があります。一方、ブラウザからサーバーにアクセスするときには、サーバーのIPアドレスを知っている必要があります。
そこで、Webサーバーを起動するとき、”hostname -I” を実行し、ラズパイのIPアドレスが表示されるようにしています。IPアドレスを固定化して、不要となった場合は、この行は削除してください。
・ python3 を実行するところで、”timeout -sKILL 3600″ を入れています。つまり、指定時間(3600秒=1時間)経過後、Webサーバーを停止するようにしています。不要であればこの”timeout -sKILL 3600″の部分は削除してください。
・ Webサーバーを指定時間経過後、停止するようにしているのは、今後の自動起動を踏まえた記載としているためです。
具体的には、上記のシェルスクリプトを Linux の 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 を修正して、Webサイトのトップページのカスタマイズをしてみてください。
・ また、動的なページを作る場合は、②のドキュメントルートに “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) 動的な機能の追加

まとめ

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

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

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

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

外部リンク

ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作 作る、動かす、しくみがわかる! (ブルーバックス)

新品価格
¥1,650から
(2021/10/25 22:26時点)

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