PokuG stdio.h

stdio.hはおまじない

MENU

Raspberry PiにWEBサーバーを構築しCGIをPerlで動くようにする


上の画像は、今で言う "AI" 、昔で言う "人工無能" とか呼ばれていたチャットボットです。

こういうの動かしてみたくないですか?

そういう訳で、ラズパイにWEBサーバーを構築し、CGIをPerlで動くように設定します。

WEBサーバーについて

今回はWEBサーバーとして、apache2をインストールします。
あと、上記も言いましたようにCGIをPerlで動くように設定します。

WEBサーバーをインストールする

以下のコマンドを実行します。

sudo apt-get install apache2

実行例

pi@SHIMUSHU:~ $ sudo apt-get install apache2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3
  libaprutil1-ldap liblua5.3-0
提案パッケージ:
  apache2-doc apache2-suexec-pristine | apache2-suexec-custom
以下のパッケージが新たにインストールされます:
  apache2 apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3
  libaprutil1-ldap liblua5.3-0
アップグレード: 0 個、新規インストール: 9 個、削除: 0 個、保留: 0 個。
2,327 kB のアーカイブを取得する必要があります。
この操作後に追加で 7,870 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
・
・
an-db (2.9.4-2) のトリガを処理しています ...
libc-bin (2.31-13+rpt2+rpi1+deb11u2) のトリガを処理しています ...
pi@SHIMUSHU:~ $

確認

ブラウザからラズパイのIPアドレスを叩いてみます。
無事表示されています。

perlをインストールする

デフォルトでperlは入っていたように見えます。
以下コマンドで確認しました。

perl --version

pi@SHIMUSHU:~ $ perl --version

This is perl 5, version 32, subversion 1 (v5.32.1) built for aarch64-linux-gnu-thread-multi
(with 47 registered patches, see perl -V for more detail)

Copyright 1987-2021, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

pi@SHIMUSHU:~ $

CGIモジュールを有効にする

以下コマンドを実行します。

sudo a2enmod cgid
sudo systemctl restart apache2

実行例

pi@SHIMUSHU:~ $ sudo a2enmod cgid
Enabling module cgid.
To activate the new configuration, you need to run:
  systemctl restart apache2
pi@SHIMUSHU:~ $
pi@SHIMUSHU:~ $ sudo systemctl restart apache2
pi@SHIMUSHU:~ $

CGIを有効にするために設定ファイルを編集する

".cgi"、".pl"というファイルをCGIのスクリプトとして実行するように設定する

"/etc/apache2/mods-available/mime.conf"ファイルの以下をコメントアウトを外し、".pl"を追加します。

AddHandler cgi-script .cgi .pl

実行例

pi@SHIMUSHU:/etc/apache2/mods-available $ sudo vi mime.conf

        # AddHandler allows you to map certain file extensions to "handlers":
        # actions unrelated to filetype. These can be either built into the server
        # or added with the Action directive (see below)
        #
        # To use CGI scripts outside of ScriptAliased directories:
        # (You will also need to add "ExecCGI" to the "Options" directive.)
        #
        AddHandler cgi-script .cgi .pl  ←☆コメントアウトを外し".pl"を追加

        #
        # For files that include their own HTTP headers:
        #
        #AddHandler send-as-is asis

pi@SHIMUSHU:/etc/apache2/mods-available $

WEBサーバーを再起動する

".cgi"というファイルをCGIのスクリプトとして実行するように設定したので、設定を反映させるために、以下のコマンドでWEBサーバーを再起動します。

sudo systemctl restart apache2

実行例

pi@SHIMUSHU:~ $ sudo systemctl restart apache2
pi@SHIMUSHU:~ $

cgiファイルを置くディレクトリの確認

"/etc/apache2/conf-enabled/serve-cgi-bin.conf"ファイルを確認します。

実行例
pi@SHIMUSHU:/etc/apache2/conf-enabled $ less serve-cgi-bin.conf

<IfModule mod_alias.c>
        <IfModule mod_cgi.c>
                Define ENABLE_USR_LIB_CGI_BIN
        </IfModule>

        <IfModule mod_cgid.c>
                Define ENABLE_USR_LIB_CGI_BIN
        </IfModule>

        <IfDefine ENABLE_USR_LIB_CGI_BIN>
                ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
                <Directory "/usr/lib/cgi-bin">
                        AllowOverride None
                        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                        Require all granted
                </Directory>
        </IfDefine>
</IfModule>

pi@SHIMUSHU:/etc/apache2/conf-enabled $

上記より、ラズパイの"/usr/lib/cgi-bin"にcgiファイルを置き、ブラウザからは"/cgi-bin/" もしくは "/usr/lib/cgi-bin/" からアクセスするとcgiが実行されることが分かります。

テスト用のCGIファイルの作成

"/usr/lib/cgi-bin" 以下に "hello.cgi" というファイルを作成します。
ソースの内容は実行例を参照してください。

実行例

pi@SHIMUSHU:/usr/lib/cgi-bin $ sudo vi hello.cgi

#! /usr/bin/perl
#
print "Content-type: text/html\n\n";
print "<html>\n";
print   "<head>\n";
print           "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n";
print           "<title>Hello by Perl</title>\n";
print   "</head>\n";
print   "<body>\n";
print           "Hello<br>\n";
print           "こんにちはPokuG<br>\n";
print   "</body>\n";
print "</html>\n";

CGIファイルのパーミッションを変更する

そのままだとブラウザから実行できないのでパーミッションを変更します。
おそらくパーミッションは "755" あたりだと思います。

sudo chmod 755 hello.cgi

実行例

pi@SHIMUSHU:/usr/lib/cgi-bin $ sudo chmod 755 hello.cgi
pi@SHIMUSHU:/usr/lib/cgi-bin $

実際にブラウザから確認

CGIの設定で、"/cgi-bin/" でcgiファイルを実行するように設定したので、"/cgi-bin/hello.cgi" とアドレスを叩きます。

無事表示されました。

その他 設定した方が良いと思ったもの

cgiファイルを置くディレクトリでもhtmlファイルを表示できるように設定する

デフォルトの設定では、cgiフォルダにあるhtmlファイルは表示されません。

しかし、フリーのcgiではcgiフォルダにも "index.html" を置くことがたまにあるので、これを設定しておきます。

"/etc/apache2/conf-enabled/serve-cgi-bin.conf"ファイルを編集し、以下行を追加。

AddHandler text/html .html .htm .txt .css

"ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/"の下に追加します。

実行例
pi@SHIMUSHU:/etc/apache2/conf-enabled $ sudo vi serve-cgi-bin.conf

<IfModule mod_alias.c>
        <IfModule mod_cgi.c>
                Define ENABLE_USR_LIB_CGI_BIN
        </IfModule>

        <IfModule mod_cgid.c>
                Define ENABLE_USR_LIB_CGI_BIN
        </IfModule>

        <IfDefine ENABLE_USR_LIB_CGI_BIN>
                ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
                AddHandler text/html .html .htm .txt .css ←☆コレ
                <Directory "/usr/lib/cgi-bin">
                        AllowOverride None
                        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                        Require all granted
                </Directory>
        </IfDefine>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

"perl-CGI" のインストール

CGI実行時にエラー"Can't locate CGI.pm in @INC..."が出ることがあります。

その場合は、"perl-CGI"を入れたら回避できます。

以下のコマンドを実行します。

sudo apt-get install libcgi-session-perl

実行例
pi@SHIMUSHU:/var/www/html/robo $ sudo apt-get install libcgi-session-perl
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libcgi-fast-perl libcgi-pm-perl libclone-perl libdbd-pg-perl libdbi-perl libencode-locale-perl libfcgi-bin libfcgi-perl libfcgi0ldbl
  libfreezethaw-perl libhtml-parser-perl libhtml-tagset-perl libhttp-date-perl libhttp-message-perl libio-html-perl liblwp-mediatypes-perl libpq5
  libtimedate-perl liburi-perl
提案パッケージ:
  libmldbm-perl libnet-daemon-perl libsql-statement-perl libdata-dump-perl libwww-perl
以下のパッケージが新たにインストールされます:
  libcgi-fast-perl libcgi-pm-perl libcgi-session-perl libclone-perl libdbd-pg-perl libdbi-perl libencode-locale-perl libfcgi-bin libfcgi-perl
  libfcgi0ldbl libfreezethaw-perl libhtml-parser-perl libhtml-tagset-perl libhttp-date-perl libhttp-message-perl libio-html-perl
  liblwp-mediatypes-perl libpq5 libtimedate-perl liburi-perl
アップグレード: 0 個、新規インストール: 20 個、削除: 0 個、保留: 0 個。
1,992 kB のアーカイブを取得する必要があります。
この操作後に追加で 5,681 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
・
・
pi@SHIMUSHU:/var/www/html/robo $

以上で設定完了です。

おわり

ラズパイにWEBサーバーを構築し、CGIをPerlで動くように設定しました。

これでperlで書かれた"カウンター"や"掲示板"、"チャット"が動くようになります。

SMSが流行っていて自作CGIはほとんど見かけない昨今ですが、一度設置してみてはいかがでしょうか?

おまけ(フリーCGI設置)

フリーCGI設置してみました。

"ゆいちゃっと" & "ゆいぼっと"

いまで言うAI、昔で言う "人工無能" とか呼ばれていたチャットボットです。


perlソースコードは以下リンクよりお借りしました。
ゆいちゃっと研究さんのページ
ゆいちゃっとPro1.0のページ
ゆいぼっとダウンロードサイト