1: 2018-02-12 (月) 21:11:33 maruo ソース
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バージョンでアプリが動かなくなる悪夢から解放されそうです♪


トップ   差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 4404, today: 2, yesterday: 8
ページ内検索

ログイン

ユーザー名:


パスワード:





パスワード紛失

メインメニュー

サブメニュー
自宅鯖計画

Gentoo Linuxな生活

玄箱HGにGentoo格闘記

航空ショーへ行こう

モータースポーツな世界

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

我思う ゆえに我あり



携帯用QRコード