ご利用のブラウザは、JavaScript が無効 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
これまで、php-fpm による FastCGIの構築について書いてきました。
CentOS Scientific Linux :
Debian Ubuntu :
これは、php-fpm が楽にインストールできるので、そのようにしてきましたが、必ずしも、FastCGIを使うために php-fpm が必要なわけではありません。
表題のように、php-fpm は、php-cgi で代用できる・・・というより、そもそもphp-fpm は、php-cgi のプロセス管理をしているに過ぎないのです。
また、php-fpm が デフォルトで提供されていなかった php 5.2 系以前 (5.3系からデフォルトでphp-fpm が提供されるようになった) においては、自前で php-fpm を構築(make)するか、php-cgi を普通に使っていました。
これらのことからも、php-cgi があれば、実はFastCGIを利用できるのは間違いないのです。
php-cgi には、Windowsで(L)AMP(Nginx,MySQL,PHP)インストールからWordPressを動かすまで でも解説しているとおり、 バージョン 5 以降、以下の環境変数を利用することができるようになっています。
PHP_FCGI_MAX_REQUESTS :
先にも解説したように php-cgiが処理する要求数 になります。ここで設定された回数の要求を処理したら、自動で終了します。
デフォルト : 500 回です。
PHP_FCGI_CHILDREN :
php-cgiが管理する子プロセス数 になります。この値が0より大きい値の場合は、その数だけ子プロセスを生成します。
この場合、先のPHP_FCGI_MAX_REQUESTS は、子プロセスに対して有効となります。子プロセスが要求回数を満たし、自動的に終了しても、親プロセスが再起動してくれます。
デフォルト : 0 です。子プロセスを管理しません。
この環境変数を見てもらえればわかりますが、php-cgi 自体にプロセス管理(正確には、子プロセス管理)する機能があります。
またphp-cgi のパラメータには、以下のように FASTCGI Server mode があります。
$ php-cgi -- help
Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
php <file> [args... ]
-a Run interactively
-b <address:port>|<port> Bind Path for external FASTCGI Server mode
-C Do not chdir to the script's directory
-c <path>|<file> Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f <file> Parse <file>. Implies `-q'
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-q Quiet-mode. Suppress HTTP Header output.
-s Display colour syntax highlighted source.
-v Version number
-w Display source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.
-T <count> Measure execution time of script repeated <count> times.
つまり、先の環境変数、php-cgi のパラメータ -b
を使えば、php-fpm もどきが、当たり前のようにできます。
今回は、php-cgi を使ってFastCGIを利用するための サービスを作成、登録し、php-fpm の代用として使ってみます。
php-cgi を使って FASTCGI Serverを構築する
ここでは、php-cgi を使って FASTCGI Serverを構築してみます。
サービス用のスクリプトを /etc/init.d/php-fastcgi を作成する
まずは、サービス用のスクリプトを /etc/init.d/php-fastcgi として以下のように作成します。
[/etc/init.d/php-fastcgi ]
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/bin/bash
#
# php-fastcgi PHP FastCGI Process Manager
#
# chkconfig: - 84 16
# description: PHP FastCGI Process Manager
# processname: php-cgi
# config: /etc/php.conf
### BEGIN INIT INFO
# Provides: php-fastcgi
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts php-fastcgi
# Description: Starts PHP FastCGI Process Manager Daemon
### END INIT INFO
# ↓↓↓ ここから環境変数、パラメータの設定 ↓↓↓
BIND =127.0.0.1:9000
USER =apache
PHP_FCGI_CHILDREN =5
PHP_FCGI_MAX_REQUESTS =1000
PHP_CGI_PATH =/usr/bin/php-cgi
PHP_SHELL_NAME ="php-fastcgi"
ENV_PATH =/bin/env
PHP_FPM_PID =/var/run/php-cgi.pid
# ↑↑↑ ここまで環境変数、パラメータの設定 ↑↑↑
ENV_EXE ="$ENV_PATH -- - USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS "
PHP_CGI_EXE ="$PHP_CGI_PATH -b $BIND "
RETVAL =0
# CentOS Scientific Linux 用
# functions ファイルがある場合は、読み込みます。
FUNCTION_FILE =/ etc/ rc.d/ init.d/ functions
[ -e $FUNCTION_FILE ] & amp;& amp; . $FUNCTION_FILE
result_cmd( ) {
local rc =$1
# CentOS Scientific Linux 用
# functions ファイルがある場合は、通常のサービスと同じように OK ,NG を出力します。
if [ -e $FUNCTION_FILE ] ; then
[ $rc -eq 0 ] & amp;& amp; success $"$prog $2" || failure $"$prog $2"
else
[ $rc -eq 0 ] & amp;& amp; echo -n "[ OK ]" || echo -n "[ NG ]"
fi
echo
return $rc
}
start( ) {
echo -n "Starting PHP FastCGI: "
RETVAL =1
if [ ! -e $PHP_FPM_PID ] ; then
start-stop-daemon --quiet --start --background --make-pidfile --pidfile $PHP_FPM_PID --chuid "$USER " --exec $ENV_EXE $PHP_CGI_EXE
RETVAL =$?
fi
result_cmd $RETVAL "startup"
}
stop( ) {
echo -n "Stopping PHP FastCGI: "
RETVAL =1
if [ -e $PHP_FPM_PID ] ; then
start-stop-daemon --stop --pidfile $PHP_FPM_PID
RETVAL =$?
fi
result_cmd $RETVAL "shutdown"
if [ $RETVAL -eq 0 ] ; then
rm -f $PHP_FPM_PID ;
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
* )
echo "Usage: $PHP_SHELL_NAME {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
あっても問題なく動作しますが、
Debian Ubuntu の場合や、結果出力(OK,NG)が不要な方は、
53 – 57 行目 まで、
64 – 68 行目 まで、
を削除しても構いません。
この処理は、
CentOS Scientific Linux のためにあります。
$ /etc/init.d/php-fastcgi stop
Stopping PHP FastCGI: [失敗]
$ /etc/init.d/php-fastcgi start
Starting PHP FastCGI: [ OK ]
のように OK,NG を通常のサービスと同じように出力させるためあります。
サービス用のスクリプトを /etc/init.d/php-fastcgi を実行する
先に作成した サービス用のスクリプト /etc/init.d/php-fastcgi を実行してみましょう。
実行の仕方は、通常のサービスと同じように start/stop で起動・停止できます。
$ /etc/init.d/php-fastcgi start
Starting PHP FastCGI: [ OK ]
$ /etc/init.d/php-fastcgi stop
Stopping PHP FastCGI: [ OK ]
もし、php-fpmが動作してる場合は、必ず、php-fpmを停止し、実行させてください。
こんな感じで出力されればOKです。
CentOS Scientific Linux では、以下のようにエラーが出力されることがあります。
Starting PHP FastCGI: /etc/init.d/php-fastcgi: line 67: start-stop-daemon: コマ ンドが見つかりません
これは、
start-stop-daemon がインストールされていないためです。
そもそも
start-stop-daemon は、Debian系ディストリビューションには、デフォルトでインストールされていますが、Redhat系には、インストールされていません。
この場合、
start-stop-daemon をインストールする必要があります。インストール方法は、
start-stop-daemon をインストールする を参照してください。
FastCGIに対応したウェブサーバーが立ち上がっているなら、<?php echo phpinfo(); ?>
を出力してみてください。
以下のように出力されればOKです。
ちなみに FPMで動作している場合は、以下のように FPM /FastCGI と出力されます。
また、起動したら以下のようにプロセスが起動されているはずですので、合わせて確認しておきましょう。
$ ps aux| grep php
apache 14160 0.0 0.7 34120 7788 ? Ss 19:09 0:00 /usr/bin/php-cgi -b 127.0.0.1:9000
apache 14162 0.0 0.2 34120 2816 ? S 19:09 0:00 /usr/bin/php-cgi -b 127.0.0.1:9000
apache 14163 0.0 0.2 34120 2816 ? S 19:09 0:00 /usr/bin/php-cgi -b 127.0.0.1:9000
apache 14164 0.0 0.2 34120 2816 ? S 19:09 0:00 /usr/bin/php-cgi -b 127.0.0.1:9000
apache 14165 0.0 0.2 34120 2816 ? S 19:09 0:00 /usr/bin/php-cgi -b 127.0.0.1:9000
apache 14166 0.0 0.2 34120 2816 ? S 19:09 0:00 /usr/bin/php-cgi -b 127.0.0.1:9000
root 14168 0.0 0.0 5436 808 pts/1 R+ 19:10 0:00 grep php
Ss が親プロセス、S が子プロセスです。
PHP_FCGI_CHILDREN で指定したとおり 5つの子プロセスが起動しています。
サービス用のスクリプトを 再起動しても自動的に立ち上がるように設定する
CentOS Scientific Linux の場合
$ chkconfig -- add php- fastcgi
$ chkconfig -- list | grep php
php-fastcgi 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Debian Ubuntu の場合
$ sysv-rc-conf php- fastcgi on
$ sysv-rc-conf -- list| grep php
php-fastcgi 2:on 3:on 4:on 5:on
Debian(Ubuntu)で サービスの起動、停止を管理するツールを調べてみた(chkconfigのかわりになるもの) 参照。
もし、php-fpmが動作してる場合は、必ず、php-fpmを停止し、ここで再起動しても自動的に立ち上がらない ように設定しておきましょう。
start-stop-daemon をインストールする(おまけ)
ここでは、CentOS Scientific Linux に start-stop-daemon をインストールしてみます。
start-stop-daemon は、そもそも Debian系のツールなので、バイナリパッケージもありません。そのため、ソースコードから 構築する必要があります。
ただ、順を追ってやれば、それほど難しい作業でもありませんので、頑張ってみましょう。
make 環境 をインストールします。
start-stop-daemon のソースコードをダウンロードします。
$ wget http:// ftp. de. debian. org/ debian/ pool/ main/ d/ dpkg/ dpkg_1. 16. 10. tar. xz
...
$ tar Jxf dpkg_1. 16. 10. tar. xz
$ ls
dpkg-1.16.10 dpkg_1.16.10.tar.xz
...
start-stop-daemon の構築(make)します。
$ ls
dpkg-1.16.10 dpkg_1.16.10.tar.xz
...
$ cd dpkg- 1. 16. 10
[dpkg-1.16.10]$ ./configure
checking for gcc... gcc
...
config.status: creating scripts/po/Makefile
[dpkg-1.16.10]$ cd lib/ compat/
[compat]$ make
CC empty.o
AR libcompat.a
[compat]$ cd ../../ utils/
[utils]$ make
CCLD update-alternatives
CC start-stop-daemon.o
CCLD start-stop-daemon
CC install-info.o
CCLD dpkg-install-info
[utils]$ ls
Makefile install-info.c t
Makefile.am install-info.o update-alternatives
Makefile.in start-stop-daemon update-alternatives.c
README.alternatives start-stop-daemon.c update-alternatives.o
dpkg-install-info start-stop-daemon.o
[utils]$ cp start- stop- daemon / usr/ bin/.
このやり方は、php-fpmが出てくるまでは、普通にやっていたことです。
ただ、CentOS Scientific Linux では、start-stop-daemon のインストールが面倒ですから、
どうしてもネットの記事は、php-fpmでの設定が多くなりました。
しかし、この php-cgiは、リソース的にもパフォーマンス的にもphp-fpmより優れているとされています。(php-fpmは、php-cgiのラッパー的なものですから、当然と言えば当然ですかね。)
極端な差はないものの、確かに多少はあります。大規模なサイトでは、それなりに違ってくるのかもしれませんね。
少しでもリソース、パフォーマンスの向上を目指す方は、お試しあれ。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
関連記事 :
コメントを投稿 :