レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

php-fpm は、php-cgi で代用できる

2013年4月3日 2014年1月14日
php-fpm php-cgi

これまで、php-fpm による FastCGIの構築について書いてきました。

これは、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

# ↓↓↓ ここから環境変数、パラメータの設定 ↓↓↓
# FASTCGI Server のIPアドレス、ポート番号を指定します。
BIND=127.0.0.1:9000
# FASTCGI Server を起動するユーザ名を指定します。
#  --- ここでは、apacheにしています。Debian系であれば、 www-data でも良いと思います。できれば rootは避けましょう。
USER=apache
# FASTCGI Server でデフォルト起動するプロセス数を指定します。
#  --- ここを0にしてしまうとPHP_FCGI_MAX_REQUESTSで指定した処理数を超えた場合、自動的に php-cgi のプロセスは、全て終了してしまいます。
#  --- 通常は、2以上の数値を設定します。
PHP_FCGI_CHILDREN=5
# FASTCGI Server で1プロセスあたりの処理数を指定します。
#  --- ここで指定した処理数を超えた場合、自動的に php-cgi のプロセスは、再生されます。
PHP_FCGI_MAX_REQUESTS=1000

# php-cgi のパスを指定します。
PHP_CGI_PATH=/usr/bin/php-cgi
# このサービス名を指定します。
PHP_SHELL_NAME="php-fastcgi"

# env (環境変数設定コマンド) のパスを指定します。
ENV_PATH=/bin/env

# PIDファイルパスを指定します。
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 ] && . $FUNCTION_FILE

result_cmd() {
	local rc=$1
	# CentOS Scientific Linux
	# functions ファイルがある場合は、通常のサービスと同じように OK ,NG を出力します。
	if [ -e $FUNCTION_FILE ] ; then
		[ $rc -eq 0 ] && success $"$prog $2" || failure $"$prog $2"
	else
		[ $rc -eq 0 ] && 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です。

CGIのphpinfo画面

ちなみに FPMで動作している場合は、以下のように FPM/FastCGI と出力されます。

FPMのphpinfo画面

また、起動したら以下のようにプロセスが起動されているはずですので、合わせて確認しておきましょう。

$ 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 環境 をインストールします。

# make ,gcc 関連をインストールします。
$ yum -y install make gcc gcc-c++   
...

# xz 圧縮・解凍ツールをインストールします。
$ yum -y install xz
...

# perl をインストールします。
#  -- start-stop-daemon の./configure に必要なツールです。
$ yum -y install perl
...

# ncurses-devel をインストールします。
#  -- start-stop-daemon のmakeに必要なライブラリです。
$ yum -y install ncurses-devel
...

ここでは、わかりやすいように小分けにしていますが、一気に全部をインストールしてもOKです。

start-stop-daemon のソースコードをダウンロードします。

# debianサイトから最新のソースコードパッケージ(dpkg)をダウンロードします。
#  -- 現在(2013.4)では、1.16.10 が最新のようです。ダウンロードする際は、サイトを確認しましょう。
$ 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

# dpkg-1.16.10 ディレクトリが解凍されたソースコード一式のディレクトリになります。
$ ls
dpkg-1.16.10  dpkg_1.16.10.tar.xz
...

start-stop-daemon の構築(make)します。

# dpkg-1.16.10 ディレクトリが解凍されたソースコード一式のディレクトリになります。
$ 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

# 最後までエラー出力がないことを確認し、次へ進みます。

# start-stop-daemon のmakeに必要な compat を先にmakeします。
[dpkg-1.16.10]$ cd lib/compat/
[compat]$ make
  CC     empty.o
  AR     libcompat.a

# start-stop-daemon をmakeします。
[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

# start-stop-daemon を/usr/bin/.へコピーして完了です。
#  -- コピー先は、/sbin/ でも良いです。パスがとおっているところへコピーしましょう。
#  -- (参考までに Deabinでは、/sbin/ にあります。)
[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など) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

Apacheのキャッシュを削除するhtcachecleanを使ってみる

Apacheのキャッシュ(mod_cache,mod_disk_cache)を使ってみる では、Apacheによるキャッシュの設定方法について、 ...

なぜ、Windowsでphp-cgiが自動で終了してしまうのか?(Windows+Nginx+php-cgi.exe)

Windowsで(L)AMP(Nginx,MySQL,PHP)インストールからWordPressを動かすまで で、Windows に (Apac ...

apache の FastCGI(mod_fcgid) で phpを動かしてみる

前回の「apache で phpのモジュール版とcgi版の切り替えを行ってみる」でCGIの環境設定を行いました。 ここでは、更に一歩進んで、F ...

CentOS,ScientificLinuxでLAMP(Lighttpd+MySQL+PHP)インストールからWordpressを動かすまで(Lighttpd編)

今回は、最短でLAMPインストールし、Wordpressを動かすまでの手順について解説してみたいと思います。 とりあえず、CentOS / S ...

Nginx でPHPを動かす(php-fpmをバイナリパッケージ(rpm)を作成し、インストールする) [PHP5.2系の場合]

前回の「Nginxの最新版ソースから バイナリパッケージ(rpm)を作成し、インストールする」に続けて、nginxと一緒にPHPを動作させたいと ...



コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2392 [s]