treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

Apache設定ScriptAliasが理解不足でInternal Server Errorとなった話

今日はapache設定「ScriptAlias」が理解できていなかったので、エラーになったのでその対処をご報告します。

環境は:apache2.2(2.2.22-13)です。

メルマガ配信サービスをはじめようとするユーザからサーバ設定依頼です。
利用するのは、無料で使えるメール配信CGI「エーシーメーラー
(URL:http://www.acmailer.jp/)


インストーラの設置は非常に簡単
※もちろんですが、install.cgiCGI実行を要します。

  1. acmailerサイトからinstall.cgiをダウンロードして、ダウンロード
  2. サーバの適当なフォルダを作成しパーミッションを777に設定
  3. このフォルダに、ダウンロードしたinstall.cgiを配置
  4. install.cgiパーミッションを755に設定

これだけです。いやぁ楽勝、と思っていたのですが、都合によりCGIディレクトリは別途用意したい=既存のcgi-binを使いたくない、という事情があります。
「ScriptAliasは並べて記述すれば複数設定できますよ。」
なるほど。こうして、この助言をもらいScriptAliasを複数行記述して2つ目のCGIディレクトリを設定することにしました。

最初の動作確認と設定確認

まず未設定の状態でDocumentRootに配置してアクセスします。
※DocumentRootに./acmailer3/ディレクトリを作成し、install.cgiを配置

f:id:treedown:20151123164110p:plain

----------------------------------------------
Forbidden
You don't have permission to access /acmailer3/install.cgi on this server.
----------------------------------------------

当然エラーがでますので設定が必要ですよ、と。

まずfgrepで設定対象を確認しておきます。
----------------------------------------------
/etc/apache2/sites-available/default:   ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
/etc/apache2/sites-available/default-ssl:       ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
/etc/apache2/sites-enabled/000-default: ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
----------------------------------------------
/etc/apache2/sites-available/defaultでScriptAliasを追記すればよさそうですね。
一応fgrepでAddHandlerも確認しておきましょう。
----------------------------------------------
/etc/apache2/mods-available/mime.conf:AddHandler cgi-script .cgi .pl
/etc/apache2/mods-available/mime.conf:AddHandler type-map var
/etc/apache2/mods-enabled/mime.conf:AddHandler cgi-script .cgi .pl
/etc/apache2/mods-enabled/mime.conf:AddHandler type-map var
----------------------------------------------
AddHandler cgi-script .cgi .pl」とあるので、.cgiファイルはそのまま使えることが分かります。AddHandler設定は作業不要です。

早速</etc/apache2/sites-available/default>に
----------------------------------------------
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>
----------------------------------------------
と表記があるので、続けて以下を追記します。
----------------------------------------------
        ScriptAlias /acmailer3/ /var/www/html/acmailer3/
        <Directory "/var/www/html/acmailer3">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>
----------------------------------------------
 注※この↑表記では正常に動作しません。(動作する設定は後述を参照)

で再度アクセスしてみました。

f:id:treedown:20151123164142p:plain
----------------------------------------------
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, webmaster@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
----------------------------------------------
うん?
HTTP 500ですね。エラーログを見よ、とありますので見てみましょう。
サーバのエラーログ</var/log/apache2/error.log>
----------------------------------------------
[Mon Nov 23 14:36:01 2015] [error] [client 111.222.333.444] (13)Permission denied: exec of '/var/www/html/acmailer3/install.cgi' failed
[Mon Nov 23 14:36:01 2015] [error] [client 111.222.333.444] Premature end of script headers: install.cgi
----------------------------------------------
これではだめらしい。

間違いに気づく

よくよく本で調べてみると、CGIは実行するための要素なのでプログラムファイルとなる.cgiファイルをダウンロードや表示させないためにDocumentRoot外のディレクトリにCGI専用ディレクトリを用意してCGIへのリクエストを流すためにScriptAliasを使って対応を設定するということです。

なるほど。これは無理解でした。
つまり、「/var/www/html/acmailer3/」はドキュメントルートなので
「ScriptAlias /acmailer3/ /var/www/html/acmailer3/」の記述では使用できないわけです。
どうせインストーラが動作する一回だけの利用なので、別の場所「/opt/acmailer3/」に作成することにしました。
作成してファイルを配置します。
----------------------------------------------
# mkdir /opt/acmailer3
# cd /opt/acmailer3
# mv /var/www/html/install.cgi /opt/acmailer3/
# chmod 755 install.cgi
/opt/acmailer3# ls -la
total 24
drwxr-xr-x 2 root      root       4096 Nov 23 15:21 .
drwxr-xr-x 4 root      root       4096 Nov 23 15:18 ..
-rwxr-xr-x 1 root      root      12787 Nov 23 13:46 install.cgi
----------------------------------------------
ディレクトリ「/opt/acmailer3」を作成し、install.cgiを移動しました。
「/etc/apache2/sites-available/default」の対象箇所を修正しましょう。
----------------------------------------------
        ScriptAlias /acmailer3/ /opt/acmailer3/
        <Directory "/opt/acmailer3">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>
----------------------------------------------

編集後はお決まりの「/etc/init.d/apache2 restart」を実行して
[ ok ] Restarting web server: apache2 ... waiting .
リスタート完了

再度アクセス確認です。

f:id:treedown:20151123164249p:plain

できました。
ちょっと手こずったけど完了です。

ここまでのまとめ

  • ScriptAliasでApacheCGI実行環境を設定する場合、複数の場所を指定するのは可能。
  • だが、ScriptAliasで指定するローカルパスはDocumentRoot以外の場所であることが必要。(HTTP 500 Internal Server Error エラーとなる。)

 

しかし、明日のエントリに続きます。