Das im Titel geforderte hört sich erst mal nicht zu schwierig an, war in der Praxis aber mit einigen Fallstricken gespickt. Vielleicht hilft der Beitrag ja dem Einen oder Anderen, der wie ich kein wirklicher Linux Guru ist.
Hintergrund
Ich habe
nginx auf einem Raspberry Pi (Standard Raspian image) als reverse proxy laufen um mit einer Portfreigabe auf dem Router verschiedene interne Dienste über das Internet erreichen zu können. Anleitungen gibt es viele im Netz und der proxy funktioniert soweit gut.
Vorausgesetzt nginx läuft....
Da der Raspberry auch ab und zu mal rebooted wird, sollte der nginx Dienst natürlich automatisch starten.
nginx beim booten starten, Versuch 1
Ein
SysVinit script war schnell erstellt und wenn man in den nginx Konfigurationsdateien keine Fehler gemacht, läßt sich der server auch per
sudo /etc/init.d/nginx start
einfach starten.
Also einfach per
sudo update-rc.d nginx defaults
mit den entsprechenden runlevels verknüpft und rebooted. Das Ergebnis: Fehlschlag.
Der Grund findet sich in /var/log/nginx/error.log:
host not found in upstream "raspi1" in /etc/nginx/sites-enabled/main
nginx prüft die proxy Ziele beim Start und DNS ist anscheinend noch nicht verfügbar zu diesem Zeitpunkt.
Im /etc/init.d/nginx start script sind die Netzwerkdienste eigentlich als "Required" angegeben.
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO
Allerdings scheint DNS trotzdem noch nicht zu funktionieren, wenn nginx gestartet wird.
Ein manuelles Starten per
sudo /etc/init.d/nginx start
direkt nach dem Einloggen funktioniert.
nginx beim booten starten, Versuch 2
Nächster Versuch: nginx später starten.
sudo update-rc.d nginx defaults 99 10
No cigar. Funktioniert auch nicht.
nginx beim booten starten, Versuch 3
Nächster Versuch: Eintrag in rc.local
sudo nano /etc/rc.local
Und nginx von dort starten. Den Aufruf
vor der letzten Zeile "exit 0" einfügen.
!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
sudo /etc/init.d/nginx start
exit 0
Dieser Versuch war endlich von Erfolg gekrönt.
Falls jemand systemd auf dem aktuellsten Raspian Jessie verwendet, sollte dieser hack nicht mehr erforderlich sein, da die Abhängigkeiten zu Netzwerkdiensten feiner angegeben werden können und man somit eine funktionierende Abhängigkeit zum DNS angeben kann (angeblich, noch nicht getestet).
Eine andere Lösung wäre, wenn nginx trotz "fehlendem" upstream starten würde und im Betrieb einen HTTP 5xx zurückgeben würde wenn der upstream wirklich nicht erreichbar ist.