Linux: systemd, NGINX, разделы и порядок загрузки

By | 07/26/2017
 

Имеется сервис, в котором работает NGINX и раздел /data, который монтируется при старте интанса как общая файл-шара для машин в VMSS. Подробнее – в посте Azure: VMSS за Load Balancer, renew SSL от Let’s Encrypt, SMB file share и NGINX-proxy.

Проблема в том, что сертификаты и файлы настроек NGINX хранятся на подключаемом SMB-разделе, и запуск NGINX происходит того, как смонтируется файл-шара.

Выглядит это так:

systemctl status nginx.service | grep Active
Active: active (running) since Tue 2017-07-25 13:16:37 UTC; 1min 9s ago

И сравниваем время data.mount:

systemctl status data.mount | grep Active
Active: active (mounted) since Tue 2017-07-25 13:16:28 UTC; 1min 0s ago

Проверяем зависимости NGINX-юнита:

systemctl show nginx.service -p After -p Wants -p Requires
Requires=system.slice sysinit.target
Wants=
After=sysinit.target systemd-journald.socket basic.target system.slice network.target

Находим юнит монтирования.

В данном случае монтируется каталог /data:

systemctl  | grep '/data'
data.mount                                                                                                                                                         loaded active mounted   /data

Его статус:

systemctl status data.mount
● data.mount - /data
Loaded: loaded (/etc/fstab; bad; vendor preset: enabled)
Active: active (mounted) since Tue 2017-07-25 08:59:41 UTC; 3h 47min ago
Where: /data
What: //jmgwproxy.file.core.windows.net/gwproxydataproduction
Docs: man:fstab(5)
man:systemd-fstab-generator(8)
Process: 1244 ExecMount=/bin/mount //jmgwproxy.file.core.windows.net/gwproxydata /data -t cifs -o vers=3.0,username=jmgwproxy,password=g2M***wPR
Tasks: 0
Memory: 40.0K
CPU: 10ms
Jul 25 08:59:41 lj3hwzghi6ibg000000 systemd[1]: Mounting /data...
Jul 25 08:59:41 lj3hwzghi6ibg000000 systemd[1]: Mounted /data.
Warning: data.mount changed on disk. Run 'systemctl daemon-reload' to reload units.

И его зависимости:

systemctl show data.mount -p After -p Wants -p Requires
Requires=system.slice -.mount
Wants=network-online.target
After=-.mount network.target system.slice systemd-journald.socket network-online.target remote-fs-pre.target

Собственно, всё, что требуется сделать – это указать systemd на необходимость запускать service-юнит nginx.service после mount-юнита data.mount.

Редактируем nginx.service – напрямую, в файле /lib/systemd/system/nginx.service, либо через systemctl edit nginx.service (который создаст /etc/systemd/system/nginx.service.d/override.conf), и добавляем After и Requires (или Wants):

[Unit]
Requires=data.mount
After=data.mount

Проверяем:

systemd-analyze verify nginx.service; echo $?

В случае ошибки – будет сообщение вида:

systemd-analyze verify nginx.service
[/etc/systemd/system/nginx.service.d/override.conf:1] Assignment outside of section. Ignoring.

Перезапускаем systemd демон и сервис nginx:

systemctl daemon-reload
systemctl reload nginx.service

Проверяем:

systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/nginx.service.d
└─override.conf
...

Перезагружаем машину, проверяем снова:

systemctl status nginx.service | grep Active
Active: active (running) since Tue 2017-07-25 13:20:58 UTC; 1min 18s ago
systemctl status data.mount | grep Active
Active: active (mounted) since Tue 2017-07-25 13:20:56 UTC; 1min 25s ago

data.mount выполнился до nginx.service, NGINX запустился без ошибок – всё отлично.

Ссылки по теме

systemd for Administrators, Part 1

What is systemd’s target, service and socket?

Understanding and Using Systemd

RHEL7: How to get started with Systemd