Dabits

サーバサイドから運営まで何でもやるエンジニア系DJ

suPHPの設定とインストール

//概要 CGIWrapではperlCGIによるラッパー機能を提供してきた。 しかし、このラッパーではPHP容易にセキュア化したり、バーチャルホストごとの設定が困難である。 そこで、今回はsuPHPを用いてこの問題に対処する。


//suPHPとは suPHPとは、mod_cgiwrapの後継となるもので、元々はcgiwrapのモジュール版であった。 cgiwrapをモジュール化することにより、より高速にCGIを動かす工夫がなされた。 これを発展させたのがsuPHPであり、その名のとおりPHPに対応したラッパーである。 本来の機能として、PHPを自UID/GIDで実行できる他、通常のCGIも自UID/GIDで実行することが可能だ。 さらに、mod_vhost_aliasに対応しているため、容易にバーチャルホスト毎に別UID/GIDで動作することができるのである。


//動作速度の問題 suPHPが嫌われる原因としてよく挙げられるのが、動作速度の問題である。 これは、本来PHPが高速で動作しているのはPHPインタプリタがモジュールとして動作しているためであって、 それ以外の方法で(CGIにより)動作させると少なからず動作速度が落ちてしまう、ということである。 従って、PHPCGIモードで動作させるsuPHPが速度が落ちがちだといわれる。が、実はそうでもない。 現バージョンのsuPHPの場合は、FastCGI方式を採用しているためPHPインタプリタが常に常駐化され、 ほぼモジュール版と変わらない動作速度で動作することが可能なのである。

これについては環境変数で出た情報のみから記述しているため、実際のところは不明。

分かり次第(ソースがあり次第)追記することにする。

実際は、単にPHPFastCGIに対応していただけの模様。


//設定・インストール ・ここでは、当サーバの設定を例に一連の流れを説明する。 Fedora Core 5の場合は、すでにrpmパッケージが公開されているので、yumからmod_suphpをインストールすればよい。 今回使用しているディストリビューションCentOSだが、Fedoraのソースrpmコンパイルして使用することにする。 *DACにあるパッケージはコンパイルの設定が違う、またソースからのインストールはパッチを当てなければならない箇所が多いため。 ○ファイルのダウンロード・リビルド・インストール 基本的にFedoraCentOSは互換性があるが、glibcのバージョンの関係上同じバイナリファイルを使用できない。 そのため、Fedora CoreのExtrasよりソースrpmをタウンロード、リビルドして使用する。

[root@www ~]# wget http://ftp.riken.jp/Linux/fedora/extras/5/SRPMS/mod_suphp-0.6.1-4.fc5.src.rpm --21:59:08-- http://ftp.riken.jp/Linux/fedora/extras/5/SRPMS/mod_suphp-0.6.1-4.fc5.src.rpm => `mod_suphp-0.6.1-4.fc5.src.rpm' Resolving ftp.riken.jp... 134.160.38.1 Connecting to ftp.riken.jp|134.160.38.1|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 375,718 (367K) [application/x-wais-source] 100%[====================================>] 375,718 1.16M/s 21:59:08 (1.15 MB/s) - `mod_suphp-0.6.1-4.fc5.src.rpm' saved [375718/375718] [root@www ~]# rpmbuild --rebuild mod_suphp-0.6.1-4.fc5.src.rpm←ソースrpmをリビルド ...... + umask 022 + cd /usr/src/redhat/BUILD + cd suphp-0.6.1 + rm -rf /var/tmp/mod_suphp-0.6.1-4-root-root + exit 0 Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.27399 + umask 022 + cd /usr/src/redhat/BUILD + rm -rf suphp-0.6.1 + exit 0 [root@www ~]# rpm -ivh /usr/src/redhat/RPMS/i386/mod_suphp-0.6.1-4.i386.rpm←suPHPのインストール Preparing... ########################################### [100%] 1:mod_suphp ########################################### [100%] [root@www ~]# chmod o+rx /usr/sbin/suphp←現行パッケージのバグ対策

○suPHPの設定 suPHPの設定ファイルを開き、設定する。

[root@www ~]# vi /etc/suphp.conf docroot=/←変更(/home/より上層での実行禁止) ↓ docroot=/home/ umask=0077←umaskの変更(作成ファイルのデフォルトパーミッションを644にする) ↓ umask=0022 handle_userdir=true←変更(/~以降のユーザディレクトリでも動作可能にする) errors_to_browser=false←変更(エラーをブラウザ上に表示) ↓ errors_to_browser=true

Apache再設定 suPHPを適用するためApacheを再設定する。

[root@www ~]# vi /etc/httpd/conf.d/suphp.conf suPHP_Engine off←変更(suPHPを有効にする) ↓ suPHP_Engine on AddType application/x-httpd-php .php←追加(〃) AddHandler x-httpd-php .php AddHandler x-suphp-cgi .cgi .pl # suPHP_AddHandler x-httpd-phpコメントアウト(〃) ↓ suPHP_AddHandler x-httpd-php suPHP_AddHandler x-suphp-cgi←追加(〃) [root@www ~]# mv /etc/httpd/conf.d/php5.conf /etc/httpd/conf.d/php5.conf.org←名前変更(module版PHPによる実行をストップ) [root@www ~]# /etc/init.d/httpd restartApache再起動

これにより、CGI/PHPともに自UID/GIDで実行できる。 また、suPHPにより、ディレクトリやファイルのパーミッションが777である場合、実行が強制ストップされる。 (/etc/suphp.confにより変更可能) また、mod_vhost_aliasを適用することによりバーチャルホスト毎に別UID/GIDで動作することができた。 ->ユーザ毎にバーチャルホストを設定する方法


//参考サイト suPHP - Home: http://www.suphp.org/Home.html サードパーティリポジトリーを使う: http://www.geocities.jp/hoge_tomo/20050318.html