1: 2018-02-12 (Mon) 21:11:33 maruo source
Line 1: Line 1:
 +*違うバージョンのPHPを動かしたい! [#gbb6f519]
 +Webアプリを運用していると、開発が活発なアプリ、あまり更新されないアプリで、動作要件が変わってきたりします。特に大きいのは、Webアプリを動作させる肝となる、シェル言語のバージョン。で、軽量なWebアプリでメジャーな言語はPHP。このPHPって曲者で。バージョンアップでかなり言語仕様が変わります。なもので…最近PHP5じゃないと動かないアプリと、PHP5のサポートを終了させようとしているアプリが入り乱れてきました。なもので、古いアプリはPHP5、新しいアプリはPHP7で動かす環境を作らないといけなくなってまいりました。でも、Webサーバ(Apacheやnginx等)を複数動かすのはとてもうれしくない。なので、Apache一つで、Webアプリによって動作させるPHPを分けて見るようにします。
 +では、行ってみましょう
 +
 +*どうやって複数バージョンのPHPを共有させるか [#z9e52729]
 +ApacheでPHPで記述されたWebアプリを駆動するには、以下の手順が使えます。
 ++モジュール
 ++CGI
 ++FastCGI
 +
 +モジュールの場合は、mod_phpを用いて、Apacheのプロセス内でPHPの処理を実行します。
 +
 +CGIは、Apacheから、HTTPリクエストがあるたびにPHPのプロセスを起動して、PHPスクリプトを実行します。
 +
 +FastCGIは、PHPのプロセスを予め起動させておき、ApacheにHTTPリクエストが来るたびに、TCPもしくはUnix Dmain Socket経由で常駐PHPプロセスに処理をさせます。
 +
 +この中で、GCI方式が最も重そうな方法であることはご理解いただけるかと。mod_phpが最もシンプルな方法なのですが、1つのバージョンしか使えない。なので、主となるバージョンはmod_phpで、旧型バージョンはFastCGIで駆動させる方法を採用することとします。
 +
 +このわけかたとして、デフォルトは何も指定せずモジュール版で駆動させ、旧版PHPで動かしたいアプリだけ、.htaccessに設定を記載してやることで旧版で動作させることを実施します。
 +
 +*準備 [#qde4619d]
 +**PHPのビルド [#cc5b2304]
 +-PHPのUSEフラグに"apache2 fastcgi"の2つを追加します。
 +-make.confに以下の記述を追加します。
 + PHP_TARGETS="php5-6 php7-1"
 +
 +ここのPHP_TARGETSは、インストールしておきたいバージョンのPHPを列挙します。私はPHP5系の最新(php5-6)と、PHP7系の最新(php7-1)を書いておきます。
 +
 +-emergeします。
 +
 +おしまい。
 +
 +**Apacheのビルド [#d89bb78e]
 +-make.confのAPACHE2_MODULESに、"proxy proxy_fcgi"を追記します。
 +-emergeします。
 +
 +おしまい。
 +
 +*動作設定 [#k7d52dc6]
 +モジュールによる起動は既にできていることとします。このため、FastCGIにて起動する方法を中心に記載します。
 +
 +ApacheのFCGI Proxyモジュールを用いて、バックエンドのPHPと通信致します。
 +
 +
 +**Apache側 [#d3cc21d5]
 +/etc/conf.d/apache2内のAPACHE2_OPTSに、以下の定義を追記します
 + -D PHP -D PROXY
 +
 +**PHP側 [#x573b2c4]
 +今回は、以下の設定とします。
 +-モジュール版はPHP7.1
 +-FastCGI側はPHP5.6
 +
 +で、それぞれ起動するバージョンを設定してやります。
 + # eselect php set apache2 php7.1
 + # eselect php set fpm php5.6
 +
 +次に、/etc/php/fpm-php5.6/php-fpm.confを編集します。今回は、UNIXドメインソケットで通信出来るように設定します。以下の項を注意して設定します。
 +
 + user = nobody                        # FPM版のPHPの起動ユーザ権限
 + group = nobody                      # FPM版のPHPの起動グループ権限
 + listen = /var/run/php-fpm/www.sock  # 通信するポートを指定。ここではwww.sockというUNIXドメインソケットを指定
 + listen.owner = nobody                # 上記ソケットのユーザ
 + listen.group = nobody                # 上記ソケットのグループ
 + listen.mode = 0660                  # 上記ソケットのアクセス権
 +
 +特に起動ユーザ、グループ、ソケットのユーザ、グループ、アクセス権は注意して設定してくださいね。Apacheの起動ユーザ権限とソケットのアクセス権が合っていないと、「Permission Denied」と言われます。また、PHP-FPMの起動ユーザ、グループがWebアプリ側のアクセス権と合っていないと、PHP-FPM側は、Webアプリファイルにアクセス出来ないと言われます。apacheのerror_logをよく見ててくださいね~
 +
 +*プロセス起動 [#l625760f]
 +ApacheとPHP-FPMを再起動します。
 + # /etc/init.d/apache2 restart
 + # /etc/init.d/php-fpm restart
 +
 +*使用するPHPバージョンの宣言 [#y8d349fb]
 +ポリシーとして、以下のようにする、と先ほど書きましたね
 +-デフォルトはモジュール版(PHP7.1で)
 +-古いバージョンで起動させたいWebアプリだけ、.htaccessで制御する
 +
 +と、言うことで、各Webアプリは、ディレクトリで別れて格納されいると仮定します。PHP5.6で動かしたいWebアプリが格納されているディレクトリのトップに、.htaccessを置き、以下の内容を追記します。
 +
 + <IfDefine PHP>
 +   <FilesMatch "\.php$">
 +       SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://localhost"
 +   </FilesMatch>
 +
 +   DirectoryIndex index.php index.phtml
 +
 + </IfDefine>
 +
 +起動オプションにPHPが指定されていたら、拡張子.phpにマッチするファイルは、PHP-FPMのソケットに渡す、というエントリーです。.htaccessは、置かれたディレクトリ配下のアクセス条件に上書きされるので、このエントリーが無い他のWebアプリは、モジュール版PHP7,1、先のエントリーがある.htaccessがあるWebアプリはPHP5.6で動く、という仕掛け。
 +
 +さらに応用すると、PHP5.6を複数バージョン入れておき、PHP-FPMを複数起動させておいて、バージョン呼び分けする、という技も使えますよ~。ヒントは、先程のUNIXドメインソケットをバージョンごとに作り分ければ、良いわけですねぇ。
 +
 +これで、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: 1597, today: 2, yesterday: 2
ページ内検索

ログイン

ユーザー名:


パスワード:





パスワード紛失

メインメニュー

サブメニュー
自宅鯖計画

Gentoo Linuxな生活

玄箱HGにGentoo格闘記

航空ショーへ行こう

モータースポーツな世界

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

我思う ゆえに我あり



携帯用QRコード