
Problemstellung
Wir hatten auf unserem Webserver die Notwendigkeit, sowohl Apache als auch Nginx verwenden zu müssen.
Da beide Dämonen jeweils auf Port 80 (HTTP) lauschen sollten, muss jeder Dämon jeweils an eine eigene IP-Adresse
gebunden werden. Das bedeutet, dass Apache mittels "Listen 1.2.3.4:80" und Nginx mittels "listen 1.2.3.5:80"
konfiguriert wurden.
Der Seiteneffekt dieser Konfiguration war, dass sehr häufig beim Start des Systems beide Dämonen
nicht korrekt gestartet wurden. Ein nachträglicher, manueller Start funktionierte immer.

Behelfslösung
Die erste Behelfslösung bestand darin, in /etc/rc.local folgendes zu tun:
sleep 30
systemctl start nginx
systemctl start apache2

Ursache
Tatsächlich stellte sich heraus, dass beide Dämonen zu früh gestartet wurden. Im Systemd-Journal (journalctl -x)
war sichtbar, dass das Netzwerkinterface erst aktiv wurde, nachdem die Dämonen bereits angelaufen waren:
fatty.congenio.de nginx[1343]: nginx: [emerg] bind() to 1.2.3.5
fatty.congenio.de nginx[1343]: nginx: configuration file /etc/nginx/
fatty.congenio.de systemd[1]: nginx.service: Control process exited,
fatty.congenio.de systemd[1]: nginx.service: Failed with result 'exi
fatty.congenio.de systemd[1]: Failed to start A high performance web
-- Subject: Unit nginx.service has failed
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
--
-- Unit nginx.service has failed.
--
-- Unit systemd-networkd.service has begun starting up.
fatty.congenio.de systemd-networkd[27544]: eth0: Gained IPv6LL
fatty.congenio.de systemd-networkd[27544]: Enumeration completed
fatty.congenio.de systemd-timesyncd[667]: Network configuration chan
fatty.congenio.de systemd[1]: Started Network Service.
-- Subject: Unit systemd-networkd.service has finished start-up
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
--
-- Unit systemd-networkd.service has finished starting up.
--
-- The start-up result is RESULT.
fatty.congenio.de systemd-networkd[27544]: eth0: IPv6 successfully e
fatty.congenio.de systemd-networkd[27544]: lo: Link is not managed b
fatty.congenio.de systemd-timesyncd[667]: Synchronized to time serve
Grund ist, dass überraschenderweise das Systemd-Target "network.target" nicht bedeutet, dass das Netzwerk komplett initialisiert ist, sondern nur, dass es gestartet wurde.
Um wirklich auf das Netzwerk zu warten, müsste man das Target "network-online.target" verwenden (
siehe hier).
In Ubuntu sind die meisten Dämonen aber an "network.target" gebunden, z.B. /lib/systemd/system/nginx.service:
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5
--pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
Dummerweise wird dieses Problem in Ubuntu absichtlich nicht beseitigt, weil es in einer normalen Konfiguration nicht auftritt. Wenn man nämlich auf die Default-Adresse 0.0.0.0/0 lauscht, müssen die zugehörigen IPs und Interfaces noch nicht aktiv sein.

Lösung
Man kann mittels "systemctl edit nginx" eine Zusatzdefinition für Systemd hinzufügen:
[Unit]
After=network-online.target
Das bewirkt dann, dass der entprechende Dämon erst nach erfolgreicher Netzwerkinitialisierung gestartet wird.