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すれば自動的にデプロイしてアプリが稼働する

参考サイト

Mojolicious::Liteで作ったアプリをHerokuで動かす