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.php
はbootstrap/contexts/prod.php
へのシンボリックリンクになっていますが、アクセスできないというエラーが出たので、シンボリックリンクをやめてファイルをコピーしました。var/www/index.php
の中段で$app->router->match()
という行があるのですが、どうしても返り値が正しいパスになりません。ローカルでソースコードを追ったり、herokuのログを見たりした結果、herokuでは(もしかして、普通のサーバーでも発生するかも?)$GLOBALS['_SERVER']
がセットされていないことがわかり、ルーターの行の直前に手動セットする行を追加しました。($GLOBALS['_SERVER'] = $_SERVER;
)
まとめ
サーバーを借りたり、環境構築したりする手間もなく、簡単な設定でAPIを公開できました! http://japanese-holiday.herokuapp.com