HerokuにNginx+PHP5.4+MySQLな環境を構築する
HerokuといえばRubyのためのPaaSという印象が強いのですが、ひっそりとPHPも使えます。しかし、PHPのバージョンが5.3.10と少し古いのが難点。そこで、サードパーティのbuildpackを使ってPHP5.4環境を構築してみました。buildpackというのは環境構築スクリプトのパッケージで、サードパーティのbuildpackを使えば、公式にサポートされていない環境も簡単にセットアップして使うことができます。サードパーティのものには、CやらCommon LispやらErlangやらなんでもありです。
今回はHeroku上に最新のPHP5.4 + Nginx環境を30秒で構築するで紹介されているiphoting / heroku-buildpack-php-tylerを使いたいと思います。
特徴としては
- Nginx+PHP-FPM
- PHP5.4(apc, memcache, memcached, mysql, pgsql, phpredis, mcrypt, newrelic, sqlite)
- Composerによる依存性管理
Nginx+PHP-FPMな構成で、Apacheがわからない(っていうか、Nginxでいいじゃん的な)ゆとりエンジニアの自分にも設定いじれそうなのがいいですね。Composerで環境構築時に自動的にパッケージをインストールしてくるのも有難い。phpinfoはこんな感じ。
セットアップ
取り敢えず、動作確認用のindex.phpを作成しgitのリポジトリを作成します。
$ mkdir heroku-test $ cd heroku-test $ vi index.php <?php echo 'Hello, Heroku!'; $ git init $ git add . $ git commit -m '最初の登録'
Herokuコマンドにbuildpackを指定してアプリを作成します。
$ heroku create -s cedar -b git://github.com/iphoting/heroku-buildpack-php-tyler.git Creating radiant-badlands-4098... done, stack is cedar BUILDPACK_URL=git://github.com/iphoting/heroku-buildpack-php-tyler.git http://radiant-badlands-4098.herokuapp.com/ | [email protected]:radiant-badlands-4098.git Git remote heroku added
あとはpushするだけ。環境構築に数十秒かかります。
$ git push heroku master Counting objects: 3, done. Writing objects: 100% (3/3), 261 bytes, done. Total 3 (delta 0), reused 0 (delta 0) -----> Fetching custom git buildpack... done -----> PHP app detected -----> Fetching Manifest https://s3.amazonaws.com/heroku-buildpack-php-tyler/manifest.md5sum -----> Installing Nginx Bundling Nginx v1.2.7 https://s3.amazonaws.com/heroku-buildpack-php-tyler/nginx-1.2.7-heroku.tar.gz -----> Installing libmcrypt Bundling libmcrypt v2.5.8 https://s3.amazonaws.com/heroku-buildpack-php-tyler/libmcrypt-2.5.8.tar.gz -----> Installing libmemcached Bundling libmemcached v1.0.7 https://s3.amazonaws.com/heroku-buildpack-php-tyler/libmemcached-1.0.7.tar.gz -----> Installing PHP Bundling PHP v5.4.11 https://s3.amazonaws.com/heroku-buildpack-php-tyler/php-5.4.11-with-fpm-heroku.tar.gz -----> Installing newrelic Bundling newrelic daemon v2.9.5.78 https://s3.amazonaws.com/heroku-buildpack-php-tyler/newrelic-2.9.5.78-heroku.tar.gz -----> Copying config files -----> Installing boot script -----> Done with compile -----> Discovering process types Procfile declares types -> (none) Default types for PHP -> web -----> Compiled slug size: 35.8MB -----> Launching... done, v5 http://radiant-badlands-4098.herokuapp.com deployed to Heroku To [email protected]:radiant-badlands-4098.git * [new branch] master -> master
もうこれで動きます。簡単すぎ!
$ heroku open
アドオンでMySQLを使えるようにする
HerokuといえばPostgreSQLですが、サードパーティのMySQLアドオンがいくつかあるようです。
MySQLでアドオンを検索したところこの3つが出てきました。特に決め手はないのですが、取り敢えずClear DB MySQL Databaseを使ってみたいと思います。無料のigniteプランを使用します。
インストールはこれだけ。
$ heroku addons:add cleardb:ignite Adding cleardb:ignite on radiant-badlands-4098... done, v8 (free) Use `heroku addons:docs cleardb:ignite` to view documentation.
heroku config
で接続情報が見れます。
$ heroku config | grep CLEARDB_DATABASE_URL CLEARDB_DATABASE_URL => mysql://adffdadf2341:[email protected]/heroku_db?reconnect=true ※接続情報は公式ドキュメントのサンプルより
mysqlコマンドで接続可能。
$ mysql --host=us-cdbr-east.cleardb.com --user=adffdadf2341 --password=adf4234 heroku_db
PHPからつなぐ場合は、環境変数から接続情報を取得してパースします。公式ドキュメントのUsing ClearDB with PHPを参照。接続情報をハードコーディングすることも出来るのですが、ソース公開するとき困るので、環境変数使う感じで。
$cleardb = parse_url(getenv('CLEARDB_DATABASE_URL'));
$conn = new PDO(
sprintf("mysql:dbname=%s;host=%s", substr($cleardb['path'], 1), $cleardb['host']),
$cleardb['user'],
$cleardb['pass']
);
以上、HerokuでNginx+PHP5.4+MySQLな環境を構築してみました。いくつかコマンドを実行するだけでサクサクと環境が構築できてしまうのはスゴイです。VPSを借りて自分で管理するのも面白いのですが、ちょっとしたものを公開するときにお手軽な選択肢があるのはいいですね。
次はSymfony2でも入れてみようかな。Treasure Dataのアドオンも面白そう。