BEAR.Sunday Advent Calendar 2014 の4日目の記事です。

herokuを使ってBEAR.Sunday 製のjson APIを公開してみたので、その際の設定メモです。

開発

まず、BEAR.Sundayでアプリケーションを作ります。 ビルトインサーバーで充分にデバッグしましょう。

$ vendor/bin/bear.server .

herokuにデプロイ

アカウント作成

まず、herokuのアカウントを作ります。 http://heroku.com

toolbeltのインストール

PCに heroku toolbelt をインストールします。toolbeltはMac,Windows両方が用意されています。

ログイン

$ heroku login

対話シェルでメールアドレスとパスワードを聞かれるので、アカウントを作った時のメールアドレスとパスワードでログインします。 まだSSH鍵をherokuに登録していない場合はここで登録もできます。

herokuアプリケーションを作る

herokuのアプリケーションを作ります。BEAR.Sundayで作ったアプリケーションのディレクトリに入り、コマンドを実行するだけです。

$ heroku create japanese-holiday

(japanese-holidayの部分は自分の好きな名前を入れてください。) 独自ドメインを割り当てない限り、公開URLが japanese-holiday.herokuapp.com になるので、ドメインとして公開できる名前をつけましょう。

ソースをherokuにpush

herokuにpushします。 heroku create した時点で heroku という名前でリモートレポジトリが追加されているので、そこにpushするだけです。

$ git push heroku master

BEAR.Sundayアプリの公開用の設定

ソースをpushした完了メッセージの中でherokuから「アプリが公開されたぜ!」という感じの表示が出ますが、この時点でブラウザから http://japanese-holiday.herokuapp.com にアクセスしてみてもForbidden表示が出ます。 それもそのはず、BEAR.Sundayでは(Symfony等他のフレームワークでも同じですが)、ソースコードのルートディレクトリ=ドキュメントルートではないからです。 アプリケーション公開用の設定をする必要があります。

Procfile(ドキュメントルートの設定)

ソースコードのルートディレクトリに Procfile という空っぽのテキストファイルを置きます。 BEAR.Skeletonを使った場合、ドキュメントルートは var/www になるので、Procfileにそのまま指定します。

web: vendor/bin/heroku-php-apache2 var/www/

ここで指定したドキュメントルートは AllowOverride All に設定され、 .htaccess がそのまま使えます。 https://devcenter.heroku.com/articles/custom-php-settings#using-htaccess

フロントコントローラーの修正

機能テストやビルトインサーバーでは問題なく動いたものが、herokuにデプロイすると動かなかった箇所を修正します。

  • var/www/index.phpbootstrap/contexts/prod.php へのシンボリックリンクになっていますが、アクセスできないというエラーが出たので、シンボリックリンクをやめてファイルをコピーしました。
  • var/www/index.php の中段で $app->router->match() という行があるのですが、どうしても返り値が正しいパスになりません。ローカルでソースコードを追ったり、herokuのログを見たりした結果、herokuでは(もしかして、普通のサーバーでも発生するかも?) $GLOBALS['_SERVER'] がセットされていないことがわかり、ルーターの行の直前に手動セットする行を追加しました。($GLOBALS['_SERVER'] = $_SERVER;)

まとめ

サーバーを借りたり、環境構築したりする手間もなく、簡単な設定でAPIを公開できました! http://japanese-holiday.herokuapp.com

参考URL