Имеется сервис, в котором работает 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