それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

phpをユーザー毎に実行させるsuphp

前回の5時間の実験の結果、PHP+SuEXECはすごくめんどくさいと言うことが分った.

suphpを試してみる

sudo aptitude install   libapache2-mod-suphp suphp-common

設定の確認

/etc/suphp/suphp.conf

;Path all scripts have to be in
docroot=/var/www:${HOME}/public_html

;Umask to set, specify in octal notation
umask=0077

終わり

以上で設定は終わりです

sudo restart apache2

で再起動すればユーザー毎に分離されたプロセスでPHPが動きますね。楽ちん

注意点1

sudo tail -f /var/log/httpd/suphp_log

[Tue Aug 23 13:25:36 2011] [warn] Script "/home/takuya/public_html/index.php" resolving to "/home/takuya/public_html/index.php" not within configured docroot

のようなエラーが出るときは/etc/suphp.confを見直す
このメッセージは「docroot外部でsuphpさせないぜ!へへっ」ていうこと

注意点2

php5(mod_php)が導入済みのApacheにインストールすると、カオスになるのでした.
競合でErrorになるんだけど・・・本当は共存できるんだよね.

以下の新規パッケージがインストールされます:
  libapache2-mod-suphp libonig2{a} libqdbm14{a} php5-cgi{a} php5-suhosin{a} suphp-common{a}
以下のパッケージが更新されます:
  php5-common{b}
更新: 1 個、新規インストール: 6 個、削除: 0 個、保留: 119 個。
アーカイブ 6,719 kB 中 6,492 kB を取得する必要があります。展開後に 16.6 MB のディスク領域が新たに消費されます。
以下のパッケージには満たされていない依存関係があります:
  php5-gd: 依存: php5-common (= 5.2.6.dfsg.1-1+lenny9) [5.3.3-7+squeeze1 がインストール予定となっています]
  php5-curl: 依存: php5-common (= 5.2.6.dfsg.1-1+lenny9) [5.3.3-7+squeeze1 がインストール予定となっています]
  php5-mhash: 依存: php5-common (= 5.2.6.dfsg.1-1+lenny9) [5.3.3-7+squeeze1 がインストール予定となっています]
  php5-xmlrpc: 依存: php5-common (= 5.2.6.dfsg.1-1+lenny9) [5.3.3-7+squeeze1 がインストール予定となっています]
  php5-mcrypt: 依存: php5-common (= 5.2.6.dfsg.1-1+lenny9) [5.3.3-7+squeeze1 がインストール予定となっています]
  php5-ldap: 依存: php5-common (= 5.2.6.dfsg.1-1+lenny9) [5.3.3-7+squeeze1 がインストール予定となっています]
  php5-mysql: 依存: php5-common (= 5.2.6.dfsg.1-1+lenny9) [5.3.3-7+squeeze1 がインストール予定となっています]
  php5-cli: 依存: php5-common (= 5.2.6.dfsg.1-1+lenny9) [5.3.3-7+squeeze1 がインストール予定となっています]
  libapache2-mod-php5: 依存: php5-common (= 5.2.6.dfsg.1-1+lenny9) [5.3.3-7+squeeze1 がインストール予定となっています]
  php5-gmp: 依存: php5-common (= 5.2.6.dfsg.1-1+lenny9) [5.3.3-7+squeeze1 がインストール予定となっています]
  php5-common: 競合: php5-mhash [インストール済みの 5.2.6.dfsg.1-1+lenny9 に固定されています]
以下のアクションでこれらの依存関係の問題は解決されます:

      以下のパッケージを削除する:
1)      libapache2-mod-php5
2)      moodle
3)      php-openid
4)      php-pear
5)      php-xml-parser
6)      php5-cli
7)      php5-curl
8)      php5-gd
9)      php5-gmp
10)     php5-ldap
11)     php5-mcrypt
12)     php5-mhash
13)     php5-mysql
14)     php5-xmlrpc
15)     simplesamlphp
16)     zabbix-frontend-php

      以下の依存関係を未解決のままにする:
17)     moodle が php5-xmlrpc を推奨

mod_php共存

たとえばこんな感じで、共存させてみた

#mod_phpのロード
<IfModule prefork.c>
  LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule worker.c>
  LoadModule php5_module modules/libphp5-zts.so
</IfModule>
AddHandler php5-script .php
AddType text/html .php
#suphpのロード
<IfModule mod_suphp.c>
  suPHP_AddHandler x-httpd-php
  #suPHP_UserGroup apache apache
  <Directory />
    suPHP_Engine off #全部でオフ
  </Directory>
</IfModule>
#suphpを使いたいDirectory
    <Directory /home/*/public_html>
        AllowOverride All
        Options IncludesNoExec ExecCGI FollowSymLinks

        <IfModule mod_php5.c>
            php_admin_flag engine off #phpをオフにして
        </IfModule>
        <IfModule mod_php4.c>
            php_admin_flag engine off
        </IfModule>
        suPHP_Engine on              #suphpをオンにする
        AddHandler x-httpd-php .php  #handlerもつけ直し
        AddHandler cgi-script .cgi
    </Directory>

実際には複数のファイルに分割されてる設定だけどこんな感じです.
FastCGIなので、速度低下もそんなにないだろうし,共存させる意味は何だろうね.気分.

suphpを使った感想

とっても楽ちんです.SuExec+PHPやらCGIWrapをするくらいならsuphpをaptでイイと思います.

cgiの歴史をたどったようなモノだった.。。

suexec するあたりから cgi-bin と PATHINFOを調べて cgi-wrap で回避しつつ

それが進化して fastcgiになって wrap機能は suphpで一気に出来る

みんなが悩んで、考えた結果が今こんなに楽なんですね.

20110904 追記

suphp は session関連でsave_pathがErrorになってセッション保存できないことがある.CentOSの場合だけど/var/lib/php/sessionがsuphp済みの一般ユーザーから書き込めないのでErrorになっていた.