はじめに
こんにちは。近頃railsを触っていますが、webサーバさえ起動すればリクエストを受け付けてくれるPHPと違い、railsはrackサーバの起動が必要になりますね。
そこで今回はCentOS7でsystemdに自作のスクリプトを登録してサービスとして操作し、サーバ起動時にpumaが自動で起動するところまで設定してみます。
chkconfigについてざっくり
サーバサイドに詳しくない方向けに。ご存知の方は読み飛ばしてOKです。
- chkconfigは、サービスの自動起動を管理するコマンドです。CentOS6まで使われていました。
- 端末としてみなさんが使っているmacやwindowsでは、マシンの起動時に様々なサービスが立ち上がっています。
サーバでもそれは同様で、例えばNginxやMySQLがインストールされています。それらの起動を管理するのがchkconfigです。 - CentOS7でもchkconfigコマンドは実行できますが、systemctl(systemd)へのリダイレクトになっているので、今後はRedhat系を使うのであればsystemdになります(AmazonLinux2でもsystemdですし)。
- 参考
chkconfigまとめ
chkconfig – サービスの自動起動の設定 / CentOS
CentOS7系と6系のコマンドの違いについて
chkconfigって結局なんなんだ
前提
- CentOS7.5
- rbenv, ruby-build, rails, bundlerインストール済み
- ユーザー名「testuser」のホームディレクトリ配下にrails new済みで、
rails s
すれば問題なくpumaが起動する
起動スクリプトを作成する
puma起動のコマンドをシェルスクリプトで作成します。
場所はどこでもよいですが、testuserがアクセスおよび実行できるパスにします。
1 2 3 4 5 6 7 8 9 10 | $cd~ $vi puma.sh #!/bin/bash # 「testapp」はrails newで指定したアプリ名です。 cd/home/testuser/testapp bundle exec pumactl start # シェルの実行権限設定 $chmod755~/puma.sh |
Unitを定義する
/etc/systemd/system/
以下に定義ファイルを作成します。これでsystemdでの操作が可能になります。
他にももっと細かく記述できますが、以下は起動のための最低限の内容です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $vi/etc/systemd/system/puma.service [Unit] # サービスの説明文です。内容は自由です。 Description=puma asservice [Service] # スクリプト実行時のユーザを指定します。 User=testuser # スクリプト実行時の環境変数を記述したファイルのパスです。次項で説明します。 EnvironmentFile=/etc/systemd/env # systemctl start [サービス名] を実行すると、ここに設定されたスクリプトをsystemdが実行します。 ExecStart=/home/testuser/puma.sh # サービスが停止した際の動作を指定します。alwaysで常に再起動を実施します。 Restart=always # 起動完了の判定方法です。simpleでコマンド実行時に起動完了と判断します。 Type=simple [Install] WantedBy=multi-user.target |
EnvironmentFileを作成する
systemdは環境変数を一切読み込まないため、スクリプト実行時に読み込まれてほしい環境変数はEnvironmentFile
に記述します。以下記載例です。
なおこのファイル内では変数を評価しないので、値は全てべた書きになります。Userに指定するユーザでログインして、printenv | more
等であらかじめ環境変数の値を確認しておきましょう。
1 2 3 | $vi/etc/systemd/env PATH=/home/testuser/.rbenv/shims:/home/testuser/.rbenv/plugins/ruby-build/bin:/home/testuser/.rbenv/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/testuser/.local/bin:/home/testuser/bin |
確認と設定
systemdで管理できるようになっているか
systemctl list-unit-files --type=service | grep puma
でpuma.service
が表示されていればOKです。
自動起動を有効化する
systemctl enable puma
実行後、メッセージは特に表示されません。
手動で起動してみる
systemctl start puma
を実行し、ブラウザでアクセスします。
失敗時はsystemctl status puma
で最後数行分のログが確認できますが、もっと表示したい場合はjournalctl -b | less
で、サーバ起動後のログが一覧できます。
成功していれば、下記のようなステータスになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $systemctl status puma ●puma.service-puma asservice Loaded:loaded(/etc/systemd/system/puma.service;enabled;vendor preset:disabled) Active:active(running)since Sun2018-07-2207:38:55UTC;41minago Main PID:11831(puma.sh) CGroup:/system.slice/puma.service ├─11831/bin/bash/home/testuser/puma.sh └─11832puma3.11.4(tcp://0.0.0.0:3000) [testapp] Jul2207:38:55localhost.localdomain systemd[1]:puma.service holdoff time over,scheduling restart. Jul2207:38:55localhost.localdomain systemd[1]:Started puma asservice. Jul2207:38:55localhost.localdomain systemd[1]:Starting puma asservice... Jul2207:38:55localhost.localdomain puma.sh[11831]:Puma starting insingle mode... Jul2207:38:55localhost.localdomain puma.sh[11831]:*Version3.11.4(ruby2.4.4-p296),codename:Love Song Jul2207:38:55localhost.localdomain puma.sh[11831]:*Min threads:5,max threads:5 Jul2207:38:55localhost.localdomain puma.sh[11831]:*Environment:development Jul2207:38:56localhost.localdomain puma.sh[11831]:*Listening on tcp://0.0.0.0:3000 Jul2207:38:56localhost.localdomain puma.sh[11831]:UseCtrl-Ctostop |
自動起動確認
shutdown -r
等でサーバを再起動後、再度ブラウザでアクセスします。失敗している時は上述したsystemctl status
やjournalctl
でログを確認しましょう。
さいごに
いかがでしたでしょうか。今回は自動起動の設定を紹介しましたが、.serviceファイルにはもっと様々な設定項目があり、細かい制御が可能です。
例えば[Unit]セクションではサービス起動の順番や他サービスとの依存関係など、[Service]セクションではsystemctl stop
やsystemctl reload
の設定ができます。
長らくCentOS5/6を使っていたせいで、ついついservice httpd start
などとタイプしてしまうのですが、こうして実際に使いつつ整理することで、少しずつ手に馴染んできました。