Назад | Перейти на главную страницу

Как установить зависимости сервисов systemd?

Во время загрузки системы CentOS 7 запуск nginx завершается сбоем со следующей ошибкой:

2014/08/04 17:27:34 [emerg] 790#0: bind() to a.b.c.d:443 failed (99: Cannot assign requested address)

Я подозреваю, что это происходит из-за того, что сетевые интерфейсы еще не работают до попытки привязки к этому IP-адресу для обслуживания виртуального хоста через SSL.

Я предполагаю, что мне нужно указать network.service как требование для nginx.service, но я вообще не могу найти сетевую службу в / etc / systemd /.

Как я могу настроить порядок обслуживания или зависимости в systemd?

Вам нужно, как минимум, After=network.target в [Unit] раздел вашего файла модуля, чтобы убедиться, что сеть работает перед запуском nginx. Понятия не имею, почему в вашем юнит-файле его нет.

Вот полный пример моей удобной системы Fedora, поставляемой Fedora:

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Из журнала ошибок похоже, что ваша конфигурация nginx. В файле есть директива listen с явным IP-адресом:

listen a.b.c.d:443

Это означает, что nginx не запустится, если ваш сетевой интерфейс не включен. и IP-адрес a.b.c.d был назначен интерфейсу.

У вас есть два варианта:

  • измените директиву listen на: listen 443; (привязать ко всем ip адресам)
  • сделать nginx зависимым от network-online.target

Как описано в http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ network.target указывает только на то, что стек сетевого управления активен [...] Не определено, настроены ли уже какие-либо сетевые интерфейсы, когда он достигнут.

Если вы хотите убедиться, что IP-адрес уже назначен и интерфейс работает, вам нужно добавить network-online.target в файл модуля systemd вашего nginx.

В вашем файле /etc/systemd/system/multi-user.target.wants/nginx.service в строках After = и Requires = должен быть указан network-online.target.

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target network-online.target
Requires=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target