nazolabo

フリーランスのWebエンジニアが近況や思ったことを発信しています。

Laravel5をHerokuのHHVMで動かす

アプリを作る

前回の記事を参考に適当に用意する。

Herokuにpushできるようにする

heroku loginまでは省略。cedar-14Stackじゃないと動かないので注意。新規でheroku createすれば大丈夫。

composer.jsonを編集し、hhvmの定義を追加する。 あと、scriptsブロックのphphhvmに置換する。

        "require": {
                "hhvm": "~3.5",
                "laravel/framework": "5.0.*"
        },

composerをupdateする。--no-scriptsを使うとscriptsブロックが動かなくなるので、必要であればローカルでは手動で実行しよう。ローカルにHHVMが入っていればそもそも必要ない。

% composer update --ignore-platform-reqs --no-scripts

Heroku 初期設定

% heroku create
Creating [インスタンス名]... done, stack is cedar-14
https://[インスタンス名]herokuapp.com/ | https://git.heroku.com/[インスタンス名].git

% git init
Initialized empty Git repository in /path/to/app/.git/
% heroku git:remote -a [インスタンス名]
Git remote heroku added

% heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-php
Setting config vars and restarting [インスタンス名]... done, v15
BUILDPACK_URL: https://github.com/heroku/heroku-buildpack-php
% heroku config:add LD_LIBRARY_PATH=vendor/hhvm/
Setting config vars and restarting [インスタンス名]... done, v21
LD_LIBRARY_PATH: vendor/hhvm/

% git add *
The following paths are ignored by one of your .gitignore files:
vendor
Use -f if you really want to add them.
% git commit -m "initial commit"
[master (root-commit) 1232328] initial commit
 155 files changed, 19937 insertions(+)
 create mode 100644 app/Article.php
 create mode 100644 app/Commands/Command.php
 create mode 100644 app/Console/Commands/Inspire.php
 create mode 100644 app/Console/Kernel.php
….
% git push heroku master
Counting objects: 188, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (167/167), done.
Writing objects: 100% (188/188), 121.66 KiB | 0 bytes/s, done.
Total 188 (delta 10), reused 0 (delta 0)
remote: Compressing source files... done.
...
remote: Verifying deploy... done.
To https://git.heroku.com/[インスタンス名].git
 * [new branch]      master -> master

% heroku ps:scale web=1
Scaling dynos... done, now running web at 1:1X.

当たり前だが、これではDBの設定もできていないし動くわけがない。

Procfileの設定

DB以前にサーバの設定をしていない。

vim Procfile

以下の内容を入力する。nginxでは.htaccessで詰む。(もちろん設定すればどうにかできる)

web: vendor/bin/heroku-hhvm-apache2 public/
% git add Procfile
% git commit -m “add Procfile"
% git push heroku master

MySQLの設定

MySQL(ClearDB)を使う。hhvmがPostgreSQLをサポートしていない。 クレカ入力したくないけど観念して https://dashboard.heroku.com/account/billing から入力する。

% heroku addons:add cleardb:ignite
Adding cleardb:ignite on [インスタンス名]... done, v34 (free)
Use `heroku addons:docs cleardb` to view documentation.

MySQLの設定を確認する。

% heroku config
...
CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[DB名]?reconnect=true
...

これを見ながらHeroku側に環境変数をセットする。

% heroku config:set APP_ENV=production
Setting config vars and restarting [インスタンス名]... done, v6
APP_ENV: production
% heroku config:set APP_DEBUG=false
Setting config vars and restarting [インスタンス名]... done, v7
APP_DEBUG: false
% heroku config:set DB_HOST=[mysqlのホスト名]
Setting config vars and restarting [インスタンス名]... done, v8
DB_HOST: [mysqlのホスト名]
% heroku config:set DB_DATABASE=[mysqlのDB名]
Setting config vars and restarting [インスタンス名]... done, v9
DB_DATABASE: [mysqlのDB名]
% heroku config:set DB_USERNAME=[mysqlのユーザー名]
Setting config vars and restarting [インスタンス名]... done, v10
DB_USERNAME: [mysqlのユーザー名]
% heroku config:set DB_PASSWORD=[mysqlのパスワード]
Setting config vars and restarting [インスタンス名]... done, v11
DB_PASSWORD: [mysqlのパスワード]

migrationを実施する。

% heroku run "hhvm artisan migrate:install"
Running `hhvm artisan migrate:install` attached to terminal... up, run.3772
Migration table created successfully.
% heroku run "hhvm artisan migrate:refresh"
Running `hhvm artisan migrate:refresh` attached to terminal... up, run.8212
**************************************
*     Application In Production!     *
**************************************

Do you really wish to run this command? [y/N] y
**************************************
*     Application In Production!     *
**************************************

Do you really wish to run this command? [y/N] y
Nothing to rollback.
**************************************
*     Application In Production!     *
**************************************

Do you really wish to run this command? [y/N] y
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2015_02_05_120749_create_articles

ブラウザで確認して、一通り動けばOK。