herokuでMojolicious::Liteのアプリを動かす
Mojolicious::Liteのアプリをherokuでデプロイしたときのメモ
必要な知識・キーワード
前提
Mojolicious::Liteのバージョンは6.11で、今回のアプリはWebSocketを利用するのでノンブロッキングサーバーでの稼働が必要だった
heroku
herokuのアカウント作成や利用の仕方については詳細な記事がネットにたくさんあるので省略。開発環境のMacにtoolbeltをインストールしてgitでpushすればherokuにデプロイできるようにした。
herokuにPerlをデプロイする準備
Perlは正式サポートではないらしく、サードパーティが用意しているPerl用のbuildpackを適用する
Buildpack | Heroku Dev Center
Perl/PSGIのために用意されたbuildpackはgithubでいくつか公開されており、今回適用したのは以下
pnu/heroku-buildpack-perl
これは、Mojoliciousのバージョン6はPerl5.10.1以上を推奨なので、上記のbuildpackがPerl5.10.1以上に対応していたため
buildpack適用のコマンドは以下の通り
heroku login 〜メールアドレスとパスワードの入力〜 heroku create --buildpack https://github.com/pnu/heroku-buildpack-perl.git
Websocketのプロトコルについて
herokuは"https://"で稼働しており、websocketは"wss://"となる。なので、プログラム内でurlを出力する箇所ではプロトコルを指定する必要がある。(当然デフォルトでは"http://"になる)
<%= url_for('パス')->to_abs->scheme('wss') %>
サーバーについて
Mojoliciousを動かすサーバーはいくつか選択肢がある。starmanはブロッキングサーバーなので、今回のようにWebSocketを利用するアプリでは要件を満たさない。なのでMojoliciousに同梱されているノンブロッキングサーバーhypnotoadを利用する。
実際にやったこと
HerokuでMojolicious(PSGI)アプリを動かすには以下のファイルを用意する。なおmyapp.plというアプリを動かす前提で記述してある。
- cpanfile
- app.psgi
- Procfile
cpanfileにはアプリが使用するモジュールを列挙する
requires "Mojolicious", "> 6.10"; requires 'inc::Module::Install'; requires "Mojolicious::Plugin::AssetPack"; requires "Mojolicious::Plugin::Mail"; requires "DBD::Pg"; requires "Teng", "== 0.28"; 〜〜〜〜
app.psgiは0バイトのファイル。(存在していればそれで良い)
Procfileの内容は以下。herokuにhypnotoadを稼働するよう指示
web: hypnotoad -f myapp.pl
hypnotoadで動かすためにアプリのソースに設定を記述する必要がある。myapp.plの冒頭あたりに以下を記述
app->config( hypnotoad => { listen => ['http://*:' . ($ENV{PORT} || 8080)] }, );
以上で開発環境からherokuにログインしてgitでpushすれば自動的にデプロイしてアプリが稼働する