第3回 uWSGIを使用したDjangoプロジェクトのsystemdサービス化
第2回ではDjangoプロジェクトをuWSGIで起動し、Nginxと連携しました。今回は、uWSGIをsystemdのサービスとして登録することで、systemctlコマンドによる起動・停止の操作とOS起動時の自動立ち上げを可能にします。
なお、今回はuWSGIの制御でよく使われるuWSGI Emperorは使用しません。
rootユーザに遷移
今回の操作は全てrootユーザで行うため、毎回sudoコマンドを打たずに予めrootユーザに遷移しておく。
$ su -
#
systemdのサービス定義ファイルを作成
systemdにサービスとして認識されるよう、/usr/lib/systemd/system
配下に定義ファイルを作成する。
今回は demo.service
というファイル名とすることで、demoというサービスを作成する。以下が demo.service
の内容。
[Unit]
Description=demo
After=syslog.target
[Service]
User=root
ExecStart=/home/hiyoko/demo/start.sh
Type=forking
PIDFile=/run/demo/demo.pid
StandardError=syslog
NotifyAccess=all
Restart=always
KillSignal=SIGQUIT
[Install]
WantedBy=multi-user.target
パラメータ | 内容 |
---|---|
Description | このサービスの説明。機能に影響しない。 |
After | OS起動時、sysLog.targetに定義されたサービス起動の後に起動する。 |
パラメータ | 内容 |
---|---|
User | 実行ユーザ。uWSGIのマスタープロセスはrootで実行する。 |
ExecStart | 起動コマンド。第2回で作成した起動スクリプトを指定する。 |
Type | start.shはuWSGIを起動したら終了するため、マスタープロセスのPIDファイルに記録されたプロセスIDを監視するforkingを指定する。 |
PIDFile | uWSGIマスタープロセスのPIDファイルへのパス。 |
StandardError | エラーはsyslogに出力する。 |
Restart | uWSGIマスタープロセスが消えた場合に自動的に再起動させるため、allを指定する。 |
KillSignal | uWSGIを終了させるためのシグナル。SIGQUITを指定する。 |
パラメータ | 内容 |
---|---|
WantedBy | サービスを起動するランレベル。multi-user.targetを指定する。 |
systectlコマンドでサービス起動と自動起動設定
作成したサービス定義ファイルを置くだけで、systemdはすぐにサービスとして扱うようになる。
まずは起動前にステータス表示を行い、サービスとして認識されているか確認する。
# systemctl status demo
● demo.service - demo
Loaded: loaded (/usr/lib/systemd/system/demo.service; disabled; vendor preset: disabled)
Active: inactive (dead)
demoサービスを起動し、再度ステータス表示する。
# systemctl start demo
# systemctl status demo
● demo.service - demo
Loaded: loaded (/usr/lib/systemd/system/demo.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2020-08-10 16:20:26 JST; 4s ago
Process: 2387 ExecStart=/home/hiyoko/demo/start.sh (code=exited, status=0/SUCCESS)
Main PID: 2397 (uwsgi)
Status: "uWSGI is ready"
Tasks: 6 (limit: 24829)
Memory: 32.4M
CGroup: /system.slice/demo.service
├2397 uwsgi --ini /home/hiyoko/demo/uwsgi.ini
├2399 uwsgi --ini /home/hiyoko/demo/uwsgi.ini
├2400 uwsgi --ini /home/hiyoko/demo/uwsgi.ini
├2401 uwsgi --ini /home/hiyoko/demo/uwsgi.ini
├2402 uwsgi --ini /home/hiyoko/demo/uwsgi.ini
└2403 uwsgi --ini /home/hiyoko/demo/uwsgi.ini
8月 10 16:20:26 CentOS8-1 systemd[1]: Starting demo...
8月 10 16:20:26 CentOS8-1 start.sh[2387]: [uWSGI] getting INI configuration from /home/hiyoko/demo/uwsgi.ini
8月 10 16:20:26 CentOS8-1 systemd[1]: demo.service: New main PID 1979 does not exist or is a zombie.
8月 10 16:20:26 CentOS8-1 systemd[1]: Started demo.
OS起動時にdemoサービスが立ち上がるよう設定する。
# systemctl enable demo
Created symlink /etc/systemd/system/multi-user.target.wants/demo.service → /usr/lib/systemd/system/demo.service.
コメント
[…] 第3回では、uWSGIをsystemdのサービスとして登録してOS起動時にuWSGIも自動的に起動するようにしました。第4回ではuWSGIのログをローテートし、ログファイルが無限に増えてディスク容量を圧迫しないようにします。また、せっかくなので一般的にサービスと同じようにログファイルの保存場所を /var/log/demo 配下に移動します。 […]