HerokuでSymfony2をデプロイして動かせるようにした

投稿者: | 2014/06/29

先日、関西PHP勉強会@shin1x1さんがHerokuについての発表があり、以前FacebookアプリをHerokuで使ってた(挫折した)を思い出し、興味が出てきたので使ってみることにしました。

アプリケーションサーバ(Dynosというらしい)の稼働時間が1ヶ月で750時間までなら無料で使えるので、個人の開発用なら気軽に使えそうです。
調べてみると、Getting Started with Symfony2 on Heroku というのがあり、Symfony2も簡単に使えそうだったので、試しにデプロイして使ってみることにしました。

今回の目標

  • HerokuでSymfony2のデモを動かすようにする
  • Heroku上でnginxを入れて動かすようにする
  • MySQL(ClearDB)、PaperTrail アドオンを入れてよりアプリケーションらしくしてみる

環境

  • Mac OS X 10.9.2
  • Git 1.8.5.2
  • Symfony2 (2.3.16)

前提条件

  • herokuのアカウントを登録、アドオン追加のため、クレジットカードも入力済みとする
  • Git, Heroku Toolbelt, Composer はインストール済みとする

Symfony2 バージョンについて

本当なら最新の安定版である、2.5を使いたかったのですが、デプロイ(git push)した際に、以下のエラーが発生して解決できなかったので、Long-term support版である、2.3を使いました。

もし、問題解決した方がいらっしゃいましたらコメント等で残していただけるとありがたいです!

Symfony2をインストール

Composerでインストールしました。

リポジトリ作成

Gitリポジトリを作成します。

Heroku上にアプリケーション作成

heroku-symfony2-test0515というアプリケーション名で作成しました。

タイムゾーンを変更

Herokuアプリケーション上のタイムゾーンを調べてみます。

タイムゾーンがUTCになっているのでJSTに変更します。

Procfileを作成

Symfony2をHerokuで動かすための設定をProcfileというファイルに記述します。
heroku_symfony2/web 以下をドキュメントルートになるようにし、今回はとりあえずApacheで動かすようにしました。

Symfony2のサンプル(Welcome)ページを表示するようにする

heroku_symfony2/web/app_dev.phpを編集して以下の箇所をコメントアウトします。

リポジトリに登録します。

デプロイ

git pushするだけでデプロイが完了します。

WARNINGが出ていますが、とりあえずデプロイは正常に完了しました。
デプロイ時に、パラメータファイル app/config/parameters.ymlを生成したり、キャッシュを削除してくれたり、Assetsをインストールしてくれたりと色々やってくれるので便利ですね。

heroku openでブラウザからHerokuアプリケーションを開いて、http://<Herokuアプリケーション名>.herokuapp.com/app_dev.php にアクセスすれば、Symfony2のWelcomeページが表示されるはずです。

ログを確認できるようにする

これで、最低限アプリケーションを動かせるようになりましたので、さらに改良していきます。
次はログを見れるようにしてみます。

Herokuの場合、ログ出力を標準出力(STDOUT)か、標準エラー出力(STDERR)にすれば良いので、app/config/config_prod.yml を以下のように編集します。

リポジトリに登録してデプロイします。

以下のコマンドでログをリアルタイムで見ることができるようになりました。

Papertrailアドオンでもっと便利にログを見る

このままでもログを見ることはできますが、複数台Heroku(Dynos)を動かすとログがそれぞれの溜まってしまい、ログを見るのが面倒です。
また、デプロイする度にログファイルが消えてしまうため、Papertrailアドオンを入れて、便利にログ監視できるようにします。

chokladはFree版を指定しています。

https://papertrailapp.com/systems/<Herokuアプリケーション名>/events に行くと、ログを見ることができます。
ログのタイムゾーンがUTCのままなので、右上の[Me]→[Profile]のリンク先からログのタイムゾーンを変更することができます。

Dynosを停止(0台にする)してもログは残るので後で確認することができますし、ログのフィルタリングや検索もできるので大変便利です。
ただし、Free版は10MBまでしか保存できない等の制限あるので、不便に感じたなら有料プランに変更するのもいいでしょう。

Symfony2でHeroku用の新しい環境を作成

Symfony2には、proddevtestという環境が予め用意されており、それぞれ本番用、開発用、テスト(PHPUnit実行)用となっています。
そこで、Heroku上で動かすための環境(heroku)を追加します。

新しい環境を作成して、使いこなす方法 | Symfony2日本語ドキュメント を参考にしました。

設定ファイルの追加

今回は開発用にしたいので、app/config_heroku.ymlapp/config_dev.yml からコピーして作成します。
もし、本番用の環境にしたい場合は、app/config/config.ymlからコピーしてください。
heroku環境用に一部編集していることに注意してください。

app/config/routing_heroku.ymlapp/config/routing_dev.yml からコピーして作成します。

web/app_heroku.phpweb/app_dev.php からコピーして作成します。
一部編集していることに注意してください。

app/AppKernel.php で heroku環境を追加します。

Webサーバをnginxに変更

Herokuではnginxも使えるので、Apacheからnginxに変更してみます。
Procfileを編集します。

heroku_nginx.confは後で追加するnginxの設定ファイルです。末尾のwebはドキュメントルートを指定しています。

nginxの設定ファイルを追加

heroku_nginx.confheroku_symfony2直下(リポジトリ直下)に作成します。
セキュリティも考慮して、app_heroku.php以外にアクセスできないようにしています。

composer.json を編集

composer.jsonのbin-dirを以下の通りに編集しないとデプロイ時に失敗してしまいます。
参考URL: HerokuがPHPに正式対応したのでFuelPHP動かしてみた

デプロイ

デプロイすると、Symfony2のWelcomeページが表示されます。
画面下のプロファイラから環境がherokuになっていることが確認できます。

symfony2_environment

データベース(MySQL)接続を設定

HerokuのClearDBアドオンを入れて、Symfony2でデータベース接続できるようにしてみます。

ClearDBアドオンをインストール

無料プランもありますが、予めクレジットカードを登録しないと使えません。

igniteはFreeプランです。

設定を確認します。

CLEARDB_DATABASE_URL: mysql://ユーザ名:パスワード@サーバ名/データベース?reconnect=true となっています。

Symfony2側の設定をしていきますが、例としてユーザ(user)テーブルを作成して、そのCURD画面を作成します。

Heroku上のMySQLデータベースにテーブルを作成

create_table.sqlを作成しします。

以下のコマンドで作成したSQLを流し込めばテーブルが作成されます。

データベース接続情報を設定ファイルに記述

app/config/parameters_heroku.yml

app/config/config_heroku.ymlparameters_heroku.ymlを読み込むようにします。

エンティティクラスを作成

データベースをリバースエンジニアリングしてエンティティクラスを作ります。

メタデータをYAML形式でエクスポート

エクスポートしたメタデータからエンティティクラスを生成

src/Acme/DemoBundle/EntityにUser.phpが作成されます。

エンティティクラスにゲッター/セッターを追加

CRUDを作成する

コマンド一発でUserエンティティに基づいたCRUDが作成できます。

すべてエンターキーを押していくと、src/Acme/DemoBundle/Contoller/UserContoller.phpなどが作成されます。

ルーティング追加

作成したCRUDにアクセスできるようにルーティングを追加します。

src/Acme/DemoBundle/Resources/config/routing.yml

デプロイ

確認

ページを開き、 http://<Herokuアプリケーション名>.herokuapp.com/user にアクセスするとuserテーブル内のデータ一覧が表示されます。
※まだデータが一件も入っていないので、「Create a new entry」からデータを追加してください。

user_list

セッションをmemcachedに保存する

セッション情報をmemcachedに保存しようとしたのですが、Symfony2の設定が上手く行かず、設定できませんでした。
設定したことがある方は、教えていただけるとありがたいです!

最後に

HerokuでSymfony2を使えるようにしてみました。
設定等に時間がかかりましたが、慣れてしまえばあっという間に使えてしまうので、個人的開発にはとても向いていると思います。
便利なアドオンなどがありましたら使ってみて、皆さんにシェアしたいと思います。

HerokuでSymfony2をデプロイして動かせるようにした」への1件のフィードバック

  1. Oliver Russell

    インフラストラクチャにsymfonyをデプロイする場合は、代わりにCloudways Symfonyホスティングプラットフォームを使用することをお勧めします。 このプラットフォームを使用すると、瞬時にクラウドサーバを起動し、symfonyアプリケーションをgitまたはsftp経由でデプロイできます。 https://www.cloudways.com/en/symfony-hosting.php

    返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください