2: 2018-02-12 (月) 21:15:30 maruo |
現: 2018-02-17 (土) 20:49:50 maruo |
| FastCGIは、PHPのプロセスを予め起動させておき、ApacheにHTTPリクエストが来るたびに、TCPもしくはUnix Dmain Socket経由で常駐PHPプロセスに処理をさせます。 | | FastCGIは、PHPのプロセスを予め起動させておき、ApacheにHTTPリクエストが来るたびに、TCPもしくはUnix Dmain Socket経由で常駐PHPプロセスに処理をさせます。 |
| | | |
- | この中で、GCI方式が最も重そうな方法であることはご理解いただけるかと。mod_phpが最もシンプルな方法なのですが、1つのバージョンしか使えない。なので、主となるバージョンはmod_phpで、旧型バージョンはFastCGIで駆動させる方法を採用することとします。 | + | この中で、GCI方式が最も重そうな方法であることはご理解いただけるかと。mod_phpが最もシンプルな方法なのですが、1つのバージョンしか使えない。なので、FastCGIで複数バージョンを同時駆動させる方法を採用することとします。 |
- | | + | |
- | このわけかたとして、デフォルトは何も指定せずモジュール版で駆動させ、旧版PHPで動かしたいアプリだけ、.htaccessに設定を記載してやることで旧版で動作させることを実施します。 | + | |
| | | |
| *準備 [#qde4619d] | | *準備 [#qde4619d] |
| **PHPのビルド [#cc5b2304] | | **PHPのビルド [#cc5b2304] |
- | -PHPのUSEフラグに"apache2 fpm"の2つを追加します。 | + | -PHPのUSEフラグに"fpm"を追加します。 |
| -make.confに以下の記述を追加します。 | | -make.confに以下の記述を追加します。 |
| PHP_TARGETS="php5-6 php7-1" | | PHP_TARGETS="php5-6 php7-1" |
| | | |
| ApacheのFCGI Proxyモジュールを用いて、バックエンドのPHPと通信致します。 | | ApacheのFCGI Proxyモジュールを用いて、バックエンドのPHPと通信致します。 |
- | | |
| | | |
| **Apache側 [#d3cc21d5] | | **Apache側 [#d3cc21d5] |
| | | |
| **PHP側 [#x573b2c4] | | **PHP側 [#x573b2c4] |
| + | ***起動PHPの指定 [#p437996e] |
| 今回は、以下の設定とします。 | | 今回は、以下の設定とします。 |
- | -モジュール版はPHP7.1 | + | -FastCGIのデフォルトはPHP7.1 |
- | -FastCGI側はPHP5.6 | + | -さらにもう一つFastCGIのPHP5.6を駆動する |
| | | |
- | で、それぞれ起動するバージョンを設定してやります。 | + | 起動するバージョンを設定してやります。 |
- | # eselect php set apache2 php7.1 | + | # eselect php set fpm php7.1 |
- | # eselect php set fpm php5.6 | + | |
| | | |
- | 次に、/etc/php/fpm-php5.6/php-fpm.confを編集します。今回は、UNIXドメインソケットで通信出来るように設定します。以下の項を注意して設定します。 | + | さらに、普通に設定すると、FPM版PHPの起動シェルは1つしかありません。eselectで指定したバージョンを起動してくれます。ので、指定バージョンを起動するシェルを作ってあげます。 |
| + | # cd /etc/init.d |
| + | # cp php-fim php-fpm5.6 |
| + | # vi php-fpm5.6 |
| + | |
| + | さて、このコピーしたphp-fpm5.6の頭にある以下の部分を修正します。 |
| + | |
| + | PHP_SLOT="${SVCNAME#php-fpm-}" |
| + | ↓ |
| + | PHP_SLOT="php5.6" |
| + | |
| + | eselectで指定するphpのバージョン名ね |
| + | |
| + | ***PHP7.1側の設定 [#ocf82257] |
| + | /etc/php/fpm-php7.1/fpm.d/www.confを編集します。今回は、UNIXドメインソケットで通信出来るように設定します。以下の項を注意して設定します。 |
| | | |
| user = nobody # FPM版のPHPの起動ユーザ権限 | | user = nobody # FPM版のPHPの起動ユーザ権限 |
| | | |
| 特に起動ユーザ、グループ、ソケットのユーザ、グループ、アクセス権は注意して設定してくださいね。Apacheの起動ユーザ権限とソケットのアクセス権が合っていないと、「Permission Denied」と言われます。また、PHP-FPMの起動ユーザ、グループがWebアプリ側のアクセス権と合っていないと、PHP-FPM側は、Webアプリファイルにアクセス出来ないと言われます。apacheのerror_logをよく見ててくださいね~ | | 特に起動ユーザ、グループ、ソケットのユーザ、グループ、アクセス権は注意して設定してくださいね。Apacheの起動ユーザ権限とソケットのアクセス権が合っていないと、「Permission Denied」と言われます。また、PHP-FPMの起動ユーザ、グループがWebアプリ側のアクセス権と合っていないと、PHP-FPM側は、Webアプリファイルにアクセス出来ないと言われます。apacheのerror_logをよく見ててくださいね~ |
| + | |
| + | |
| + | ***PHP5.6側の設定 [#p36a6e48] |
| + | /etc/php/fpm-php5.6/php-fpm.confを編集します。今回は、UNIXドメインソケットで通信出来るように設定します。以下の項を注意して設定します。 |
| + | |
| + | user = nobody # FPM版のPHPの起動ユーザ権限 |
| + | group = nobody # FPM版のPHPの起動グループ権限 |
| + | listen = /var/run/php-fpm/www5.6.sock # 通信するポートを指定。ここではwww5.6.sockというUNIXドメインソケットを指定 |
| + | listen.owner = nobody # 上記ソケットのユーザ |
| + | listen.group = nobody # 上記ソケットのグループ |
| + | listen.mode = 0660 # 上記ソケットのアクセス権 |
| + | |
| + | 7.1のときと設定の注意は変わりませんが、ポイントは、listen=で作るソケットの名称です。バージョン名で分けると。 |
| + | |
| + | **Apache側のFPM動作の設定 [#z07fdc4d] |
| + | /etc/apache2/70_mod_php.confを以下のように記載。 |
| + | |
| + | <IfDefine PHP> |
| + | <FilesMatch "\.php$"> |
| + | SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://localhost" |
| + | </FilesMatch> |
| + | |
| + | # Set it to handle the files |
| + | <IfModule mod_mime.c> |
| + | AddHandler application/x-httpd-php .php .php5 .phtml |
| + | AddHandler application/x-httpd-php-source .phps |
| + | </IfModule> |
| + | |
| + | DirectoryIndex index.php index.phtml |
| + | </IfDefine> |
| + | |
| + | 起動オプションにPHPが指定されていたら、拡張子.phpにマッチするファイルは、PHP-FPMのソケットに渡す、というエントリーです。 |
| | | |
| *プロセス起動 [#l625760f] | | *プロセス起動 [#l625760f] |
| + | |
| ApacheとPHP-FPMを再起動します。 | | ApacheとPHP-FPMを再起動します。 |
| # /etc/init.d/apache2 restart | | # /etc/init.d/apache2 restart |
| # /etc/init.d/php-fpm restart | | # /etc/init.d/php-fpm restart |
| + | # /etc/init.d/php-fpm5.6 restart |
| | | |
| *使用するPHPバージョンの宣言 [#y8d349fb] | | *使用するPHPバージョンの宣言 [#y8d349fb] |
- | ポリシーとして、以下のようにする、と先ほど書きましたね | |
- | -デフォルトはモジュール版(PHP7.1で) | |
| -古いバージョンで起動させたいWebアプリだけ、.htaccessで制御する | | -古いバージョンで起動させたいWebアプリだけ、.htaccessで制御する |
| | | |
| <IfDefine PHP> | | <IfDefine PHP> |
| <FilesMatch "\.php$"> | | <FilesMatch "\.php$"> |
- | SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://localhost" | + | SetHandler "proxy:unix:/var/run/php-fpm/www5.6.sock|fcgi://localhost" |
| </FilesMatch> | | </FilesMatch> |
| + | |
| DirectoryIndex index.php index.phtml | | DirectoryIndex index.php index.phtml |
| + | |
| </IfDefine> | | </IfDefine> |
| | | |
- | 起動オプションにPHPが指定されていたら、拡張子.phpにマッチするファイルは、PHP-FPMのソケットに渡す、というエントリーです。.htaccessは、置かれたディレクトリ配下のアクセス条件に上書きされるので、このエントリーが無い他のWebアプリは、モジュール版PHP7,1、先のエントリーがある.htaccessがあるWebアプリはPHP5.6で動く、という仕掛け。 | + | .htaccessは、置かれたディレクトリ配下のアクセス条件に上書きされるので、このエントリーがある.htaccessがあるWebアプリはwww5.6.sockで通信される。PHP5.6で動く、という仕掛け。 |
| | | |
- | さらに応用すると、PHPをもっと複数バージョン入れておき、PHP-FPMを複数バージョン起動させておいて、バージョン呼び分けする、という技も使えますよ~。ヒントは、先程のUNIXドメインソケットをバージョンごとに作り分ければ、良いわけですねぇ。 | + | もうおわかりかと思いますが。起動シェルをコピーして、ソケット名を分けていけば、いくつでもPHPが起動できると言うわけですね。 |
| | | |
| これで、PHPバージョンでアプリが動かなくなる悪夢から解放されそうです♪ | | これで、PHPバージョンでアプリが動かなくなる悪夢から解放されそうです♪ |