apacheのmod_fastcgiをインストールしましょう
apacheのFastCGIのためのモジュール mod_fastcgi をインストールします。
mod_fastcgiは、mod_fcgidと異なり、サードパーティのモジュールになります。
CentOS、Scientific LinuxなどのRedHat系のLinuxでは、make インストールする必要がありましたが、
Debian、Ubuntuでは、apacheのモジュールは、a2enmod でインストールすることができます。
以下のようにインストールできます。
$ aptitude install libapache2-mod-fastcgi
...
$ a2enmod fastcgi actions
...
|
fastcgi, actionsモジュールをインストールしておきます。
fastcgi は、 先にインストールした libapache2-mod-fastcgi を使用するためのモジュール です。
actions は、 Action ディレクティブを使用するためのモジュールです。
Debianでは、libapache2-mod-fastcgi は、non-free となっています。(ライセンスがGNUでない)
そのため、デフォルトの設定のままでは、aptでインストールできないようになっています。
$ aptitude install libapache2-mod-fastcgi
libapache2-mod-fastcgi のインストール候補のバージョンが見つかりません
インストール・削除・更新されるパッケージがありません。
...
|
ライセンスを確認の上でインストールする場合は、non-freeを有効にするために、/etc/apt/
source.list を編集します。
...
deb http://ftp.jp.debian.org/debian/ squeeze main non-free
deb-src http://ftp.jp.debian.org/debian/ squeeze main non-free
...
deb http://ftp.jp.debian.org/debian/ squeeze-updates main non-free
deb-src http://ftp.jp.debian.org/debian/ squeeze-updates main non-free
...
|
編集を終えたら、update実行の上、再度、インストールしてみましょう。
$ aptitude update
...
$ aptitude install libapache2-mod-fastcgi
以下の新規パッケージがインストールされます:
libapache2-mod-fastcgi
...
|
apacheのmod_fastcgiの設定を行いましょう
先の手順で、モジュール fastcgi を a2enmod で有効にすると自動的に2つのファイルが作成されます。
ここでは、/etc/apache2/mods-enabled/fastcgi.conf の編集を行います。
/etc/apache2/mods-enabled/の直下には、 a2enmod で有効したモジュールの詳細設定ファイル(.conf)、ロード設定ファイル(.load) がそれぞれペアで自動手で作成、保存されます。
これらのファイルは、apache(httpd)が起動するときに自動的に読み込まれます。
/etc/apache2/mods-enabled/fastcgi.confの編集イメージ
1
2
3
4
5
6
| <IfModule mod_fastcgi.c>
ScriptAlias /fcgi-bin/ /var/www/fcgi-bin/
FastCGIExternalServer /var/www/fcgi-bin/php-fpm -host 127.0.0.1:9000
AddHandler php-fastcgi .php
Action php-fastcgi /fcgi-bin/php-fpm
</IfModule>
|
2 行目 : ディレクトリの別名定義です。/var/www/fcgi-bin/ → /fcgi-bin/ として割り当てています。
3 行目 : FastCGI のサーバー設定を行っています。
IPアドレス : 127.0.0.1 の tcp ポート番号 : 9000 へ /var/www/fcgi-bin/php-cgi を使って処理するように依頼します。
4 – 5 行目 : phpファイルの動作をCGIで実行するように設定を行っています。
( 参照 : apache で phpのモジュール版とcgi版の切り替えを行ってみる )
ホスト名、TCPポート番号は、PHP-FPMの設定にあわせる必要があります。
/var/www/fcgi-bin/php-fpm というファイル自体は、存在する必要はありません。
ただし、パス(ディレクトリ)は存在しないと動作しません。さらに、Actionで定義しているCGIパスと同じディレクトリ、同じファイル名を指すように設定します。
php モジュール版が有効になっている場合は、無効にしておきます。
$ a2dismod php5
Module php5 disabled.
Run '/etc/init.d/apache2 restart' to activate new configuration!
|
apacheの設定を行いましょう
apacheの設定は、cgiの設定と同じで、ディレクトリでCGIが実行可能なように設定する必要があります。
( 参照 : apache で phpのモジュール版とcgi版の切り替えを行ってみる )
以下は、デフォルトのウェブサイトの設定ファイル ( /etc/apache2/sites-available/default )の編集イメージです。
例としてwww.exmaple.comとして設定しています。
[/etc/apache2/sites-available/default]
<VirtualHost *:80>
# serverの管理者メールアドレスを設定します。
#ServerAdmin webmaster@localhost
ServerAdmin www@example.com
# serverのサーバー名を設定します。
ServerName www.exmaple.com
# CentOSなどのデフォルトのホームディレクトリに合わせておきます。
DocumentRoot /var/www/html
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory "/var/www/html/">
# "/var/www/html"ディレクトリ配下では、CGIが実行できるようにします。
#Options Indexes FollowSymLinks MultiViews
Options Includes ExecCGI FollowSymLinks
# "/var/www/html"ディレクトリ配下では、.htaccess を常に有効にします。
#AllowOverride None
AllowOverride All
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
|
ここで重要なのは、
Options ... ExecCGI ...
を定義している点です。
もちろん、ALL指定でもOKですけど、最低限の設定を行いたい場合は、+ExecCGIなどの指定がよく使われるパターンです。
PHP-FPMをインストールしましょう
PHP-FPMをインストールしていない場合は、まずは、インストールしましょう。
ここでは、Dotdebから 最新のPHP、PHP-FPM をインストールしてみます。
以下の記事でも同じ作業をやっています。
既にDotdebの設定を終えられている方は、Dotdeb から最新のphpをインストールするへ進みましょう。
-
Dotdebのサイトをパッケージダウンロード先として登録する
いわゆるリポジトリの登録です。/etc/apt/sources.list の末尾に以下を追記します。
$ vi /etc/apt/sources.list
...
deb http://packages.dotdeb.org squeeze all
deb-src http://packages.dotdeb.org squeeze all
|
sources.list の書式
- バイナリパッケージの書式:
deb URL Distribution [component1] [component2]…
- ソースパッケージの書式:
deb-src URL Distribution [component1] [component2]…
現在(2012.8)では、nginx 1.2.3 が最新版としてリリースされています。
Dotdeb のリポジトリでは、安定(stable)版 の最新版のみが提供されています。
もし、別のバージョンが欲しい場合(例えば開発(Develop)版など)は、nginxの公式サイトでソースコードの入手からはじめる必要があります。
- Dotdebのサイトから、パッケージの公開鍵をダウンロードし、apt-keyで追加する
Debian / Ubuntu では、ダウンロードするパッケージが安全か否かを判断するための公開キーを追加する必要があります。
$ wget http://www.dotdeb.org/dotdeb.gpg
...
$ apt-key add dotdeb.gpg
OK
|
- apt-get でキャッシュならびシステムの更新を行う
ダウンロード先の登録などを行った場合は、キャッシュ情報など更新のために apt-get (aptitudeでも可) でアップデートを行います。
$ apt-get update
...
Reading package lists... Done
|
- 最新のPHPをインストールする
最後にPHPのインストールです。
$ apt-get -y install php5-cli php5-mysql php5-common php5 php5-cgi php5-fpm php5-gd
...
Reading package lists... Done
|
上記は、概ね必要なパッケージを一緒にインストールしています。
個人的には、XML関連とSNMP、TIDY、APC を追加してインストールしました。
$ apt-get -y install php5-cli php5-mysql php5-common php5 php5-cgi php5-fpm php5-gd php5-snmp php5-xmlrpc php5-tidy php5-apc
...
|
ここでは、php5-fpm は必須です。
一応、インストールを終えたら、バージョンを確認してみましょう。
$ php -v
PHP 5.3.11-1~dotdeb.0 with Suhosin-Patch (cli) (built: Apr 30 2012 07:42:25)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
with Suhosin v0.9.33, Copyright (c) 2007-2012, by SektionEins GmbH
|
現在では、Debian本家のリポジトリが、PHP 5.3.7 に対して 一応、Dotdebが PHP 5.3.11 を提供していますから、上記のように出力されれば、
ちゃんと Dotdeb から最新パッケージをインストールできたことを確認できたことになるでしょう。
PHP-FPMの設定を行いましょう
先の手順でインストールしたPHP-FPMの設定を行います。
PHP5.3 系のPHP-FPM をインストールした場合、設定ファイルは、ini形式になります。
デフォルトのファイルは、インストールした時に同時にインストールされます。
編集が必要な設定ファイルは、/etc/php5/fpm/pool.d/www.conf になります。
/etc/php5/fpm/pool.d/www.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
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
| ; Start a new pool named 'www'.
[www]
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses on a
; specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9000
; Set listen(2) backlog. A value of '-1' means unlimited.
; Default Value: -1
;listen.backlog = -1
; List of ipv4 addresses of FastCGI clients which are allowed to connect.
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
; must be separated by a comma. If this value is left blank, connections will be
; accepted from any ip address.
; Default Value: any
listen.allowed_clients = 127.0.0.1
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions.
; Default Values: user and group are set as the running user
; mode is set to 0666
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0666
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache
; Choose how the process manager will control the number of child processes.
; Possible Values:
; static - a fixed number (pm.max_children) of child processes;
; dynamic - the number of child processes are set dynamically based on the
; following directives:
; pm.max_children - the maximum number of children that can
; be alive at the same time.
; pm.start_servers - the number of children created on startup.
; pm.min_spare_servers - the minimum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is less than this
; number then some children will be created.
; pm.max_spare_servers - the maximum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is greater than this
; number then some children will be killed.
; Note: This value is mandatory.
;pm = dynamic
pm = static
; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes to be created when pm is set to 'dynamic'.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI.
; Note: Used when pm is set to either 'static' or 'dynamic'
; Note: This value is mandatory.
;pm.max_children = 50
pm.max_children = 3
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 5
; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 5
; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 35
; The number of requests each child process should execute before respawning.
; This can be useful to work around memory leaks in 3rd party libraries. For
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
; Default Value: 0
;pm.max_requests = 500
pm.max_requests = 5
; The URI to view the FPM status page. If this value is not set, no URI will be
; recognized as a status page. By default, the status page shows the following
; information:
; accepted conn - the number of request accepted by the pool;
; pool - the name of the pool;
; process manager - static or dynamic;
; idle processes - the number of idle processes;
; active processes - the number of active processes;
; total processes - the number of idle + active processes.
; The values of 'idle processes', 'active processes' and 'total processes' are
; updated each second. The value of 'accepted conn' is updated in real time.
; Example output:
; accepted conn: 12073
; pool: www
; process manager: static
; idle processes: 35
; active processes: 65
; total processes: 100
; By default the status page output is formatted as text/plain. Passing either
; 'html' or 'json' as a query string will return the corresponding output
; syntax. Example:
; http://www.foo.bar/status
; http://www.foo.bar/status?json
; http://www.foo.bar/status?html
; Note: The value must start with a leading slash (/). The value can be
; anything, but it may not be a good idea to use the .php extension or it
; may conflict with a real PHP file.
; Default Value: not set
;pm.status_path = /status
; The ping URI to call the monitoring page of FPM. If this value is not set, no
; URI will be recognized as a ping page. This could be used to test from outside
; that FPM is alive and responding, or to
; - create a graph of FPM availability (rrd or such);
; - remove a server from a group if it is not responding (load balancing);
; - trigger alerts for the operating team (24/7).
; Note: The value must start with a leading slash (/). The value can be
; anything, but it may not be a good idea to use the .php extension or it
; may conflict with a real PHP file.
; Default Value: not set
;ping.path = /ping
; This directive may be used to customize the response of a ping request. The
; response is formatted as text/plain with a 200 response code.
; Default Value: pong
;ping.response = pong
; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the 'max_execution_time' ini option
; does not stop script execution for some reason. A value of '0' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
;request_terminate_timeout = 0
; The timeout for serving a single request after which a PHP backtrace will be
; dumped to the 'slowlog' file. A value of '0s' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
;request_slowlog_timeout = 0
; The log file for slow requests
; Default Value: not set
; Note: slowlog is mandatory if request_slowlog_timeout is set
slowlog = /var/log/php-fpm/www-slow.log
; Set open file descriptor rlimit.
; Default Value: system defined value
;rlimit_files = 1024
; Set max core size rlimit.
; Possible Values: 'unlimited' or an integer greater or equal to 0
; Default Value: system defined value
;rlimit_core = 0
; Chroot to this directory at the start. This value must be defined as an
; absolute path. When this value is not set, chroot is not used.
; Note: chrooting is a great security feature and should be used whenever
; possible. However, all PHP paths will be relative to the chroot
; (error_log, sessions.save_path, ...).
; Default Value: not set
;chroot =
; Chdir to this directory at the start. This value must be an absolute path.
; Default Value: current directory or / when chroot
;chdir = /var/www
; Redirect worker stdout and stderr into main error log. If not set, stdout and
; stderr will be redirected to /dev/null according to FastCGI specs.
; Default Value: no
;catch_workers_output = yes
; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
; Default Value: clean env
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp
; Additional php.ini defines, specific to this pool of workers. These settings
; overwrite the values previously defined in the php.ini. The directives are the
; same as the PHP SAPI:
; php_value/php_flag - you can set classic ini defines which can
; be overwritten from PHP call 'ini_set'.
; php_admin_value/php_admin_flag - these directives won't be overwritten by
; PHP call 'ini_set'
; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no.
; Defining 'extension' will load the corresponding shared extension from
; extension_dir. Defining 'disable_functions' or 'disable_classes' will not
; overwrite previously defined php.ini values, but will append the new value
; instead.
; Default Value: nothing is defined by default except the values in php.ini and
; specified at startup with the -d argument
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 32M
|
確認・編集すべき項目は、赤文字の箇所になります。
listen = 127.0.0.1:9000 :
mod_fastcgi の FastCGIExternalServer 設定 で 指定しているホスト名、TCPポート番号と同じでなければなりません。
listen.allowed_clients = 127.0.0.1 :
アクセスを許可するクライアントホスト名になります。ここではlocalhostのみです。
user = apache :
group = apache :
PHP-FPM プロセスのユーザ名、グループ名を指定します。
pm = static :
PHP-FPM プロセス管理は、固定(static) とします。メモリ管理しやすくなります。dynamic を指定した場合、動的となりアクセスが多くなるとメモリ消費も多くなります。
pm.max_children = 3 :
PHP-FPM プロセスの最大子プロセス数です。ここではテスト用として少なく3を指定しています。
pm.start_servers = 5 :
PHP-FPM プロセスの最初に立ち上げる子プロセス数です。ここではテスト用として5を指定しています。
pm.max_childrenより大きい値を指定するのは間違っています。ここではあえて間違いを指定しています。
pm.max_childrenより大きい値を指定した場合は、pm.max_childrenの数値が優先されます。
pm.max_requests = 5 :
PHP-FPM プロセスの子プロセス数が、最大処理するプロセス数です。ここではテスト用として5を指定しています。
通常は、500以上を指定しますが、テストとしてプロセス番号がちゃんと切り替わるか確認するために小さい値を指定しています。運用時は、500以上の値を指定しましょう。
PHP-FPM, apacheを起動して確認しましょう
いよいよ起動、確認です。
$ /etc/init.d/php5-fpm start
$ /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting .
|
必ず、<?php echo phpinfo(); ?> でphpの環境を表示して、PHP-FPMが動作していることを確認しましょう。
PHP-FPM/CGI版
Server API :FPM/FastCGI
こんな感じで有効になっていればOKです。
いかがだったでしょうか?
CentOS、ScientificLinuxからすれば、かなり簡単ですね。やっぱり make作業がないのは 非常に楽です。
PHP-FPM + APC でメモリの節約、高速化を図ることができます。
ただ、nginxのリバースプロキシによるキャッシュには、さすがに負けますが、
さくらのVPS などメモリが限られたサーバーでapacheを使いたい場合には、1つの手段だと思います。
お試しあれ。
コメントを投稿 :