導入
Phusion Passenger上で動作しているRuby on Railsアプリケーションでメモリリークが発生していると思われる事象が起きていた。
公式のリファレンスにのっとり、暫定対処のためPassengerMaxRequests
を設定することにした。
OSやWEBサーバー(Apache or Nginx)によってフォルダ構成や設定ファイルが置かれている場所など諸々違いがあるので設定の方法を覚書として残すのは意味のあることだと思っている。また初心者的にはリファレンスを読むだけではPassengerMaxRequests
を設定するとサーバーがどのような動作をするのかがわからなかったので簡単ではあるが説明したいと思う。
環境
Amazon Linux 2
$ passenger-config --version
Phusion Passenger 6.0.6
$ httpd -v
Server version: Apache/2.4.59 ()
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
PassengerMaxRequests
の設定方法
/etc/httpd/conf
フォルダの配下にあるhttpd.conf
の下記の場所にPassengerMaxRequests
を追記する。100の部分は適当な1以上の整数を入力すること。0に設定した場合はアプリケーションプロセスは再起動しなくなる。
<IfModule mod_passenger.c>
PassengerRoot /home/hoge/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/passenger-6.0.6
PassengerDefaultRuby /home/hoge/.rbenv/versions/2.6.3/bin/ruby
PassengerMaxRequests 100
</IfModule>
もしhttpd.conf
に記載場所がない場合は/etc/httpd/conf.d
フォルダの配下にある設定補助ファイル(拡張子:.conf
)を漁ると見つけられるはず。
httpd.conf
を更新したらサーバーの設定を読み込みなおす。サーバーの再起動は不要なので下記コマンドを実行すればよい。
$ sudo systemctl reload httpd
動作確認
passenger-status
コマンドを利用する。passenger-status
はサーバーの設定によってはうまく動作しないことがある。passenger-status
を実行した際にERROR: Phusion Passenger doesn't seem to be running.
と表示される場合に関してはこちらの記事に対応方法を載せている。ただし環境によって解決方法は異なるので注意が必要。
アプリケーションの処理を開始したあとにpassenger-status
コマンドを実行するとApplication groups
の部分にアプリケーションプロセスが表示される。
※x
の部分には数値が入る。
----------- Application groups -----------
/var/www/home/xxx (production):
App root: /var/www/home/xxx
Requests in queue: x
* PID: xxxxx Sessions: x Processed: xx Uptime: xh xxm xxs
CPU: x% Memory : xxxM Last used: xxs ago
PassengerMaxRequests
と関係するのはProcessed
の値である。Processed
はアプリケーションプロセスが起動してから処理したリクエストの数を表している。Processed
の値がPassengerMaxRequests
の値にたどりつくとアプリケーションプロセスが再起動する。新しいプロセスが起動するとPID
が変化しProcessed
の値は0になる。同時にプロセスが占有していたメモリが解放されるためメモリリークの暫定的対処として有効である。