Corredor

ウェブ、プログラミングの勉強メモ。

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

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

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

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

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

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

  • 起動 : $ sudo apachectl start
  • 停止 : $ sudo apachectl stop
  • 再起動 : $ sudo apachectl restart
  • ステータス確認 : $ 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/index.html.en

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

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

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

$ sudo vi /etc/apache2/httpd.conf

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

  • L164 付近 : LoadModule cgi_module libexec/apache2/mod_cgi.so をアンコメント (行頭のコメントアウト # を消して有効化する)
    • CGI の有効化?後述の php7_moduleperl_module との違いがよく分かっていない
  • L173 付近 : LoadModule userdir_module libexec/apache2/mod_userdir.so をアンコメント
    • ユーザディレクトリ (/Library/WebServer/Documents/ 以下のサブディレクトリ) を認識させるために必要
  • L175 付近 : LoadModule rewrite_module libexec/apache2/mod_rewrite.so をアンコメント
    • リダイレクトや URL の書き換えに使う。なくても良いのかしら?CGI で実現する機能による?
  • L176 付近 : LoadModule php7_module libexec/apache2/libphp7.so をアンコメント
    • PHP を使えるようにする (ついでに…)
  • L177 付近 : LoadModule perl_module libexec/apache2/mod_perl.so をアンコメント
    • Perl を使えるようにする (今回の本命)
  • L258 付近 : L245 あたりから始まる <Directory "/Library/WebServer/Documents"> の中の Options FollowSymLinks Multiviews 部分に ExecCGI を加えて、Options FollowSymLinks Multiviews ExecCGI にする
    • 前述の index.html.en があったディレクトリ配下に .cgi ファイルを置いて、CGI が動作するようにする
  • L436 付近 : L403 あたりから始まる <IfModule mime_module> の中の AddHandler cgi-script .cgi をアンコメントし、Ruby と Perl も動くように AddHandler cgi-script .cgi .rb .pl とする
    • .rb (Ruby) はとりあえず追加したまで。.cgi なファイルしか扱わないならアンコメントだけで十分かも
  • L510 付近 : Include /private/etc/apache2/extra/httpd-userdir.conf をアンコメント
    • ユーザディレクトリを認識させるため
  • ファイル最終行 : AddHandler cgi-script .cgi .rb .pl を追記する
    • L436 で対応したモノと同じ内容を書くのだが、コレが要るのかイマイチ分からん

参考にした各種文献は古いモノが多く、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> 内に、

  • ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) "/Library/WebServer/CGI-Executables/$1"

という記述がある。この行で、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 サーバへのアクセス記録や、エラー時のコンソール出力が確認したい場合もあるだろう。その時は以下の場所にあるログファイルを参照すれば良い。

  • アクセスログ : /var/log/apache2/access_log
  • エラーログ : /var/log/apache2/error_log

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 として動作させられるようになった。

参考文献

できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 (できるPROシリーズ)

できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 (できるPROシリーズ)