atijust's blog

技術的なこととか。

HerokuにNginx+PHP5.4+MySQLな環境を構築する

HerokuといえばRubyのためのPaaSという印象が強いのですが、ひっそりとPHPも使えます。しかし、PHPのバージョンが5.3.10と少し古いのが難点。そこで、サードパーティのbuildpackを使ってPHP5.4環境を構築してみました。buildpackというのは環境構築スクリプトのパッケージで、サードパーティのbuildpackを使えば、公式にサポートされていない環境も簡単にセットアップして使うことができます。サードパーティのものには、CやらCommon LispやらErlangやらなんでもありです。

Third-Party Buildpacks

今回は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/ | git@heroku.com: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 git@heroku.com: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:adf4234@us-cdbr-east.cleardb.com/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のアドオンも面白そう。