Skip to content

Instantly share code, notes, and snippets.

@lluchs
Last active January 3, 2020 18:14
Show Gist options
  • Save lluchs/fd2f0e5c415490ccda2c to your computer and use it in GitHub Desktop.
Save lluchs/fd2f0e5c415490ccda2c to your computer and use it in GitHub Desktop.
nginx auf dem Uberspace

nginx auf dem Uberspace

Installation

Lade die neueste "mainline"-Version (hier 1.7.9) von http://nginx.org/en/download.html herunter und entpacke sie:

$ wget http://nginx.org/download/nginx-1.7.9.tar.gz 
$ tar xf nginx-1.7.9.tar.gz
$ cd nginx-1.7.9

Kompilieren geht wie gewohnt. Der prefix sorgt dafür, dass ins eigene Home-Verzeichnis installiert wird und nicht ins Systemverzeichnis, wo man ja keine Rechte hat.

Damit IP-Adressen richtig weitergegeben werden, sollte das realip-Modul aktiviert werden. Der Uberspace ist auch via IPv6 erreichbar, was in nginx auch aktiviert werden muss (wenn man das nicht tut, werden IPv6-Verbindungen als 127.0.0.1 angezeigt).

$ ./configure --prefix=$HOME/nginx --with-http_realip_module --with-ipv6
$ make
$ make install

nginx ist jetzt unter $HOME/nginx installiert. Um auf die ausführbare Datei leicht zugreifen zu können, lohnt sich ein Symlink:

$ ln -s ~/nginx/sbin/nginx ~/bin

Alternativ kann man natürlich den Ordner dem PATH hinzufügen.

Konfiguration

Die nginx-Konfigurationsdateien liegen unter ~/nginx/conf. Dort gibt es standardmäßig einige verschiedene Dateien, von denen automatisch nur die nginx.conf geladen wird.

$ cd ~/nginx/conf
$ vim nginx.conf

Hier sind ein paar Sachen auf jeden Fall wichtig:

  • Füge in der obersten Ebene die Zeile daemon off; hinzu. Dadurch kann man nginx mit den Daemontools laufen lassen.

  • Aktiviere das realip-Modul mit der folgenden Konfiguration im http-Block:

set_real_ip_from  127.0.0.1;
set_real_ip_from  ::1;
real_ip_header    X-Forwarded-For;
  • Du kannst nginx natürlich nicht auf den Standardports laufen lassen. Such dir einen hohen Port aus (siehe Wiki), der noch nicht belegt ist, und nutze ihn mit listen:
server {
  listen 65432;
  # [...]
}

Wenn du das soweit hast, kannst du einfach nginx in der Konsole ausführen (und mit Strg-C wieder beenden), um zu sehen, ob alles soweit passt. Wenn sich nginx automatisch in den Hintergrund schiebt, fehlt die deamon off-Konfiguration von oben!

Wenn alles passt, kannst du wie gewohnt nginx mit den Daemontools laufen lassen:

$ uberspace-setup-service nginx ~/nginx/sbin/nginx

Wenn du Änderungen an der nginx-Konfiguration machst, musst du nicht den Daemon neustarten (bzw. es wäre sogar eine schlechte Idee, das zu tun), sondern verwendest einfach nginx -s reload. Dabei überprüft nginx zuerst, ob deine Konfiguration gültig ist und startet dann die Worker-Prozesse automatisch neu, sobald sie alle aktuellen Verbindungen abgearbeitet haben.

Aktualisierungen

Um nginx zu aktualisieren, mache einfach alles so wie oben unter "Installation" beschrieben, nur eben mit der neueren Version. Danach nginx neu starten mit svc -du ~/service/nginx. Die integrierte Upgrade-Funktion, die wie das Konfigurationsneuladen keine aktiven Verbindungen verliert, funktioniert leider nicht, da wir daemon off verwenden.

Falls du bei der vorigen Installation zusätzliche Parameter an ./configure übergeben hast, kannst du die mit nginx -V sehen.

nginx erreichbar machen

Um nginx tatsächlich von außen erreichbar zu machen, kannst du verschiedene Möglichkeiten:

  1. Nutze weiterhin den Apache mit einer RewriteRule. Nicht so toll, weil damit alle Anfragen durch eine zusätzliche Ebene müssen und nginx ja dieselben Dinge macht wie Apache.

  2. Lass dir den verwendeten Port öffnen. Nachteil: Der Port taucht dann in der URL auf. In dem Fall würdest du aber das realip-Modul natürlich nicht brauchen.

  3. Direkt nginx an Pound anbinden lassen. Dazu den gewählten Port zusammen mit den Domains bzw. Pfaden an hallo@uberspace.de senden. Das hat einen Geschwindigkeitsvorteil im Gegensatz zu Variante 1. Außerdem ist nginx dann regulär über Port 80 bzw. 443 erreichbar und man muss sich nicht selbst um TLS kümmern.

@B-iggy
Copy link

B-iggy commented Dec 27, 2015

Hey lluchs,
soweit so gut, aber wie hast du es hinbekommen den nginx ohne root zum laufen zu kriegen? Bei mir schnappt er sich immer die root Version vom /etc/nginx Verzeichnis, die ja nicht mir gehört.
Kriege beim "nginx" folgendes:
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2015/12/27 11:55:06 [warn] 19255#0: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:5
2015/12/27 11:55:06 [emerg] 19255#0: mkdir() "/var/lib/nginx/tmp/client_body" failed (13: Permission denied)

@ender74
Copy link

ender74 commented Mar 13, 2016

Die Konfiguration welche zu verwenden ist, kann man nginx als Parameter mitgeben. Ich hab mir dazu das folgende Skript in meinen bin Ordner gelegt:

!/bin/bash

/home/xxx/nginx/sbin/nginx -c /home/xxx/nginx/conf/nginx.conf -g "pid /home/xxx/nginx/nginx.pid;"

Copy link

ghost commented Oct 9, 2016

Kannst du das nochmal genauer beschreiben? Ich habe das gleiche problem wie @B-iggy und verstehe es nicht zu lösen.
In welches Verzeichnis muss ich welche Datei mit welcher Endung ablegen?

Gruß und Dank

@lluchs
Copy link
Author

lluchs commented Nov 9, 2016

Hallo @B-iggy, @ender74 und @MortimerNeuss,

ich muss mich entschuldigen, dass ich nie auf Kommentare geantwortet habe. GitHub schickt so wie es aussieht einfach keine E-Mails, wenn jemand was bei gists schreibt.

Der Fehler kommt vermutlich, weil ihr das --prefix-Argument für configure weggelassen habt? Das ist aber wichtig, weil es eben dafür sorgt, dass die Pfade alle stimmen. Beispiel mit aktueller nginx-Version:

clnk@lupus ~/src/nginx-1.11.5 % ./configure --prefix=/home/clnk/nginx --with-http_realip_module

IPv6 muss man mittlerweile nicht mehr selbst aktivieren. Ganz am Schluss gibt configure dann auch aus, welche Pfade verwendet werden:

Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + using system zlib library

  nginx path prefix: "/home/clnk/nginx"
  nginx binary file: "/home/clnk/nginx/sbin/nginx"
  nginx modules path: "/home/clnk/nginx/modules"
  nginx configuration prefix: "/home/clnk/nginx/conf"
  nginx configuration file: "/home/clnk/nginx/conf/nginx.conf"
  nginx pid file: "/home/clnk/nginx/logs/nginx.pid"
  nginx error log file: "/home/clnk/nginx/logs/error.log"
  nginx http access log file: "/home/clnk/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

Da könnt ihr sehen, dass alle Pfade unterhalb des Präfixes sind und damit im Home-Verzeichnis, wo der Zugriff kein Problem ist. Zum Starten von nginx müssen dann - wie im Artikel auch beschrieben - keine weiteren Parameter mehr übergeben werden, da der korrekte Pfad zur Konfigurationsdatei bereits einkompiliert ist.

Ich hoffe, dass euch das weiterhilft - wobei ihr bestimmt nach all den Monaten andere Lösungen gefunden habt.

Viele Grüße
Luchs

@yckart
Copy link

yckart commented Jan 10, 2017

Bisher haben wir auf Pound gesetzt, mit Uberspace 7 setzen wir auf nginx.
https://blog.uberspace.de/uberspace-7-episode-5/#wirtauschenunserhttpsfrontendaus

@maddinq
Copy link

maddinq commented Mar 31, 2017

Hey @lluchs ,
vielen Dank für deine Doku.
In deiner Configure-Zeile ist noch ein Fehler "$HOME" statt "/home/clnk/nginx" muss es heißen

Ablauf wäre wie folgt:

$ wget http://nginx.org/download/nginx-1.11.12.tar.gz 
$ tar xf nginx-1.11.12.tar.gz
$ cd nginx-1.11.12

$ ./configure --prefix=$HOME/nginx --with-http_realip_module
$ make
$ make install

$ ln -s ~/nginx/sbin/nginx ~/bin
$ cd ~/nginx/conf
$ vim nginx.conf

...und dann gehts mit der Config weiter

am Ende sollte der Start via nginx den oben genannten Fehler aufrufen.
Was daran liegt, dass wir das globale nginx von UBERSPACE aufrufen, welches nicht unsere Config ausliest.
Daher bitte ~/nginx/sbin/nginx zum testen aufrufen. (eure testseite domain.tld:PORTNUMMERsollte nun laufen).
Mit STRG+C wieder abschießen und den deamon als Service eintragen. (siehe oben)

ps. zum testen ob der Service sauber funktioniert:

$ svstat ~/service/nginx/
service/nginx/: up (pid 6662) 258720 seconds
$ svstat ~/service/nginx/
service/nginx/: up (pid 5329) 6 seconds

@68040
Copy link

68040 commented Apr 14, 2017

Bisher haben wir auf Pound gesetzt, mit Uberspace 7 setzen wir auf nginx.
https://blog.uberspace.de/uberspace-7-episode-5/#wirtauschenunserhttpsfrontendaus

Das ist auch schon wieder über ein halbes Jahr her. 😞

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment