rails を systemdから実行する

先日、gollum を systemd から実行することを試みました。
gollum をつかってみたい

今回は rails を systemd から実行してみます。

目次

動作環境

  • CentOS7.7 (VirtualBox で用意)
  • Rails 5.2.4.2

アプリケーションと nginx の設定はrails と nginx を unix ドメインソケットで連携させるを参照。

サービス設定

/etc/systemd/system/rails.serviceを以下のように作成しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=RailsApp
After=network.target

[Service]
Type=simple
Environment="PATH=/root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
WorkingDirectory=/root/testapp
ExecStart=/root/.rbenv/versions/2.4.9/bin/bundle exec /root/testapp/bin/rails s
Restart=always

[Install]
WantedBy=default.target

設定についていくつか解説します。

Environment

Environment="PATH=/root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"を設定します。

rbenv を使っていることもあり、rbenv のパスを環境変数としても持っている必要がありました。
envコマンドを実行し、表示されたPATH=~~~~の部分を貼り付けています。

環境変数を渡すには、EnvironmentEnvironmentFileを使えますが、今回は、PATHだけなのでEnvironmentを採用しました。
ほかにも渡すものが増えれば、Environmentを複数書くことはできますがEnvironmentFileを採用すべきなのでしょう。

WorkingDirectory

WorkingDirectory=/root/testappを設定しています。

今回の Rails アプリケーションは/root/testappに展開されています。
ですので、WorkingDirectory/root/testappに設定しました。

ExecStart

ExecStart=/root/.rbenv/versions/2.4.9/bin/bundle exec /root/testapp/bin/rails sを設定しています。
環境数とWorkingDirectory/root/testappに設定しましたが、bundle exec rails sと記述することはできませんでした。
bundlerailsは、絶対パスで設定する必要がありました。

Restart

Restart=alwaysを設定しています。
立ち上げたサービスを正規の手段で(systemd stop ~~)停止されない限り常に再起動させます。

確認

systemctl start railsで起動します。
ステータスを確認してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#systemctl status rails
● rails.service - RailsApp
Loaded: loaded (/etc/systemd/system/rails.service; disabled; vendor preset: disabled)
Active: active (running) since 水 2020-04-29 18:58:54 JST; 2min 52s ago
Main PID: 6451 (bundle)
CGroup: /system.slice/rails.service
mq6451 puma 4.3.3 (unix:///root/testapp/tmp/sockets/puma.sock) [testapp]

4月 29 18:58:56 localhost.localdomain bundle[6451]: (0.2ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mo...47483
4月 29 18:58:56 localhost.localdomain bundle[6451]: ? vender/bundle/ruby/2.4.0/gems/activerecord-5.2.4.2/lib/active_record…r.rb:98
4月 29 18:58:56 localhost.localdomain bundle[6451]: (0.2ms) SELECT `schema_migrations`.`version` FROM `schema_migrations...` ASC
4月 29 18:58:56 localhost.localdomain bundle[6451]: ? vender/bundle/ruby/2.4.0/gems/activerecord-5.2.4.2/lib/active_record…r.rb:98
4月 29 18:58:56 localhost.localdomain bundle[6451]: Processing by ToolsController#index as HTML
4月 29 18:58:56 localhost.localdomain bundle[6451]: Rendering tools/index.html.erb within layouts/application
4月 29 18:58:56 localhost.localdomain bundle[6451]: Tool Load (0.6ms) SELECT `tools`.* FROM `tools`
4月 29 18:58:56 localhost.localdomain bundle[6451]: ? app/views/tools/index.html.erb:14
4月 29 18:58:56 localhost.localdomain bundle[6451]: Rendered tools/index.html.erb within layouts/application (8.7ms)
4月 29 18:58:57 localhost.localdomain bundle[6451]: Completed 200 OK in 241ms (Views: 229.0ms | ActiveRecord: 2.2ms)
Hint: Some lines were ellipsized, use -l to show in full.

どうやら起動できていそうです。

今度は、自動再起動を確認します。

1
2
3
4
5
6
7
8
9
10
11
12
# 起動しているプロセスを確認
ps aux|grep testapp
>root 6451 0.3 0.3 883964 103632 ? Ssl 18:58 0:01 puma 4.3.3 (unix:///root/testapp/tmp/sockets/puma.sock) [testapp]
>root 6512 0.0 0.0 112728 968 pts/2 R+ 19:04 0:00 grep --color=auto testapp

# 起動しているtestappのプロセス6451番をkillする
kill 6451

# 再度、起動しているプロセスを確認
ps aux|grep testapp
>root 6513 44.0 0.1 877372 61824 ? Ssl 19:04 0:00 puma 4.3.3 (unix:///root/testapp/tmp/sockets/puma.sock) [testapp]
>root 6534 0.0 0.0 112728 968 pts/2 R+ 19:04 0:00 grep --color=auto testapp

kill 前後で、プロセスの番号が変わっています。
プロセスが再起動できています。


今回は、systemd で rails を起動し、サービスの自動再起動を設定しました。
こちらの設定を見つけるまで、はまって 3-4 時間ぐらいかけてしまったので、もっと速度を上げたいところです。

ではでは。