Как установить зависимости службы systemd?

17

Во время загрузки системы 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?

vincent.io
источник
1
Разве вы не ищете сервисные зависимости больше, чем заказ ?
CVn
Хорошая точка зрения! Обновлено.
vincent.io
1
Это может помочь: serverfault.com/questions/482730/…
Бельмин Фернандес,
Спасибо, это решает это! Не могли бы вы добавить это в ответ, чтобы я мог закрыть его? :)
vincent.io
Удалил мой ответ. Источник этого ответа размещен (мистер Хэмптон). Следует пометить его как правильный ответ.
Бельмин Фернандес

Ответы:

19

Вам необходимо, как минимум, 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 из репозитория remi (стороннего производителя), что может объяснить, почему в файле модуля отсутствует «После».
vincent.io
1
Интересный. Я бы бросил ему записку и дал ему знать о проблеме. Его пакеты обычно очень высокого качества, и я не уверен, как он это пропустил.
Майкл Хэмптон
Отличное предложение, сделано.
vincent.io
5

Из журнала ошибок это выглядит как ваш конфиг nginx. Файл имеет директиву listen с явным IP-адресом:

listen a.b.c.d:443

Это означает, что nginx не запустится, если ваш сетевой интерфейс не подключен и IP-адрес abcd не назначен интерфейсу.

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

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

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

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

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

[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
Лука Гибелли
источник
1
+1 за упоминание network-online.target- в случае, если кто-то также задается вопросом: да, и то, Requires=и другое After=необходимо, потому что Requires=(возможно удивительно) не подразумевает упорядочение между требуемой единицей и требуемой.
maxschlepzig