はじめに
unicornとnginxの連携、init.dではなく、systemdで自動起動させるのが今風らしいじゃないですか。早く言ってよね…。(とはいえ自動起動できればどっちでも良いと思います)
最初init.dでやったのがこちら↓
環境
Ubuntu20.04
rails6
unicorn
nginx
参考
Unitファイル[unicorn.service]の作成
/etc/systemd/system/にunicorn.serviceを作ります。
パーミッションは644にするのが流儀のようです。
chownは/etc/以下なのでsudoでroot:rootのままで大丈夫。
sudo touch /etc/systemd/system/unicorn.service
chmod 644 /etc/systemd/system/unicorn.service
picoなどで編集
[Unit]
Description=The unicorn process
Before=nginx.service
After=network.target remote-fs.target nss-lookup.target
[Service]
User=hoge #ここはrailsのWorkingディレクトリのユーザーで良い
WorkingDirectory=/home/hoge/rails/hoge #フルパスで
SyslogIdentifier=unicorn
PIDFile=/home/hoge/rails/hoge/tmp/unicorn.pid #超大事。フルパスで
Type=simple
Restart=on-failure
Environment=RAILS_ENV=production #適宜developmentなど
Environment=UNICORN_CONF=/home/hoge/rails/hoge/config/unicorn.rb #フルパスで
ExecStart=/bin/bash -l -c 'bundle exec unicorn_rails -c ${UNICORN_CONF} -E ${RAILS_ENV} -D'
ExecStop=/usr/bin/kill -QUIT $MAINPID
# The unicorn process is gracefully restarted with `kill -USR2 <PID>` along with the setting
# in the before_fork hook in config/unicorn.rb.
# ref: https://tachesimazzoca.github.io/wiki/rails3/unicorn.html
ExecReload=/usr/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
書式の確認
sudo systemd-analyze verify /etc/systemd/system/unicorn.service
はまったところ
参考にしたところのUnitファイルにPIDFileの記述がありませんでした。
これがなくても書式チェックは正常。そして起動もします(すぐこけるけど)。
以下は必須
[Service]
PIDFile=/home/hoge/rails/hoge/tmp/unicorn.pid #超大事。フルパスで
変数展開はEnvironmentの部分のみ
DRY原則に則って、極力無駄な記述は避けたいと思い、
WorkingDirectoryを変数W_DIRに入れて展開したいよね、とか考え、
以下のように記述してみましたがNGです。
Environmentは変数入れれるのになんでや…。
##以下はダメな例ですのでコピペしないでね
[Service]
WorkingDirectory=W_DIR=/home/hoge/rails/hoge #変数W_DIRに代入
SyslogIdentifier=unicorn
PIDFile=${W_DIR}/tmp/unicorn.pid #NG
Type=simple
Restart=on-failure
Environment=RAILS_ENV=production #適宜developmentなど
Environment=UNICORN_CONF=${W_DIR}/config/unicorn.rb #NG
ExecStart=/bin/bash -l -c 'bundle exec unicorn_rails -c ${UNICORN_CONF} -E ${RAILS_ENV} -D'
設定が完了したら以下.serviceは付けなくてもいいようです。
起動時に自動起動させたい場合は
sudo systemctl enable unicornは必須!
sudo systemctl daemon-reload
sudo systemctl enable unicorn
sudo systemctl start unicorn
sudo systemctl status unicorn
systemctlに登録できたらserviceコマンドでもいけます。
shellではstart,stopが後ろに来るのでserviceコマンドの方が使えると思う。
sudo service unicorn start
sudo service unicorn stop
sudo service unicorn status
psコマンドのおさらい
色々あったのでpsの使い方について補足。
参考
$ ps -ef | egrep 'PID|unicorn' | grep -v grep
#スレッド一覧は以下
$ ps -eLf | egrep 'PID|unicorn' | grep -v grep