apacheの設定を確認しましょう
CentOSの場合、apache上でのphpの動作環境は、
/etc/httpd/conf.d/php.conf
で設定するようになっています。
デフォルトでは、以下のようになっていると思います。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| #
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
LoadModule php5_module modules/libphp5.so
#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php5-script .php
AddType text/html .php
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php
#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps
|
これは、phpのモジュール版の設定となっています。
モジュール版は、apacheが起動と同時にphpのロードライブラリ(Windowsで言うDLLと同じ)を読み込み、apacheのプロセスの中で、phpを実行するということです。
それに対してCGI版は、文字通りapacheのプロセスとは別にphpのプロセスをcgiとして実行させます。
安全なのは、CGI版+suEXEC での実行だといわれていますが、速度からするとモジュール版が優位と言われています。
自宅サーバーやVPSなど、自分でリソースを自由に使える環境下では、モジュール版を利用するのが良いと思いますが、
複数でサーバーの管理をする場合、どうしても誤って大事な他人の情報を削除したりしかねないので、共有サーバーでは、CGI版+suEXEC で実行されているのが普通です。
続けて、このphpをCGI版に変更してみます。
今現在、phpがどちらのモードで動作しているか不明な場合は、
<?php echo phpinfo(); ?> でphpの環境を表示してみましょう。
CGI版
Server API :
CGI
モジュール版
Server API :
Apache 2.0 Handler
あるいは、
Server API :
Apache
phpをCGI版へ切り替える
phpをモジュール版からCGI版へ切り替えるには、同じように
/etc/httpd/conf.d/php.conf
を設定してあげます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| #
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
LoadModule php5_module modules/libphp5.so
#
# Cause the PHP interpreter to handle files with a .php extension.
#
##AddHandler php5-script .php
##AddType text/html .php
Action php52-cgi /cgi-bin/php52
AddHandler php52-cgi .php .phps
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php
#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps
|
12 – 15 行目の変更だけです。
とりあえず、モジュール版の設定をコメントアウトして、
CGI版の設定を追加しています。
14行目は、
/cgi-bin/php52 という実行ファイルを実行する名前をphp52-cgiと定義したものです。
このため、apacheのカレントディレクトリから/cgi-bin/php52という実行ファイルが存在しないといけません。
$ cd /var/www/cgi-bin
$ ln -s /usr/bin/php-cgi php52
$
|
/var/www/cgi-binは、あくまで例です。
apacheの設定ファイル httpd.conf (デフォルトでは、
/etc/httpd/conf/httpd.conf) を確認しておきましょう。
デフォルトでは、以下のような設定があります。
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
AllowOverride None
# Options None
Options FollowSymLinks
Order allow,deny
Allow from all
</Directory>
|
Optionsは、デフォルトで
Noneになっていますので、
FollowSymLinksにしておきます。
FollowSymLinksは、シンボリックリンクをたどることを許可するものです。
(
lnで
/usr/bin/php-cgiのシンボリックリンクファイルを作成しているので許可しておかないとエラーになります。)
また、もし、
php-cgiのありかが不明な場合は、
whichコマンドで確認しましょう。
$ which php-cgi
/usr/bin/php-cgi
$
|
同じようにサイトの定義ももちろん必要です。
以下は、例として
example.comのサイト定義です。
<VirtualHost *:80>
ServerName example.com
DocumentRoot "/home/example"
ServerAlias www.example.com
<Directory "/home/example">
Options FollowSymLinks Includes ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
|
ここで重要なのは、
Options FollowSymLinks Includes
ExecCGI
を定義している点です。
もちろん、ALL指定でもOKですけど、最低限の設定を行いたい場合は、
+ExecCGIなどの指定がよく使われるパターンです。
などとし、php-cgiをリンクしておきましょう。
15行目は、
.php .phps の拡張子を持つファイルは、php52-cgiという名前のActionを実行するように定義したものです。
また、モジュール版は使わないなら、
6 行目のLoadModuleもコメントアウトしておきましょう。
最後にapacheをリスタートすればOKです。
$ /etc/init.d/httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]
$
|
必ず、<?php echo phpinfo(); ?> でphpの環境を表示して、phpがどちらのモードで動作しているか確認しておきましょう。
.htaccess が使えるなら
AddHandler php5-script .php
AddType text/html .php
|
とすれば、
モジュール版に切り替えられます。(このとき、php.confの中のLoadmoduleは消してはいけません。)
また、
Action php52-cgi /cgi-bin/php52
AddHandler php52-cgi .php .phps
|
とすれば、
CGI版に切り替えられます。
こっちが簡単で便利かもしれませんね。
もちろん、このときでも
$ cd /var/www/cgi-bin
$ ln -s /usr/bin/php-cgi php52
$
|
と
httpd.confの以下の変更は最低限必要ですけどね。
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
AllowOverride None
# Options None
Options FollowSymLinks
Order allow,deny
Allow from all
</Directory>
|
ここでapacheを起動して、phpをCGIで動作させようとしたときに、
Premature end of script headers
とエラーが出力されることがあります。
これは、CGI版のphpが動作していないことが原因かもしれません。
lnコマンドを使う時のファイル名(php-cgi)に誤りがないか確認しましょう。
昔、自分は、php-cgiじゃなくってphpをリンクしちゃって、このエラーに悩んだことがありました。
2011年9月9日, 12:07 AM
[…] […]
2011年9月11日, 12:05 PM
[…] […]
2012年1月23日, 9:30 AM
[…] http://www.ahref.org/tech/server/server-tips/667.html http://sakura.off-soft.net/centos/php_cgi_module_exchange.html […]