上の画像は、今で言う "AI" 、昔で言う "人工無能" とか呼ばれていたチャットボットです。
こういうの動かしてみたくないですか?
そういう訳で、ラズパイにWEBサーバーを構築し、CGIをPerlで動くように設定します。
- WEBサーバーについて
- WEBサーバーをインストールする
- perlをインストールする
- CGIモジュールを有効にする
- CGIを有効にするために設定ファイルを編集する
- テスト用のCGIファイルの作成
- その他 設定した方が良いと思ったもの
- おわり
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ファイルを置くディレクトリでも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のページ
ゆいぼっとダウンロードサイト