Mac 内蔵の Apache で Perl CGI を動かせるようにするまで

MacOS には Apache が最初から含まれており、Perl や PHP を CGI としてすぐに動かせる。

今回は、Perl スクリプトを CGI として動かせるようにするため、この Apache の設定をいじってみようと思う。

(昔ワケも分からず色んなところからコードをコピペして作った Perl CGI のスクリプトが出てきたので、動かしてみたいと思った次第w)

目次

Apache の起動・停止・再起動・ステータス確認

Apache の操作は、sudo を付けて、apachectl コマンドから行える。

ステータス確認は、sudo apachectl status だとよく分からなかった。sudo apachectl だと以下のように表示される。

$ sudo apachectl
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using neos21.local. Set the 'ServerName' directive globally to suppress this message
httpd (pid 1146) already running

とりあえず「already running」なら大丈夫だろう。

Apache が起動していれば、ブラウザで http://localhost/ もしくは http://【ホスト名】.local/ にアクセスして「It works!」というテキストが表示されるはずだ。コレはどこのファイルが参照されているかというと、

というパスのファイルが参照されている。この /Library/WebServer/Documents/ ディレクトリ配下が、http://localhost/ のルート直下となる。

httpd.conf の設定を変更して Perl CGI を有効にする

次に、Apache に対して Perl CGI を有効にする各種設定変更を入れていく。以下のコマンドで、Apache の設定ファイルである httpd.conf を開き、編集する。

$ sudo vi /etc/apache2/httpd.conf

編集した箇所は以下のとおり。…なのだが、正直このあたりどれがどのぐらい必要なのかハッキリ分かっていないので、無駄もあるかも。

参考にした各種文献は古いモノが多く、PHP Module のバージョンに違いがあったりしたので、MacOS High Sierra 時点の内容であることに留意。$ apachectl -v でバージョンを見ると、Apache/2.4.33 (Unix) となっていたので、この時点での内容だ。

ちなみに、# から始まる行はコメントアウトされるのだが、行末にコメントアウトを書こうとするとオプションの一つのように解釈されて上手く動かなくなるので注意。

# ↓ コレはアレです。みたいにコメントを書くのは大丈夫。
LoadModule cgi_module libexec/apache2/mod_cgi.so

LoadModule cgi_module libexec/apache2/mod_cgi.so  # ← コレはアレです。
# ↑ というようにコメントを書こうとすると、コメントのつもりの部分もコードとして解釈されて動かなくなる

これらの編集を行ったら保存して終了する。Apachea は $ sudo apachectl restart で再起動しておこう。

サンプル用 Perl CGI スクリプトを作成・格納する

いよいよ Perl CGI を書いてみる。/Library/WebServer/ 配下で作業するので、必ず sudo が必要なのが面倒なところ…。

まずは CGI-Executables/ ディレクトリ配下に CGI ファイルを置き、それが動作するか見てみよう。

# CGI-Executables ディレクトリに移動する
$ cd /Library/WebServer/CGI-Executables/

# CGI ファイルを作る
$ sudo touch test.cgi

# CGI ファイルを編集する
$ sudo vi test.cgi

test.cgi の中身は以下のようにする。

#!/usr/bin/perl

print "Content-Type: text/html\n\n";
print "Hello From CGI-Bin";
print "\n";

「Hello From CGI-Bin」と表示させるだけの簡単なモノだが、Perl で書いてある。

編集が終わったら保存して vi を終了し、アクセス権を設定する。

$ sudo chmod 777 test.cgi

ココまで出来たら、ブラウザで http://localhost/cgi-bin/test.cgi にアクセスしてみよう。「Hello From CGI-Bin」と表示されたら OK だ。

CGI-Executables/ ディレクトリ配下の内容が cgi-bin/ というパス配下で見られるようになっているのは、/etc/apache2/httpd.conf の L372 あたりで設定されている。L345 あたりから始まる <IfModule alias_module> 内に、

という記述がある。この行で、cgi-bin/ というパスと対応するようエイリアスを張っているというワケ。


続いて、先程 httpd.conf で設定したとおり、/Library/WebServer/Documents/ ディレクトリ配下にも CGI ファイルを置いて動作させられるようになったので、コレも試してみる。

$ cd /Library/WebServer/Documents/

$ sudo touch test.cgi
$ sudo vi test.cgi

コチラに作った test.cgi の中身は、先程のモノと違いが分かるよう、以下のようにしてみよう。

#!/usr/bin/perl

print "Content-Type: text/html\n\n";
print "Hello From Documents";
print "\n";

編集できたら保存して終了し、アクセス権を付与する。

$ sudo chmod 777 test.cgi

ココまで出来たら、今度は http://localhost/test.cgi にアクセスしてみよう。「Hello From Documents」と表示されたら成功だ。

Apache のアクセスログ・エラーログを確認する

上述のような簡素なコードなら特に問題ないかもしれないが、Apache サーバへのアクセス記録や、エラー時のコンソール出力が確認したい場合もあるだろう。その時は以下の場所にあるログファイルを参照すれば良い。

CGI ファイルへのアクセスが上手くいっていなさそうな場合は、

$ tail -f /var/log/apache2/access_log

でアクセス状況を確認し、CGI が上手く動かない場合は、

$ tail -f /var/log/apache2/error_log

でエラーの内容を確認すれば良いだろう。

以上

とりあえずコレで、/Library/WebServer/Documents/ ないしは /Library/WebServer/CGI-Executables/ に Perl 製のファイルを置いて、CGI として動作させられるようになった。

参考文献