Back to page

− Links

 Print 

Diff of Gentoo Linuxな生活​/複数バージョンのPHP同時起動で悩む :: Nest Of Hawk

Diff of xpwiki:Gentoo Linuxな生活/複数バージョンのPHP同時起動で悩む

« Prev[3]  
2: 2018-02-12 (Mon) 21:15:30 maruo[4] source[5] Cur: 2018-02-17 (Sat) 20:49:50 maruo[4] source[6]
Line 16: Line 16:
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"
Line 42: Line 40:
ApacheのFCGI Proxyモジュールを用いて、バックエンドのPHPと通信致します。 ApacheのFCGI Proxyモジュールを用いて、バックエンドのPHPと通信致します。
- 
**Apache側 [#d3cc21d5] **Apache側 [#d3cc21d5]
Line 49: Line 46:
**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の起動ユーザ権限
Line 67: Line 78:
特に起動ユーザ、グループ、ソケットのユーザ、グループ、アクセス権は注意して設定してくださいね。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で制御する
Line 82: Line 125:
 <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バージョンでアプリが動かなくなる悪夢から解放されそうです♪
« Prev[3]