Apache2.0でSuExecを使えるように設定しました。
割と引っかかった事があったのでメモ。
コンパイル
SuExecはデフォルトでは有効になっていません。
コンパイル時に指定する必要があります。
configureの時点で下記のオプションを設定します。
- --enable-suexec
- SuEXECを有効にします
- --with-suexec-caller
- --with-suexec-docroot
- SuEXECを実行できるディレクトリを指定します。これを指定しないと思ったところで実行できなくなってしまいます
- --with-suexec-userdir
- ユーザーディレクトリで実行するディレクトリ名を決めます。「public_html」に指定しました
- --with-suexec-uidmin
- UIDの最小値を決めます
- --with-suexec-gidmin=500
- GIDの最小値を決めます
これらの値を指定して、下記のようにconfigureを実行します。(その他の指定も含んでいます)
./configure --enable-suexec \
--with-suexec-caller=apache \
--with-suexec-docroot=/home \
--with-suexec-userdir=public_html \
--prefix=/usr/local/apache2 \
--enable-rule=SHARED_CORE \
--enable-ssl \
--enable-rewrite \
--enable-proxy \
--enable-so \
--enable-module=so
あとは普通に「make; make install」です。
インストールしたあと、SuEXECの設定は下記のコマンドで確認できます。
$ /usr/local/apache2/bin/suexec -V -D AP_DOC_ROOT="/home" -D AP_GID_MIN=100 -D AP_HTTPD_USER="apache" -D AP_LOG_EXEC="/usr/local/apache2/logs/suexec_log" -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin" -D AP_UID_MIN=100 -D AP_USERDIR_SUFFIX="public_html"
httpd.confの編集
Apacheの実行ユーザーは「User」「Group」の部分で設定します。
User apache
Group apache
SuEXECバーチャルホストの設定を行ないました。
Apache2.0では「SuexecUserGroup」で実行ユーザーを指定します。
ServerAdmin memememomo@gmail.com
DocumentRoot /home/hoge/www
ServerName 192.168.0.5
ErrorLog /home/hoge/wwwlogs/error_log
CustomLog /home/hoge/wwwlogs/access_log common
SuexecUserGroup hoge hoge
あとは、CGIの実行許可の設定です。
#AddHandler cgi-script .cgi
AddHandler cgi-script .cgi
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
引っかかったところ
なかなかCGIが正常に動いてくれませんでした。
その時の対処メモです。
Forbiddenが表示されてしまう
「/usr/local/apache2/logs/suexec_log」に下記のようなエラーメッセージが出力されていました。
directory is writable by others: (/home/hoge/www)
パーミッションが原因だったので、ディレクトリとアクセスファイルをそれぞれ「755」に設定しました。
プログラムが実行される前にエラーがでてしまう
CGIのエラーログに下記のようなメッセージが出力されていました。
Premature end of script headers:
SuEXECに限らず、他の原因でも出るようなエラーなのですが、今回は「AP_DOC_ROOT」の設定が不適切だったことが原因でした。
「/usr/local/apache2/bin/suexec -V」で、「AP_DOC_ROOT」のパスが正確であるかを調べます。
ここで設定されているディレクトリ以外でSuEXECを実行することはできません。
間違っていたら、設定されている場所で実行されるようにするか、
コンパイルをしなおす必要があります(configure時の--with-suexec-docrootオプション)。