「来年の事を言えば鬼が笑う」と言いますが、逆に2020年にCGIの事を言えば何が笑うのでしょうか。天逆毎辺りか。
ええ、今ではめっきり使われることのなくなったCGIことPerlですが、勉強がてら動かそうと思ったので一応メモしておきます。
結論から申し上げますと、てっきりサクッとApacheが標準的にサポートしているのかと思ったのですが、実はそこそこ設定が必要だということが分かりました。
設定方法1
ルートディレクトリ以下でCGIを動かす場合。
仮想ホストの.conf
ファイル
DocumentRoot "/path/to/test/documentroot"
ServerName cgitest.example.com
<Directory "/path/to/test/documentroot">
allow from all
AllowOverride All
Require all granted
Options +ExecCGI
AddHandler cgi-script .cgi .pl
DirectoryIndex index.html index.cgi
</Directory>
必要なのは下の方の2つ+α。
Options +ExecCGI
: CGIを動かすオプションAddHandler cgi-script .cgi .pl
: CGIとして認識させる拡張子。今回は.cgi
と.pl
DirectoryIndex index.cgi
:https://cgitest.example.com
にアクセスした際にindex.cgi
も反応させる
これで以下のスクリプトをindex.cgi
としてDocumentRootに設置し、実行権限を付与します。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print $];
exit;
※perl本体のパスは適宜読み替えてください。
これでPerlのバージョンが表示されればOKです。
設定方法2
こちらの方が一般的でしょうか。
曰く、「ダウンロードやファイルの内容を表示させないように、DocumentRootの外にCGI専用のディレクトリを用意し、そこにリクエストを流すようにScriptAlias
を使って対応する」というパターンです。
DocumentRoot "/path/to/test/documentroot"
ServerName cgitest.example.com
ScriptAlias /cgi-bin/ /path/to/test/cgi-bin/
<Directory "/path/to/test/documentroot">
allow from all
AllowOverride All
Require all granted
Options FollowSymLinks
</Directory>
<Directory "/path/to/test/cgi-bin">
allow from all
AllowOverride All
Require all granted
Options FollowSymLinks
AddHandler cgi-script .cgi .pl
DirectoryIndex index.html index.cgi
</Directory>
パスの階層は以下のイメージ。
/path/
└ to/
└ test/
├ cgi-bin/ # `ScriptAlias`設定により、`https://cgitest.example.com/cgi-bin/`でアクセスできる
└ documentroot/ # DocumentRoot (`https://cgitest.example.com/`でアクセスできる場所)
肝はScriptAlias /cgi-bin/ /path/to/test/cgi-bin/
ですね。これでhttps://cgitest.example.com/cgi-bin/
にアクセスできるようになります。
後は設定方法1で記述したAddHandler cgi-script .cgi .pl
とDirectoryIndex index.cgi
を書いておく、と。
今回はScriptAlias
で設定したディレクトリ以下に配置されているファイルはスクリプトだとみなすのでOptions +ExecCGI
なしでOK。
昔のWebサーバってこういう設定をしていたのですね、と勉強になりました。
……願わくば、使わないことを祈ります。
メモ
特定ディレクトリ(/path/to/test/documentroot/
)以下で拡張子が.cgi
のファイルの権限を一括で変更(サブディレクトリも対象)
find /path/to/test/documentroot/ -name "*.cgi" | xargs chmod 755
参考
- Perl/CGIプログラムからPerlパッケージのバージョンを取得する – 木村秀一のホームページ
- Apache Tutorial: CGI による動的コンテンツ – Apache HTTP サーバ バージョン 2.4
- 特定のディレクトリでCGIを実行する(Option, AddHandler) – CGIの利用 – Apache入門
- [CentOS][Apache]バーチャルホストを設定して複数サイトを運用する | ごった煮 – tips about programming and building a server
- Apache設定ScriptAliasが理解不足でInternal Server Errorとなった話 – treedown’s Report
- 特定の拡張子ファイルの権限を変更する – Qiita