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.
Vorausgesetzt nginx läuft....
Da der Raspberry auch ab und zu mal rebooted wird, sollte der nginx Dienst natürlich automatisch starten.
Ein SysVinit script war schnell erstellt und wenn man in den nginx Konfigurationsdateien keine Fehler gemacht, läßt sich der server auch per
Also einfach per
Der Grund findet sich in /var/log/nginx/error.log:
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.
Ein manuelles Starten per
No cigar. Funktioniert auch nicht.
Nächster Versuch: Eintrag in rc.local
Und nginx von dort starten. Den Aufruf vor der letzten Zeile "exit 0" einfügen.
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.
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 starteinfach starten.
Also einfach per
sudo update-rc.d nginx defaultsmit 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 INFOAllerdings scheint DNS trotzdem noch nicht zu funktionieren, wenn nginx gestartet wird.
Ein manuelles Starten per
sudo /etc/init.d/nginx startdirekt 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.