php-buildで複数バージョンのPHP-FPMを用意する
(2016/8/9)PHP7やHomebrewの現状に合わせるため細かい点を修正しました。
ついにPHP 5.5.0がリリースされましたね!これに関連して、php-buildを使ってPHP 5.3/5.4/5.5の3バージョンのPHP-FPM環境を用意する方法を紹介します。
この記事は「phpenv + php-build を使って 5.3 と 5.4 を共存させつつ php-fpm を使う - 肉とご飯と甘いもの @ sotarok」のアップデートのような内容になっています。ありがとうsotarok!
PHP-FPMとは
PHP-FPMはPHPのSAPI実装の一つで、単体で動作するアプリケーションサーバです。Apacheなしで動くので、気軽に扱えたりします。あまりうまく説明できないので、詳しくはPHP-FPM本家サイトあたりを見てください。
phpenv+php-buildのセットアップ
僕はphp-buildをphpenvのプラグインとして使っていますので、この環境を作りましょう。まずphpenvをインストールします。
curl -L https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | bash
上記コマンドの終了時のメッセージに従い、.bashrcまたは.zshrcの末尾に次の2行を追加してシェルを再起動します。
PATH=$HOME/.phpenv/bin:$PATH # Add phpenv to PATH for scripting eval "$(phpenv init -)"
次に、php-buildをphpenvのプラグインとしてインストールします。
mkdir $HOME/.phpenv/plugins cd $HOME/.phpenv/plugins git clone git://github.com/php-build/php-build.git
これでphpenvの機能が増え、「phpenv install [バージョン番号]」でPHPのインストールができるようになります。
詳しくは「phpenv+php-build環境の構築と運用」を参考にしてください。
php-buildでPHP-FPMをインストール
sotarok が記事を書いた頃と違い、php-buildは標準でPHP-FPMをビルドするようになりました。ですので、インストールは下記のようにタイプするだけです。
$ phpenv install 5.3.26 $ phpenv install 5.4.16 $ phpenv install 5.5.0
これで「$HOME/.phpenv/versions/[バージョン番号]/sbin/」に各バージョンのphp-fpmが作られます。
PHPの設定
この環境で使われるphp.iniは「$HOME/.phpenv/versions/[バージョン番号]/etc/php.ini」になります。毎度おなじみの下記設定を全部に追記しましょう。
date.timezone =Asia/Tokyo
PHP-FPMの設定
PHP-FPMの設定は「$HOME/.phpenv/versions/[バージョン番号]/etc/php-fpm.conf」で行います。
僕は次のように設定しました。これ以外の値はデフォルトを利用しています。
listen = 127.0.0.1:9053 listen.allowed_clients = 127.0.0.1 pm = ondemand pm.max_children = 5
ポート番号はそれぞれ5.3を9053番、5.4を9054番、5.5を9055番にしました。また、同一ホストで起動するnginxからアクセスする前提ですので、localhostからの接続のみ許可しています。
ちなみに「pm=ondemand」はPHP-FPMの面白い機能で、普段はプロセス数を絞っておいて、忙しいときだけ子プロセスを増やしてくれるものです。商用環境で有用かどうかは疑問ですが、手元で起動するときはメモリを節約したいことが多いでしょうから、便利な機能だと言えそうです。
nginxのインストール・設定
PHP-FPMはFastCGIプロトコルしか受け付けてくれないので、ブラウザから利用するにはHTTPからFastCGIに変換してくれるサーバが必要です。このような場合、最近ではnginxを選ぶのが普通かと思います。
僕はHomebrewでnginxをインストールしました。
brew install nginx
Homebrewでインストールすると、設定ファイルの位置は /usr/local/etc/nginx/nginx.conf になります。下記のように、今回のphp-fpm用のバーチャルサーバ設定を追加します。
server { listen 8080; server_name ~^php(?<phpver>\d\d).localhost$; set $port "90${phpver}"; root /Users/hnw/Sites; index index.html index.php; location ~ \.php.*$ { fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:$port; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; fastcgi_param SERVER_NAME $host; } }
ドキュメントルートの位置は適宜修正してください。また、ドキュメントルートのパーミッションは755にする必要があります。
さらに、下記ホストが127.0.0.1を指すように/etc/hostsに登録します。
これで設定完了。nginxとPHP-FPMを手で起動すれば動作確認できます。
$HOME/.phpenv/versions/5.3.26/sbin/php-fpm --nodaemonize $HOME/.phpenv/versions/5.4.16/sbin/php-fpm --nodaemonize $HOME/.phpenv/versions/5.5.0/sbin/php-fpm --nodaemonize /usr/local/opt/nginx/sbin/nginx -g "daemon off;"
毎回手動で起動するのはダルいので、次回は自動起動の設定を紹介します。