Як встановити залежності системної служби?


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-адреси для обслуговування vhost через SSL.

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

Як я можу налаштувати порядок обслуговування або залежності в systemd?


1
Ви не шукаєте більше залежностей від обслуговування, ніж замовлення ?
CVn

Гарна думка! Оновлено.
vincent.io

1
Це може допомогти: serverfault.com/questions/482730/…
Belmin Fernandez

Дякую, що це вирішує! Ви хочете поставити відповідь, щоб я міг її закрити? :)
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 із сховища ремі (стороннього), що могло б пояснити, чому у файлі одиниці відсутнє "Після".
vincent.io

1
Цікаво. Я б кинув йому записку і дав би йому знати про проблему. Його пакети, як правило, дуже якісні, і я не впевнений, як він це пропустив.
Майкл Хемптон

Чудова пропозиція, зроблено.
vincent.io

5

З журналу помилок це схоже на ваш nginx config. файл має директиву прослуховування з явним ip адресою:

listen a.b.c.d:443

Це означає , що Nginx не запуститься , якщо мережевий інтерфейс не залежить і IP - ABCD був призначений інтерфейсу.

У вас є два варіанти:

  • змінити директиву прослуховування на: прослуховувати 443; (прив’язати до всіх ip-адрес)
  • зробити nginx залежним від network-online.target

Як описано в http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ the network.target вказує лише на те, що стек управління мережею налаштований [...] Чи вже налаштовані якісь мережеві інтерфейси при його досягненні не визначено.

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

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

[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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.