ソースコードからインストールしたNginxのUnitファイルの作り方

2022年6月17日

前提

書くこと/書かないこと

nginxをソースコードからインストールした際に、サービス化してsystemdで制御するために必要となるUnitファイルの書き方を書きます。

環境

AlmaLinux release 8.6 (Sky Tiger) ※CentOS8代替OS
nginx version: nginx/1.22.0

さくっと

時間が出来たらまとめます(期待しないでください)。

こってりと

serviceファイルの作成

/etc/systemd/system/の下に新しいファイルnginx.serviceを作成し、下記の内容を記載して保存します。
この記述はnginxの公式サイトのサンプルを参考にしています。

https://www.nginx.com/resources/wiki/start/topics/examples/systemd/

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

systemdのデーモンリロード

追記した内容をsystemdに読み込ませるため、デーモンをリロードします。

systemctl daemon-reload

設定が反映されていることを確認します。

# systemctl list-unit-files | grep nginx
nginx.service                              disabled

disabledなので自動起動は無効になっていますが、Unitファイルの設定が反映されていることが確認できました。

Nginxの起動設定 ~ 動作確認

自動起動を有効にして起動し、ステータス確認までを行います。

# systemctl enable nginx.service
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /etc/systemd/system/nginx.service.
# systemctl start nginx.service
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.

起動できませんでした。。。

調査します。

logファイルを確認します。

Jun 11 22:15:42 hostname systemd[1]: Starting The NGINX HTTP and reverse proxy server...
Jun 11 22:15:42 hostname nginx[91927]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
Jun 11 22:15:42 hostname nginx[91927]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
Jun 11 22:15:42 hostname systemd[1]: nginx.service: Can't open PID file /run/nginx.pid (yet?) after start: No such file or directory
Jun 11 22:17:12 hostname systemd[1]: nginx.service: start operation timed out. Terminating.
Jun 11 22:17:12 hostname systemd[1]: nginx.service: Failed with result 'timeout'.
Jun 11 22:17:12 hostname systemd[1]: Failed to start The NGINX HTTP and reverse proxy server.

“Can’t open PID file /run/nginx.pid (yet?) after start: No such file or directory"ということで、pidが作成できないようです。

/runディレクトリはrootが所有者ディレクトリで揮発性のため、パーミッションを変えたりサブディレクトリを作ったりして一時的動作しても再起動すると元に戻ってしまいます。tmpfiles.dに設定することで再起動時も有効なディレクトリを作ることもできますが、今回はsystemdを使わないでnginxが起動することが確認できているので、systemdを使わない場合はおそらく別の場所にpidが作られていると推測し、調べてみることにします。

“Can’t open PID file /run/nginx.pid (yet?) after start: No such file or directory"の調査と対応

nginxを起動してからfindコマンドでpidの場所を探します。

# /usr/local/nginx/sbin/nginx
# find /usr/local/nginx/* -type f -name "*.pid"
/usr/local/nginx/logs/nginx.pid

“/run/nginx.pid"ではなく"/usr/local/nginx/logs/nginx.pid"にありました。
nginxの公式サイトの情報を見ると、ここがデフォルトのようです。

http://nginx.org/en/docs/ngx_core_module.html#pid

ということで、systemdのunitファイルを修正し、pidファイルのパスを変更します。
ついでにもう一つ、詳細は割愛しますが既知の不具合への対応のため、ExecStartPostの1行も追加します。

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPost=/bin/sleep 0.1
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

これで起動できるか確認します。

# systemctl daemon-reload
# systemctl start nginx
# systemctl status nginx
●nginx.service - The NGINX HTTP and reverse proxy server
   Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-06-11 23:12:49 JST; 49s ago
  Process: 92551 ExecStartPost=/bin/sleep 0.1 (code=exited, status=0/SUCCESS)
  Process: 92548 ExecStart=/usr/local/nginx/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 92547 ExecStartPre=/usr/local/nginx/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Main PID: 92550 (nginx)
   Tasks: 2 (limit: 5936)
   Memory: 2.0M
   CGroup: /system.slice/nginx.service
           ├ 92550 nginx: master process /usr/local/nginx/sbin/nginx
           └ 92552 nginx: worker process

 6月 11 23:12:49 hostname systemd[1]: Starting The NGINX HTTP and reverse proxy server...
 6月 11 23:12:49 hostname nginx[92547]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
 6月 11 23:12:49 hostname nginx[92547]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
 6月 11 23:12:49 hostname systemd[1]: Started The NGINX HTTP and reverse proxy server.

何とか起動できました。

# systemctl stop nginx.service
[root@PR-WP ~]# systemctl status nginx.service
● nginx.service - The NGINX HTTP and reverse proxy server
   Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: d>
   Active: inactive (dead) since Sat 2022-06-11 23:16:45 JST; 13s ago
  Process: 92633 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/SUC>
  Process: 92551 ExecStartPost=/bin/sleep 0.1 (code=exited, status=0/SUCCESS)
  Process: 92548 ExecStart=/usr/local/nginx/sbin/nginx (code=exited, status=0/S>
  Process: 92547 ExecStartPre=/usr/local/nginx/sbin/nginx -t (code=exited, stat>
 Main PID: 92550 (code=exited, status=0/SUCCESS)

最後に停止できることも確認して、これで完了です。