Raspberry Pi を使って、ローカルネットワーク内で Webサーバーを動かす手順についてまとめておきます。
ラズパイに標準でついている、Python のサーバーの機能を使うことで、余計なインストールをすることなく、最小限の手間、構成、知識で動かせるよう意図しています。ラズパイのローカルサーバーです。
以下の環境で動作確認をしています。
環境の一例:
・ Raspberry Pi (bullseye 他、サーバーとして使用する)
・ Windows パソコン(クライアントとして使用する)
・ LAN ネットワーク(ラズパイと Windows パソコンは、LAN ネットワークに接続済み)
背景 ~ できるだけ簡単にラズパイをWebサーバー化したい
Raspberry Pi を複数持っています。
Raspberry Pi は Linux ですので、あまり活用していないものがあれば、自宅などのローカルネットワーク内で Webサーバーとするなど有効活用したいところです。
Webサーバーのオーソドックスな構成としては、LAMP (Linux, Apache, MySQL, PHP) が知られています。しかし、インストールや設定が煩雑ですし、Raspberry Pi の処理能力の点でも限界がありそうです。
一方、Raspberry Pi にはデフォルトで Python が入っています。新たなソフトウェアをインストールすることなく、デフォルトの機能のみを用いてそのままサーバーとして動かすことが可能です。
ネットで探すと、Python の標準機能だけを使って Raspberry Pi を Webサーバー化する事例は少ないようです。設定をしてみたところ、「ラズパイサーバー」が簡単に実現しましたので、手順をまとめておきます。
最小限の手間で Webサーバーさえ動けば、例えば、HTML や JavaScript をいくらか知っているのであれば(Python や PHP を知らなくても)、トップページの HTML を修正していくだけでローカルネットワーク内に Webサイトを構築できます。
また、CGI (Common Gateway Interface) も動くので、動的なサイト・Web アプリの作成、サーバーサイドの技術検討、スクラップ&ビルドも簡単に進められることになります。
何でもできる自宅サーバー、ホームサーバーが実現します!
設定手順 ~ ラズパイWebサーバーの構築
ドキュメントルートと Webページ(index.html)の設定
① あらかじめ、Raspberry Pi とパソコン(Windows)をネットワークに接続しておきます。
② 以下を参考に、ドキュメントルート(公開フォルダ)として使用するフォルダ(”web_server1″)を作成します。
/home/pi/web_server1/
③ ②のフォルダに index.html という名前でテキストファイルを作り、文字列を書き込んでおきます。
例: hello world!
ラズベリーパイのIPアドレスの確認
④ ラズパイのターミナルを起動し、以下を実行して、Raspberry Pi のローカルネットワーク内のIPアドレス(プライベートIPアドレス)を確認します。
hostname -I
例: 192.168.1.6
※ IPアドレス(Internet Protocol Address)は、ネットワーク上での固有の識別子です。ネットワークにつなぐ際に、各機器に重複のない固有番号を持たせる(TCP/IP プロトコル)ことで、各デバイスを特定し、データの送受信、ウェブサイトの表示などが可能になります。
※ 上記のコマンドを実行すると、IPv4 (Internet Protocol version 4)と IPv6 (version 6)の2種類のプライベート IP アドレスが表示されます。上記は、IPv4 (8ビット×4つ = 32ビット長、ドット “.” 区切りの10進数表示)の IPアドレスの表示例としています。
※ なお、市販のルーターなどを買ってくると、通常、ネットワーク内の IPアドレスが “192.168.xxx.xxx”(2進数表示になおすと “110…”、クラスC)となるよう初期設定されています。必要に応じ設定を変えることで、IPアドレスの割り振りや接続台数を選択できるようになっています。
ラズパイのWebサーバー化
⑤ ターミナル上でドキュメントルート(②のフォルダ)に移動します。
cd /home/pi/web_server1
⑥ 以下を入力し、Webサーバーを起動します。
python3 -m http.server 8000 --cgi
※ ここで、[ctrl] + c と入力すると、起動中のWebサーバーを終了できます。
以下で、②の index.html やファイル構成などを編集・変更した場合は、Webサーバーをいったん終了し、再度起動してみてください。
※ 上記の “8000” の数値(ポート番号)は変更しても問題ありません。ただし、以下でブラウザからアクセスする際、数値を一致させておく必要があります。サーバーを起動するとき、固有番号(ポート番号)を指定しておく、といった取り決めをしておくことで、1台のサーバー上で、Web サーバーやメールサーバーなど複数のプログラムを動かすことができるようになっています。
※ 動的なページも動くようにするため、”- -cgi” を加えています。不要であれば加えなくても動作します。
※ インターネット上で稼働している多くのウェブサイトでは、Linux サーバー上で Apache や Nginx といったウェブサーバー用のプログラムを動かしていると思います。
しかし、ここでは、ラズパイにあらかじめ入っている Python のサーバーの機能(HTTP サーバー)を使っています。新たなソフトウェアのインストール等の手間なく、ラズパイを、最短の手順で Webサーバー化できることになります。
ブラウザからWebページにアクセス
⑦ ネットワーク内にある別のパソコンで、ブラウザ(Windows の Microsoft Edge など)を起動し、以下を参考に、ラズベリーパイの URL にアクセスします。
例: 192.168.1.6:8000
→ Webページ(③で設定した文字列、”hello world!”)が表示されたら、成功です!
※ ここで、サーバー(ラズパイ)とクライアント(Windows パソコンなど)は、事前にネットワークに接続できている必要があります。加えて、サーバー側では、Web サーバーのソフトウェア(⑥)が起動している必要があります。
※ 前半の IPアドレスは、④で確認したIPアドレス(ラズパイサーバーのIPアドレス)に一致させてください。
※ 後半の “8000” の数字(ポート番号)は、⑥で設定した値と一致させてください。値が一致していれば、”8000″ の値自体は、変更しても問題ありません。
※ Web サイトの仕様として、クライアント(Windows パソコン)側でブラウザを起動して、IP アドレスとポート番号を指定すると、ネットワーク内で対応するサーバー(IPアドレス)を探し出してアクセスしにいくといった仕組みになっています。加えて、サーバー側では、ポート番号が一致したプログラムが反応して応答を返す、といった動き(仕様)になっています。
たとえば、ラズパイ側でターミナルを2つ起動し、ポート番号が異なるよう(”8000″ と “9000” など) Webサーバーのプログラムをそれぞれ起動しておきます。その後、クライアント側でもブラウザを2つ起動し、それぞれのポート番号を指定して Web サーバーにアクセスしてみます。
すると、それぞれの Web サーバーのプログラムが独立して応答する動き(アクセスがあると各コンソールに表示が出る)となります。ラズパイの Web サーバー(ハードウェア)をもう1個追加しても同様に、独立した動きとなります。実際に動かしてみると、IPアドレスとポート番号の意味(インターネットが動く仕組み)がよく理解できると思います。外部のインターネット環境ではこういった基本的な実験はやりにくいです(サーバー構築の費用やハッカー対策の手間が生じる)ので、ラズパイをお持ちであれば、一度、実験してみる・遊んでみる価値はあると思います。
※ なお、ローカルネットワークに接続されている機器の IPアドレスを確認するには、コマンドプロンプト上で “arp -a” + [enter] と入力してください。
また、ping コマンドを用いて、”ping 192.168.1.6″ のように入力することで、応答を確認できます([ctrl] + “c” で停止)。これらは、Windows と Linux で共通のコマンドとなっています。
また、Windows で自分自身の IPアドレスを表示させるには、”ipconfig” とします。IPv4 アドレス、IPv6 アドレスのいずれの IPアドレスも確認できます。
サーバーやクライアントがネットワークに接続できているのであれば、ネットワーク上の各機器の 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サーバーとして使う場合は、使う時間に合わせて時間を設定してください。
・ 今回は、最もシンプルな Python の HTTP サーバーを動かすコマンドを記載しています。コマンド部分を入れ替えることで、たとえば、Flask の Webサーバーなどを動かすことも可能です。いくらか動かしてみて慣れてきたら、カスタマイズしてみてください。
シェルスクリプトの設定と使い方
⑨ つぎに、以下の例のように、シェルスクリプトが動作するよう、実行権限を設定しておきます。
cd /home/pi/
ls -al
chmod 755 start_server1.sh
ls -al
※ テキストファイルを作成したデフォルトの状態では、所有者にスクリプトの実行権限が与えられていないと思います。そこで、chmod に続く3桁の数値の冒頭で “7” (= 4 + 2 + 1)とし、すべての権限を与えておきます。
Linux の権限設定に不慣れな方は、最初は動くまでの設定ができればよいと思います。何をやっているのか理解したいという方は、権限設定に関する下記の関連リンクも参照してみてください。
⑩ シェルスクリプトを実行する場合は、ターミナルに以下を入力し、[enter] キーを押すと実行できます。
/home/pi/start_server1.sh
⑪ シェルスクリプトを実行したら、⑥と同様、ネットワーク上の別のパソコンのブラウザから Webサーバーにアクセスして、サイトが表示されることを確認してください。
※ なお、起動しているタスク(HTTP サーバー)を強制的に停止するには、ターミナルで “ps ax” と入力し、⑥のコマンドに対応したタスク番号を確認します(例: 1762 … python3 -m http.server …)。つぎに、”kill 1762″ 等と入力することで、指定したタスクを強制的に停止することができます。
ラズベリーパイ版サーバーの発展形
・ ここまで動いたら、上記のトップページ index.html を修正して、Webサイトのカスタマイズをしてみてください。HTML の流儀にしたがってファイルを作ることで、洗練したサイトのデザインなどを自作できると思います。
・ また、②のドキュメントルートに HTML ファイルを追加して、トップページ index.html に相対リンクを追加していくことで、複数のページを設定することも可能です。
・ Webサイトとして使いたいページ、よく参照したい情報、リンク集、動画・音楽・写真、作業マニュアル、便利ツールなどを HTML や JavaScript でそろえておくことで、Web サイトを簡単に立ち上げて、ネットワークに接続したスマートフォンなどの各機器から参照・活用できるようになります。
・ 頻繁に 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サーバーをラズパイで実現する手順についてまとめました。
Webサーバーに関連するコマンドや説明を盛り込んだので記載が長くなりました。
とはいえ、Python の標準機能を使うだけで、任意のローカルネットワーク内で簡単に Webサーバーを構築できます。
また、実質、4行程度で手順をシェルスクリプト化でき、最小限の手間、かつ、最短でウェブサーバーを動かすことができます。ローカル Web サーバー、自宅サーバーの実現です。
なお、Raspberry Pi には、さらに機能が充実した Flask も標準で入っています。何もインストールすることなく上記と同様に動かすことができますので、余裕のある方や、ネット関連の技術、Python のプログラミングに興味のある方は動かしてみてください。
Webサーバーに関しては、Raspberry Pi 以外にも、Windows、レンタルサーバー(CentOS/Linux、LAMP、VPS)などでも動かしています。より本格的にウェブサイトやウェブサービスを運用するとなると、LAMP/VPS、Flask、Django あたりも扱うことになると思います。
もし関心があるようでしたら、以下のリンクなども参考にしてみてください。
(レンタルサーバーを借りていきなり本番環境で試行錯誤をする前に、上記の環境で Web サーバーの動きを理解&習得しておくべきでした。。)
関連リンク
・ Python でローカル掲示板 【Windows 版】
・ Webサーバーで動く Python アプリ 【Raspberry Pi 版】
・ Raspberry Pi で Flask を動かしてみる 【Python】
・ Raspberry Pi でファイルアップローダ 【Flask】
・ 固定IPアドレスを設定する 【Raspberry Pi】
・ 固定IPアドレスを設定する 【Raspberry Pi & bookworm 以前の場合】
・ Raspberry Pi を自動で起動、シャットダウンする
・ Linux の権限設定と WordPress との関係【Webサーバー】
・ ポートの状態を確認する 【Python】
外部リンク [PR]
・ Raspberry Pi 5 8GB 技適対応品/アクティブクーラー
・ Raspberry Pi 5 用 27W USB-C PD(電源アダプタ)