2: 2018-02-12 (Mon) 21:15:30 maruo source Cur: 2018-02-17 (Sat) 20:49:50 maruo source
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バージョンでアプリが動かなくなる悪夢から解放されそうです♪


Front page   Diff Backup Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 3512, today: 5, yesterday: 4
ページ内検索

ログイン

ユーザー名:


パスワード:





パスワード紛失

メインメニュー

サブメニュー
自宅鯖計画

Gentoo Linuxな生活

玄箱HGにGentoo格闘記

航空ショーへ行こう

モータースポーツな世界

奥深き写真の世界への誘い

我思う ゆえに我あり



携帯用QRコード