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

Автор: | 26/07/2017

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