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

Raspberry Pi

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

以下の環境で動作確認をしています。
環境の一例:
・ Raspberry Pi 3 model B+ (buster、bullseye)、Python 3.X (サーバーとして使用する)
・ Windows 10/11 パソコン(クライアントとして使用する)
・ LAN ネットワーク(ラズパイと Windows パソコンは、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 (Common Gateway Interface) も動くので、動的なサイト、サーバーサイドの技術検討、スクラップ&ビルドも簡単に進められることになります。
何でもできる自宅サーバー、ホームサーバーが実現します!

設定手順 ~ ラズパイ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サーバーを終了できます。
もし、上記の index.html やファイル構成などを編集・変更した場合は、Webサーバーをいったん終了し、再度起動してみてください。
※ なお、8000 の数値(ポート番号)は変更しても問題ありません。ただし、以下でブラウザからアクセスする際、数値を一致させておく必要があります。
※ 動的なページも動くようにするため、”- -cgi” を加えています。不要であれば加えなくても動作します。
※ インターネット上で稼働している多くのウェブサイトでは、Linux サーバー上で Apache や Nginx といったウェブサーバー用のプログラムを動かしていると思います。しかし、ここでは、ラズパイにあらかじめ入っている Python 3 のサーバーの機能を使っています。新たなソフトウェアのインストール等の手間なく、ラズパイを、最短の手順で Webサーバー化できることになります。

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

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

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

※ ここで、サーバー(ラズパイ)とクライアント(Windows パソコンなど)は、事前にネットワークに接続できている必要があります。加えて、サーバー側では、Web サーバーのソフトウェアが起動している必要があります。
※ 前半の IPアドレスは、④で確認したIPアドレス(ラズパイサーバーのIPアドレス)に一致させてください。
※ 後半の 8000 の数字(ポート番号)は、⑥で設定した値と一致させてください。値が一致していれば、”8000″ の値自体は、変更しても問題ありません。ブラウザ側でポート番号を指定すると、ポート番号が一致したサーバー側のアプリにアクセスしてくる、といった動き(仕様)になっています。
※ なお、クライアント(Windows パソコン)側から、ローカルネットワークに接続されている機器の IPアドレスを確認するには、コマンドプロンプト(または、Anaconda Prompt)を起動して、”arp -a” + [enter] と入力してください。
あるいは、ping コマンドを用いて、”ping 192.168.1.6″ のように入力することで、ネットワーク上の各機器の応答を確認することができます。
サーバーとクライアントがともにネットワークに接続できているのであれば、ラズパイ(サーバー)の応答が確認できるはずです。

うまく動いたら

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

うまく動いたらつぎに、①~⑥までの手順をシェルスクリプト化して、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

※ テキストファイルを作成したデフォルトの状態では、所有者にスクリプトの実行権限が与えられていないと思います。そこで、chmod に続く3桁の数値の冒頭で “7” = 4 + 2 + 1 とし、すべての権限を与えておきます。
⑩ シェルスクリプトを実行する場合は、ターミナルに以下を入力し、[enter] キーを押すと実行できます。

/home/pi/start_server1.sh

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

※ なお、起動しているタスク(http サーバー)を強制的に停止するには、まず、ターミナルを起動し、”ps ax” と入力し、⑥のコマンドに対応したタスク番号を確認します(例: 1762 … python3 -m http.server …)。その後、”kill 1762″ 等と入力することで、指定したタスクを強制的に停止することができます。

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

・ ここまで動いたら、上記の index.html を修正して、Webサイトのトップページのカスタマイズをしてみてください。上記のドキュメントルートに HTML ファイルを追加して、トップページに HTML でリンクなどを追加していくと、複数のページなども設定できると思います。
頻繁に HTML を更新する場合は、Webサーバーの稼働、停止を手動で(⑥に記載したコマンドで)行うと楽です。完成度が上がったら/Webサーバーを使う段階では、シェルスクリプトを実行する(⑩)ようにすると便利です。
・ なお、日本語を扱う場合は、以下を例に、HTML のヘッダー内に “UTF-8” 等であることを明記する(テキストファイルも UTF-8 形式で保存する)と、OS やブラウザが異なっていても、文字化けなどせずに表示されるようです。文字コードを明記しないと、使用している文字に依存して文字化けが生じることがあるようです。
<head>
<meta charset=”utf-8″ />
</head>
・ また、動的なページを作る場合は、②のドキュメントルートに “cgi-bin” フォルダを作成し、CGI として使うスクリプト(例: test1.py)をこのフォルダ内に追加してください。このファイルにも実行権限を設定してください。
ブラウザから Python を動かす場合は、ブラウザのアドレス欄に、以下を入力します。
例: 192.168.1.6:8000/cgi-bin/test1.py
 Web アプリの事例を以下の関連リンク「Webサーバーで動く Python アプリ 【Raspberry Pi 版】」にまとめています。もし、関心があるようでしたら参照してください。

・ 詳細は省略しますが、この後さらに、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)でも動かしています。より本格的にWebサーバーを動かすとなると、Flask、Django、LAMP/VPS等となっていくと思いますが、Flask などについてもシンプルなスクリプト等をまとめています。
もし関心があるようでしたら、以下のリンクも参考にしてみてください。
(レンタルサーバーを借りていきなり本番環境で試行錯誤をする前に、上記の環境で Web サーバーの動きを理解&習得しておくべきでした。。)

関連リンク
・ Webサーバーで動く Python アプリ 【Raspberry Pi 版】
・ Webサーバーで動く Python アプリ 【Windows 版】
・ 
Python で Web サーバーを動かす 【Windows 版】
・ Python でローカル掲示板 【Windows 版】
・ Raspberry Pi で Flask を動かしてみる 【Python】

・ Raspberry Pi を自動で起動、シャットダウンする
・ サーバーの管理画面での定型作業まとめ 【VPS】
・ エラーコードのまとめ 【Webサーバー】

外部リンク [PR] 
・ Raspberry Pi 5 8GB 技適対応品/アクティブクーラー
・ Raspberry Pi 5 用 27W USB-C PD(電源アダプタ)
・ Raspberry Pi 4 Model B 8GB
・ Raspberry Pi 4 Model B 4GB

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