ApacheでCGIを動かす方法

「来年の事を言えば鬼が笑う」と言いますが、逆に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です。

DocumentRootで動くことを確認
動くことを確認

設定方法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 .plDirectoryIndex index.cgiを書いておく、と。

今回はScriptAliasで設定したディレクトリ以下に配置されているファイルはスクリプトだとみなすのでOptions +ExecCGIなしでOK。

`cgi-bin`ディレクトリで動作することを確認
こちらも動きました

昔のWebサーバってこういう設定をしていたのですね、と勉強になりました。

……願わくば、使わないことを祈ります。

メモ

特定ディレクトリ(/path/to/test/documentroot/)以下で拡張子が.cgiのファイルの権限を一括で変更(サブディレクトリも対象)

find /path/to/test/documentroot/ -name "*.cgi" | xargs chmod 755

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。