Имеется сервис, в котором работает NGINX и раздел /data
, который монтируется при старте интанса как общая файл-шара для машин в VMSS. Подробнее – в посте Azure: VMSS за Load Balancer, renew SSL от Let’s Encrypt, SMB file share и NGINX-proxy.
Проблема в том, что сертификаты и файлы настроек NGINX хранятся на подключаемом SMB-разделе, и запуск NGINX происходит того, как смонтируется файл-шара.
Выглядит это так:
[simterm]
# systemctl status nginx.service | grep Active Active: active (running) since Tue 2017-07-25 13:16:37 UTC; 1min 9s ago
[/simterm]
И сравниваем время data.mount
:
[simterm]
# systemctl status data.mount | grep Active Active: active (mounted) since Tue 2017-07-25 13:16:28 UTC; 1min 0s ago
[/simterm]
Проверяем зависимости NGINX-юнита:
[simterm]
# 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
[/simterm]
Находим юнит монтирования.
В данном случае монтируется каталог /data
:
[simterm]
# systemctl | grep '/data' data.mount loaded active mounted /data
[/simterm]
Его статус:
[simterm]
# 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.
[/simterm]
И его зависимости:
[simterm]
# 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
[/simterm]
Собственно, всё, что требуется сделать – это указать 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
Проверяем:
[simterm]
# systemd-analyze verify nginx.service; echo $? 0
[/simterm]
В случае ошибки – будет сообщение вида:
[simterm]
# systemd-analyze verify nginx.service [/etc/systemd/system/nginx.service.d/override.conf:1] Assignment outside of section. Ignoring.
[/simterm]
Перезапускаем systemd
демон и сервис nginx
:
[simterm]
# systemctl daemon-reload # systemctl reload nginx.service
[/simterm]
Проверяем:
[simterm]
# 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 ...
[/simterm]
Перезагружаем машину, проверяем снова:
[simterm]
# 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
[/simterm]
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