Mac 内蔵の Apache で Perl CGI を動かせるようにするまで
MacOS には Apache が最初から含まれており、Perl や PHP を CGI としてすぐに動かせる。
今回は、Perl スクリプトを CGI として動かせるようにするため、この Apache の設定をいじってみようと思う。
(昔ワケも分からず色んなところからコードをコピペして作った Perl CGI のスクリプトが出てきたので、動かしてみたいと思った次第w)
目次
- Apache の起動・停止・再起動・ステータス確認
httpd.conf
の設定を変更して Perl CGI を有効にする- サンプル用 Perl CGI スクリプトを作成・格納する
- Apache のアクセスログ・エラーログを確認する
- 以上
- 参考文献
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_module
・perl_module
との違いがよく分かっていない
- CGI の有効化?後述の
- 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 として動作させられるようになった。