お客様の要件に合わせる為、色々なミドルウェアを組み合わせて環境を作ります。
今回はApache同梱のmod_phpを使わないでCGIでPHPを動作させる設定です。細かい部分はあるのですが、動くようにわかりやすく要点だけまとめます。
FastCGIの導入をします。
FastCGI
プロセス初回実行時に該当プロセスを一定時間サーバー内に保持することで、次回以降、実行時の「プロセスの起動/終了」を省略し、 高速化や、プロセスの起動/終了に伴うCPUへの負荷を軽減することで、速度面で優れるとされるモジュール版PHPと同等の処理能力を持つ動作方式です。
「FastCGI」を有効(ON)にすることで、一度「プロセスの起動」をすると、一定時間は「プロセスの終了」を することなく起動し続けることで、処理時間の大幅な短縮と、プロセスの起動/終了に伴うCPUへの負荷を軽減します。
@see https://www.xserver.ne.jp/manual/man_server_php_fastcgi.php
リポジトリを入れる
1 |
# yum install yum-plugin-priorities |
【EPEL】
1 |
# yum install epel-release |
【 RPMforge】
1 |
# yum install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm |
mod_fastcgiのインストール
mod_fastcgiモジュールを入れます。
1 |
# yum --enablerepo=rpmforge install mod_fastcgi |
PHPをFastCGIで動かす設定
1 2 3 4 5 6 7 8 9 10 |
# vi /var/www/cgi-bin/php.fastcgi #!/bin/bash PHPRC="/etc/php.ini" PHP_FCGI_CHILDREN=4 PHP_FCGI_MAX_REQUESTS=1000 export PHPRC export PHP_FCGI_CHILDREN export PHP_FCGI_MAX_REQUESTS exec /usr/bin/php-cgi |
所有権設定
1 |
# chown apache:apache /var/www/cgi-bin/php.fastcgi |
実行権限を与えます。
1 |
# chmod +x /var/www/cgi-bin/php.fastcgi |
バーチャルホスト設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# vi /etc/httpd/conf/httpd.conf <VirtualHost *:80> ServerName example.com DocumentRoot /var/www/vhosts/example.com/httpdocs/ ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" <Directory "/var/www/vhosts/example.com/httpdocs/"> Options Includes FollowSymLinks +ExecCGI AddHandler php5-fastcgi .php Action php5-fastcgi /cgi-bin/php.fastcgi AllowOverride All Order allow,deny Allow from All </Directory> </VirtualHost> |
設定を適用させる。
1 |
# service httpd restart |
これでひとまずfastcgiでPHPが動きます。
ここからPHP-FPMと連携させる
PHP-FPMはプロセスを制御・管理してくれる。
FPM (FastCGI Process Manager)
PHP の FastCGI 実装のひとつで、 主に高負荷のサイトで有用な追加機能を用意しています。
以下のような機能があります。
緩やかな (graceful) 停止/起動 機能を含む高度なプロセス管理
異なる uid/gid/chroot/environment でのワーカーの開始、 異なるポートでのリスン、異なる php.ini の使用 (safe_mode の代替)
標準出力および標準エラー出力へのログ出力
opcode キャッシュが壊れた場合の緊急再起動
高速なアップロードのサポート
“slowlog” – 実行時間が非常に長いスクリプトの記録 (スクリプト名だけでなく、PHP バックトレースも記録します。バックトレースを取得するために、 ptrace やそれと同等の仕組みを使ってリモートプロセスの execute_data を読みます)
fastcgi_finish_request() – 何か時間のかかる処理 (動画の変換や統計情報の処理など) を継続しながら リクエストを終了させてすべてのデータを出力させるための特殊な関数
動的/静的 な子プロセスの起動
基本的な SAPI の動作状況 (Apache の mod_status と同等)
php.ini ベースの設定ファイル
yumでPHP-FPMをインストール
1 |
# yum install php-fpm php-cli |
設定ファイル
1 2 3 4 5 6 7 8 |
# vi /etc/httpd/conf.d/fastcgi.conf LoadModule fastcgi_module modules/mod_fastcgi.so 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 |
ディレクトリだけ作る(※空で大丈夫)
1 |
# mkdir /var/www/fcgi-bin |
1 2 3 4 5 6 |
# vi /etc/php-fpm.d/www.conf user = apache group = apache ※ユーザとグループを環境に合わせ適宜変更する。 |
さっき設定したバーチャルホストの設定をPHP-FPM用に書き換える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# vi /etc/httpd/conf/httpd.conf <VirtualHost *:80> NameVirtualHost *:80 ServerName example.com DocumentRoot /var/www/vhosts/example.com/httpdocs/ DirectoryIndex index.html index.htm index.php <Directory "/var/www/vhosts/example.com/httpdocs/"> Options Includes FollowSymLinks +ExecCGI AllowOverride All Order allow,deny Allow from All </Directory> </VirtualHost> |
Apache既存のmod_phpモジュール用設定ファイルを無効化する。
1 |
# mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf.org |
Apacheに設定を反映させる
1 |
# service httpd restart |
php-fpmを起動させよう
1 2 |
# service php-fpm start # chkconfig php-fpm on |
簡単にまとめるつもりが長くなっちゃいましたね。
お疲れ様です。