apache suexec + php cgi mode (mod_action) 復習

復習。
以前はsuPHPを試したこともあるけど
d.hatena.ne.jp
php 5.3から各コンテンツディレクトリで.user.ini 置くことで
設定上書きできるようにもなったので、apachephpだけのsimple構成を復習する。


概要

  • suexecしてcgiはユーザ権限で動かす
  • phpはmoduleではなくcgi modeで動かす
  • ユーザコンテンツはexample.com/~user1/ ではなくて個別のvirtualhost user1.example.com でホストする
  • ユーザのホームディレクトリは/home/username (/home以下にまとめる)

apache

'./configure' \ 
'--prefix=/usr/local/apache-2.2.29' \ 
"--enable-suexec" \ 
"--with-suexec-caller=apache" \ 
"--with-suexec-docroot=/home" \ 
"--with-suexec-logfile=/var/log/httpd/suexec.log" \ 
### 以下その他のmodule 適当に
make && make install
ln -s /usr/local/apache-2.2.29 /usr/local/apache2

なお、--with-suexec-userdir=public_html はapacheのUserDir (/home/user1/public_html <=> example.com/~user1/) に関するものなのでここでは設定不要

php

cgi版を入れるので--with-apxs2は指定してはいけない。

'./configure' \ 
'--prefix=/usr/local/php-5.6.10' \ 
'--with-libdir=lib64' \ 
### 以下適当
make && make install
ln -s /usr/local/php-5.6.10 /usr/local/php-5.6
cp php.ini-production /usr/local/php-5.6.10/lib/php.ini

cgi.force_redirectがdefault 1なので0に変更。
expose_phpなど、その他はいつものように設定

cgi.force_redirect = 0 

apache virtualhost 設定

suexecをするのでphp-cgiはユーザ権限にして、かつdocroot以下にする必要がある。
つまり、ユーザ増えるごとにphp-cgiをコピーする必要がある。
これがやや面倒くさいけど仕方ない。(他の方法思いつかない)
suexecをせずに単にphpcgi modeで動かすだけなら、共通の場所に置いたphp-cgiを利用できる。

sampleを見るとphp-cgiはScriptAliasの/cgi-bin/ に置くのを見かけるけど、virtualhost内でuserが好き勝手に使う可能性のある/cgi-bin/ のpathはあんま使いたくなかったのでちょい変えてみるパターンで。この辺は好みで適当に。

mkdir /home/uesr1/php-cgi/
cp /usr/local/php-5.6/bin/php-cgi /home/user1/php-cgi/php56-cgi
chown -R user1:user1 /home/user1/php-cgi/

php56-cgiと名前を変えた理由は、php 5.X系の場合はphp55-cgiを置いてあげれば
割といつでも変更できるかなと思ったので。
ここはmod_actionで指定するだけで目に見える表の部分にに出てこない部分なので割とどうでも良い。

<FilesMatch "^\.user\.ini">
  Order allow,deny
  Deny from all
  Satisfy All
</FilesMatch> 
  • virtualhost
<VirtualHost *:80>
  DocumentRoot /home/user1/public_html
  ServerAlias  user1.example.com
  SuexecUserGroup user1 user1
  ScriptAlias /php-cgi/     /home/user1/php-cgi/
  Action      php-script /php-cgi/php56-cgi
  AddHandler  php-script .php

  <Directory /home/user1/php-cgi>
    Options followsymlinks execcgi
    Order deny,allow
    Deny  from all
    Allow from all
  </Directory>
  ### あとは各ユーザごとのdocumentrootの設定
</VirtualHost>

apache moduleでphpを読み込んでいないため、virtualhost内、.htaccessphp_valueなどは使えない。代わりにユーザディレクトリ以下に.user.ini を置いてini形式でユーザ側で設定する。

# key = value
max_post_size = 20M