導入
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になる。同時にプロセスが占有していたメモリが解放されるためメモリリークの暫定的対処として有効である。