macOSでPerlを有効にする【macOS10.14】


一部手間取ったところがあったので、これも備忘。
Webアプリケーション用に使いたいので、主にhttps.confの編集に尽きます。

1. Perlのインストール...?

MojaveにもPerlはプリインストールされていますが、C言語で書かれたPerlモジュールはセキュリティ上の理由でインストールに失敗してしまうとのこと。
しかし今回はまずPerlをいじることが目的の為、プリインストールのPerlを使用します。
Perlのバージョンは  $perl -cで確認できます。

macOS10.14.6ではPerl 5.18.4とのこと。

パスを確認したい場合は$which perlで確認できます。
プリインストールされているPerlの場合は/usr/bin/perlかと思います。

2. https.confの編集

続いて、httpd.confを編集します。
$sudo -s vi /etc/apache2/httpd.conf
でhttpd.confを開きます。もしmacOSデフォルトのapacheではなく、自信でインストールしている場合はインストール先のhttpd.confを開きます。

以降、行番号がわかっているととても便利なので、ファイルを開いたらエスケープモードの状態で
:set numberと入力して行番号を出しておきます。

2.1 LoadModuleの有効化

デフォルトではコメントアウトされている行のコメントアウトを外して有効化します。
LoadModuleは68行目あたりから始まります。(使用環境によって行数は変わります)

・165行目付近
LoadModule cgi_module libexec/apache2/mod_cgi.so

・174行目付近
LoadModule userdir_module libexec/apache2/mod_userdir.so

・176行目付近
LoadModule rewrite_module libexec/apache2/mod_rewrite.so

・179行目付近
LoadModule perl_module libexec/apache2/mod_perl.so

2.2 DocumentRootの指定

245行目付近にあるDocumentRootを設定する。
自信がWebページとして公開する場所を指定すればよい。
今回はデフォルトの/Library/WebServer/Documentsをそのまま使用。

<Directory "/Library/WebServer/Documents>
から
</Directory>
の間、259行目付近にある
Options FollowSymLinks Multiviewsの末尾に「ExecCGI」を追記。
Options FollowSymLinks Multiviews ExecCGIとする

2.3 MIMEの設定

406行目付近にあるmime_moduleの設定をして、.cgiや.plがwebコンテンツとして認識されるようにする。
・437行目付近
AddHandler cgi-script .cgiのコメントアウトを外し、末尾に .plを追記。
拡張子を.cgiで統一する場合はコメントアウトを外すだけでも可。

2.4 ホームディレクトリの設定

ユーザのホームディレトリ設定を有効にする。
・510行目付近
Include /private/etc/apache2/extra/httpd-userdir.conf
のコメントアウトを外す。

以上でhttpd.confの設定は完了。
ファイルを保存したらapacheを再起動する。
sudo -s apachectl restart

3. ブラウザで表示してみる

簡単なHello Worldを表示するファイルを作成。

hello.pl
#!/usr/bin/perl

print("Hello World!");

このファイルをhttpd.confで指定したDocumentRootに置きます。
その後ブラウザでhttp://localhost/hello.plにアクセス。

画像のように表示されたら設定完了です。

4. 思った通りに表示されない...

Hello World!と表示されなかった場合、2通りの表示がでるかと思います。

4.1 ソースコードがそのまま表示される

httpd.confの設定が間違っているとブラウザにはソースコードがそのまま表示されてしまいます。
もう一度httpd.confを見直す必要があります。

4.2 Internal Server Errorと表示される


画像のような表示になってしまった場合。よくある原因が
ソースコードのファイル、もしくはそのファイルが格納されているフォルダのアクセス権が違う
場合です。
その場合は
$sudo -s chmod 755 xxxでアクセス権を変更してあげてください。

もう1つの可能性として、ソースコードの記述内容が違う
ということもあります

print "Content-Type: text/html\n\n";
の一文が記載されていないと、こちらもInternal Server Errorの原因となります。
ソースコードを見直して、書いていないようであれば追記して、ブラウザを読み込み直してみてください