こんにちは。
ラクマでサーバーサイドエンジニアをやっている zoe です。
最近はスニーカーを磨くのが趣味になっています。
今回は、rails x puma-dev x puma のサーバ環境について記載してみます
元々はローカルの、どうにも調子が悪い。
何かしらのタイミングでプロセスが全く反応しなくなったりして、再起動をかけないといけなくなるケースが多発していました。
また、全体的な動作も少しモッサリ感じていており、アップデートしてみるかーと思いましたが、更新はされておらずメンテナンスもしばらくされていない感じ・・。
代替のものを探したところ、同等以上の機能を持ち、powderからの乗り換えもサポートされているpuma-devが見つかったので今回乗り替えてみました。
そもそも puma とは?
Pumaは、Ruby / Rackアプリケーション向けのシンプルで高速なマルチスレッドの高度な並行HTTP 1.1サーバーです。
(引用元: https://github.com/puma/puma )
現在、railsデフォルトのアプリケーションサーバとなっています。
同種にカテゴライズされるものとしては、 thin webrick unicorn などでしょうか。
puma-dev とは?
・puma で起動したサーバを一元管理してくれます。
アクセスを受け付けると自動でpumaサーバを立ち上げ、一定時間アクセスがないとスリープにするなど、特にコマンドを打つことなく、常にサーバが立ち上がっているような感覚で利用することが出来ます。
・proxyサーバ的なものを立ててくれる。
この機能により、特に意識せずともブラウザから 「(ディレクトリ名).test」なとどすることで簡単に puma サーバへアクセスすることができます。
これは puma-dev -install
により作成される etc/resolver/test
経由で実現しているようです。
このproxyを介し、各pumaサーバへアクセスが自動で振り分けられます。
domainname1.test => ~/.puma-dev/domainname1.test ディレクトリ domainname2.test => ~/.puma-dev/domainname2.test ディレクトリ domainname3.test => ~/.puma-dev/domainname3.test ディレクトリ
puma-dev の個人的にいいと思うところ
・hosts設定せずに *.test でアクセスできる!
本来であれば hosts 設定などをする必要がありますが、一度初期設定すれば不要です。
・各サーバを自分でコマンド実行して起動する必要がない!
bundle exec rails s
とはサヨナラです。
・コマンドを何個か打つだけで使えるようになるので、設定が簡単!
githubに記載がありますが、「zero-config development server」 を謳っており、configファイルは不要、いくつかのコマンドだけで利用可能となります。
・powderを使っている場合、設定をそのまま引き継げる!
こちらも嬉しいポイントです。
特に多人数で開発してる際に puma / pow どちらでもOKというのは多様性が合って素敵です。
puma-devの注意点
80番ポートを使うので、apacheやnginxでポート80/443を使ってる場合はポートを変更しないと併用できません。
また、バックグラウンドプロセスとなるので、rails開発においてbyebugなどが素直に使えないです。(後述します)
どういったときに使うのがよさそうか
例えばapi用アプリ、フロントサイド用アプリが別になっているなど、複数アプリを同時に使う必要がある場合。
Railsデフォルトでは3000番ポートを起動するため、複数アプリを同時に立ち上げる場合、別のポート番号を指定して立ち上げる必要があります。
bundle exec rails s -p 3000 bundle exec rails s -p 3001 ….
このように複数アプリを同時に立ち上げる必要がある場合、
・コマンドを自分で打ち込んでサーバを複数立ち上げる必要がある
・ポート番号をかぶらないようにする必要がある
・数が増えてきた時、どのポートがどのアプリなのかわからなくなる
など、なにかと管理が面倒になってきます。
そういった問題をpuma-devは解決してくれます!
Usage
※ 全て、macOS / homebrew / railsアプリ の想定で記載しています。
1.インストール
・ homebrewをインストールしていない場合は、 https://brew.sh/index_ja よりインストールを行ってください
・brew install puma-dev
で puma-dev をインストール
・puma-dev -setup
で初期セットアップ
1-2.powder からの移行
powderから移行する場合は、
powderをアンインストールし puma-dev -pow
を実行します。
これにより、puma-dev が ~/.pow ディレクトリを見てくれるようになります。
.powenv .powrc などはデフォルトで見てくれるのでそのままでOKです。
2.puma紐付け設定
設定したいrailsアプリ内へ移動し、puma-dev link
にて設定が行なえます。
または、直接 ~/.puma-dev/ 内へアプリルートへのシンボリックリンクを貼ることも出来ます。
この時点で アプリディレクトリ名.test でブラウザから確認ができるはずです。
出来ない場合は4.のdebugで何が起きているか確認するとわかるかもしれません。
3.pumaサーバ再起動
再起動したいrailsアプリ内へ移動し、touch tmp/restart.txt
で再起動できます。
4.debug
~/Library/Logs/puma-dev.log にpuma-devのログ、pumaのログが出力されるので、調子が悪いときはここを見てください。
特にrailsアプリ内にシンタックスエラーなどのサーバー自体起動できないエラーがある場合、
ここを見ないとただただブラウザからアクセスできず、原因がわからないでハマるケースがあります。
FYI. byebug
こちらは素直に使えないと先述しましたが、
byebug Gemの remote debugging を使えば一応使うことが出来ます。
ただ、起動・接続のタイミングに一癖あるので慣れるまでは戸惑うことが多いかと思います。
可能であればbyebug等を使うときのみ puma-devを介さないでサーバ起動するのがいいかもしれません。
興味のある方はbyebug GemのGUIDEを参考にしてみてください。
https://github.com/deivid-rodriguez/byebug/blob/master/GUIDE.md#debugging-remote-programs
今の所、動作は安定しており冒頭のような問題は起きていません!
快適なローカル環境を作り上げていくのって楽しいですよね。
効率も上がるしいいことづくめです!皆様も良き puma-dev ライフを!