Jak ustawić zależności usług systemowych?


17

Podczas uruchamiania systemu CentOS 7 uruchomienie nginx kończy się niepowodzeniem z następującym błędem:

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

Podejrzewam, że tak się dzieje, ponieważ interfejsy sieciowe nie działają jeszcze przed próbą powiązania z tym adresem IP w celu obsługi vhosta przez SSL.

Domyślam się, że muszę określić usługę network.service jako wymaganie dla usługi nginx.service, ale w ogóle nie mogę znaleźć usługi sieciowej w / etc / systemd /.

Jak mogę skonfigurować zlecenie serwisowe lub zależności w systemd?


1
Nie szukasz bardziej zależności od usług niż zamówień ?
CVn

Słuszna uwaga! Zaktualizowano
vincent.io


Dzięki, to rozwiązuje problem! Czy umiesz podać odpowiedź, aby ją zamknąć? :)
vincent.io

Usunąłem moją odpowiedź. Źródło tej odpowiedzi opublikowane (Mr. Hampton). Powinien zaznaczyć swoją jako poprawną odpowiedź.
Belmin Fernandez

Odpowiedzi:


19

Musisz przynajmniej After=network.targetw [Unit]sekcji pliku jednostkowego, aby upewnić się, że sieć działa przed uruchomieniem nginx. Nie mam pojęcia, dlaczego nie ma go w pliku jednostki.

Oto kompletny przykład z mojego przydatnego systemu Fedora dostarczonego przez Fedorę:

[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

Dzięki, świetna odpowiedź! Zainstalowałem nginx z repozytorium remiksu (innej firmy), co może wyjaśniać, dlaczego w pliku jednostki brakuje „After”.
vincent.io,

1
Ciekawy. Daję mu wiadomość i powiadomię o problemie. Jego paczki są zazwyczaj bardzo wysokiej jakości i nie jestem pewien, jak tego nie zauważył.
Michael Hampton

Świetna sugestia, zrobiona.
vincent.io,

5

Z dziennika błędów wygląda konfiguracja nginx. plik ma dyrektywę Listen z jawnym adresem IP:

listen a.b.c.d:443

Oznacza to, że nginx nie rozpocznie chyba że interfejs jest włączony i ABCD IP został przypisany do interfejsu.

Masz dwie opcje:

  • zmień dyrektywę Listen na: Listen 443; (powiąż ze wszystkimi adresami IP)
  • uzależnić nginx od network-online.target

Jak opisano w http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ the network.target wskazuje tylko, że stos zarządzania siecią jest w stanie [...] Czy jakiekolwiek interfejsy sieciowe są już skonfigurowane, gdy zostaną osiągnięte jest niezdefiniowany.

Jeśli chcesz się upewnić, że adres IP jest już przypisany, a interfejs działa, musisz dodać network-online.target do pliku systemowej jednostki nginx.

Twój plik /etc/systemd/system/multi-user.target.wants/nginx.service powinien mieć sieć-online.target w wierszach After = i wymaga =.

[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 za wzmiankę network-online.target- na wypadek, gdyby ktoś również się zastanawiał: tak, oba Requires=i After=są konieczne, ponieważ Requires=(prawdopodobnie zaskakujące) nie oznacza uporządkowania między wymaganą jednostką a jednostką wymagającą.
maxschlepzig
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.