きなこのブログ

技術系の覚書など。

RaspberryPiでnicky.cgiを動かす

レガシーを通り越してレトロな風情のある懐かしのnicky.cgiRaspberry Piで動かす記事です。需要なさそうですが…ローカル用ということで。

環境:RaspberryPi Mpdel B / Raspbian Stretch (2018-04)

Webサーバを立てる(Apache

参考サイト:VMware + Debian jessieでウェブサーバ その3 -ViVid Bit-

まずはApacheをインストールします。これだけで2.4(最新)が入ったみたい。

sudo apt -y install apache2

文字コードUTF-8にします。

sudo vi /etc/apache2/conf-available/charset.conf

AddDefaultCharset UTF-8

セキュリティ設定を変更しておきます。

sudo vi /etc/apache2/conf-available/security.conf

# クライアントに送り返すサーバ情報を最低限にしておく
ServerTokens OS → Prod
# サーバが生成するドキュメントのフッタに情報を載せない
ServerSignature On → Off

ポートを変更する場合はこちら。下記の設定だと、アクセスURLがhttp://<ラズパイのhostname>:8181/になります。

sudo vi /etc/apache2/ports.conf

Listen 8181

こちらも合わせて変えておきます。

sudo vi /etc/apache2/sites-enabled/000-default.conf
# 一番最初の行
<VirtualHost *:8181>

終わったらApacheを再起動。

sudo /etc/init.d/apache2 restart

ブラウザでhttp://<ラズパイのhostname>/またはhttp://<ラズパイのIPアドレス>/にアクセスしてみましょう。Apache2.4のWelcomeページが見えたら成功です!簡単でしたね。

設定ファイルの構成が書いてあります。ふむふむ。

/etc/apache2/
|-- apache2.conf
|       `--  ports.conf
|-- mods-enabled
|       |-- *.load
|       `-- *.conf
|-- conf-enabled
|       `-- *.conf
|-- sites-enabled
|       `-- *.conf

Perl-CGIを動かせるようにする

nicky.cgiPerlで書いてあるので、Perlをインストールしましょう。apt-getで5.24が入りました。

sudo apt-get install perl

Perl-CGIを動かす設定

Apacheの設定ファイルの方に追記します。Webサーバのデフォルトルートフォルダ/var/www/htmlをそのまま使い、その下のnickyフォルダの中に設置します。

sudo vi /etc/apache2/mods-enabled/mime.conf

# 219行目:コメント解除し、CGIとして扱う拡張子を設定(デフォルトのまま)
AddHandler cgi-script .cgi .pl

sudo vi /etc/apache2/sites-enabled/000-default.conf

# 13行目あたりに追記
<Directory "/var/www/html/nicky">
    AllowOverride All
    Options +ExecCGI
    Require all granted
    AddDefaultCharset EUC-JP
</Directory>

nicky.cgi文字コードEUC-JPなので、それも書いておきます。この書き方をしておくと、nickyフォルダ以外は最初に設定したUTF-8が既定の文字コードになります。

nicky.cgiを設置

CGIファイルを編集

nicky.cgiMeryなどで開き、1行目のパス#!/usr/local/bin/perl#!/usr/bin/perlに変更しておきます(.cgiのファイルにはすべてやっておきましょう)

CGIファイルを設置します。

sudo mv /home/pi/nicky.cgi /var/www/html/nicky/nicky.cgi

パーミッションを書き換えます。

sudo chmod -R 755 /var/www/html/nicky/nicky.cgi

CGIの実行ユーザを変更する

この状態でhttp://Pi-hostname/nicky/nicky.cgiにアクセス…しても動きません。

試しにls -al /var/www/html/nickyしてみるとファイルのユーザとグループがpiかrootになっていると思います。そう、実行権限が無いのです。755は「所有者にはフルコン、所有グループには実行権限、その他にも実行権限」です。rootやpiが所有者だと実行はできるんじゃないの??と思えますが、実施に動かすのはWebサービスなので、そいつに書き込み権限がないとnicky.cgiは動作できないというわけです。

なぜ所有者が違うかというとmvしたからですね。このあたりは、コピーならコピー先のパーミッションが適用され、移動なら元のパーミッションごと持っていくWindowsの挙動と似ています。

そこで、まずはsudo less /etc/apache2/envvarsでapache2のグループとユーザを確認します。

# 16行目あたり
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

どちらもwww-dataだということがわかりました。cgiファイルとフォルダの所有者と所有グループをを書き換えます。

$ sudo chown www-data:www-data /var/www/html/nicky
$ sudo chown www-data:www-data /var/www/html/nicky/nicky.cgi

Apacheのcgidモジュールを有効にする

さらに、Apacheの設定としてモジュールの有効化が必要になります。コア機能以外はモジュール化されていて後で入れるんですね。

sudo a2enmod cgid

終わったらApacheを再起動しましょう。これで無事CGIが動作するはずです。

sudo systemctl restart apache2

無効にするときのコマンドはこちら。

sudo systemctl restart apache2

viでの文字化けをなおす

panel.cgiが動かない…1行目のパスを書き換え忘れていたなあ。よし、viで修正しよう。

参考サイト:Linuxのviで文字化けをしないようにする

viで表示中のファイルの文字コードを変更する

:e ++enc=euc-jp

保存するときの文字コードを変更する

:set fenc=euc-jpのあと:wq

まだエラーが出る

それでもまだカテゴリ機能にアクセスするとCan't locate CGI.pm in @INC (@INC contains: ~~~(パスが書いてある)と表示されます。nicky.cgiは問題ないのに、panel.cgiだけ上手くパスが通っていないみたい?

シンボリックリンクを作成して解決します。

cd /etc/perl
sudo ln -s /var/www/html/nicky/panel.cgi panel.cgi

さて、動いたでしょうか。これでこの秘密の小箱はあなたの秘密の日記帳です。もちろん日記以外にも好きなコンテンツを置いて楽しむことが出来ます。