Skip to content

NGINX - Webserver, Load Balancer und Proxy

NGINX ist neben Apache einer der bekanntesten Webserver. Allerdings kann das Tool mehr als nur ein schlichter Webserver sein. Reverse Proxy, Load Balancer, Mail Proxy oder HTTP cache Server sind ein paar wenige Funktionen die Nginx beherrscht.

Ich möchte euch heute ein paar Beispiele zu einzelnen Funktionen zeigen. Den Anfang macht logischerweise die Installation. Als System verwende ich einen Ubuntu 20.04 LTS Server.

 

Nginx

 

Installation Nginx unter Ubuntu/Debian

Die Installation der frei verfügbaren Version (Die kommerzielle Variante nennt sich Nginx Plus) erfolgt über das Nginx Repository.

sudo wget https://nginx.org/keys/nginx_signing.key

sudo apt-key add nginx_signing.key

sudo nano /etc/apt/sources.list.d/nginx.list

  deb https://nginx.org/packages/mainline/ubuntu/ focal nginx
  deb-src https://nginx.org/packages/mainline/ubuntu/ focal nginx
              
sudo apt install nginx

sudo systemctl is-enabled nginx.service

sudo systemctl enable nginx

Nach der Installation erfolgt eine schnelle Kontrolle.

ss -ltn
ubuntu:~$ curl -I http://127.0.0.2

HTTP/1.1 200 OK
Server: nginx/1.19.6
Date: Thu, 17 Dec 2020 22:20:49 GMT
Content-Type: text/html
Content-Length: 612

Nginx selbst kompilieren

Es besteht auch die Möglichkeit, das Nginx Paket selbst zu kompilieren. Dies wird dann nötig, wenn Pakete benötigt werden, die in der Standardvariante nicht enthalten sind. Die war zum Beispiel bei der Verwendung von GeoIP oder LibreSSL mal bzw. ist noch so.

Mit dem folgenden Befehl können die installierten Module eingesehen werden.

Nginx –V

In der Standardinstallation sollte hier das Modul --add-dynamic-module=/build/nginx-5J5hor/nginx-1.18.0/debian/modules/http-geoip2 angezeigt werden. D.h. das eingangs erwähnte Geo IP Modul wird hier bereits geladen.

Einen eigenen Nginx Server unter Debian/Ubuntu einrichten

Nach einer erfolgreichen Installation zeigt Nginx eine Standardseite an. Diese kann gelöscht oder zusätzlich eine eigene virtuelle Seite angelegt werden. Auf einer IP können so mehrere Webseiten gehostet werden.

Folgende Struktur bietet sich unter Ubuntu an:

Konfiguration der einzelnen virtuellen Server.

/etc/nginx/sites-available/xyz

Momentan aktive Server wobei es sich hier um einen Symlink handelt.

/etc/nginx/sites-enabled/xyz

Schritt für Schritt heißt dies für einen Server welche auf Port 80 lauscht:

#config anlegen
touch /etc/nginx/sites-available/itrig

#config schreiben
nano /etc/nginx/sites-available/itrig

server {

        listen 80 default_server;    

        # Make site accessible from http://localhost/

        server_name localhost;
        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
        }
}

#aktiv setzen
ln -s /etc/nginx/sites-available/itrig /etc/nginx/sites-enabled/itrig

Konfiguration überprüfen

nginx –t

Neustart der Konfiguration mit

#lädt nur die neue Konfiguration
nginx –s reload

oder

sudo systemctl reload nginx


Nginx als Loadbalancer verwenden

Neben der reinen Webserverfunktion bietet NGINX die Möglichkeit den Server, als Loadbalancer zu betreiben. Da heißt der Server sorgt für Ausfallsicherheit bzw. Leistung von Webanwendungen, in dem er die Last verteilt. Vorstellen kann man sich dies wie einen Haupthändler, welcher Daten unter verteilt.

LoadbalancerNginx bietet mehrere Varianten an, wie diese Verteilung geschehen kann.

Round Robin

Das bekannteste dürfte das Round Robin Verfahren sein. Es wird eine Liste von Servern durchgearbeitet und die Last nach und nach verteilt. Ist die Liste zu Ende, fängt der Server wieder am Anfang an.

Im unteren Beispiel werden 3 Server in der Gruppe "itrigloadbalancer" zusammengefasst und der Webserver geht diese Liste nach und nach durch. Unterstützt werden die Protokolle HTTP, HTTPS, FastCGI, uwsgi, SCGI, memcached, und gRPC.

http {
    upstream itrigloadbalancer {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://itrig.de;
        }
    }
}

Least Connected

Eine weitere Lastverteilung ist das Least-Connected-Verfahren. Hier wird auf die aktiven Verbindungen der einzelnen Server geschaut. Der Server, welcher die geringste Anzahl an aktiven Verbindungen hat, bekommt die Anfrage zugeschanzt.

upstream intrigleastload {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

Session-Persistenz - IP Hash

Die dritte Möglichkeit Last zu verteilen, stellt das IP-Hash-Verfahren dar. Hier werden von den zugreifenden Client IPs Hash Werte erstellt. Anhand dieser Werte wird einem Client immer ein bestimmter Server zugewiesen. Damit erhält der Nutzer eine Session Persistenz, da Anfragen immer vom gleichen Server beantwortet werden.

Beim Round-Robin- oder Least-Connected-Load-Balancing kann jede nachfolgende Anfrage eines Clients potenziell auf einem anderen Servern ankommen.

upstream itrighash {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

Weighted load balancing

Alle Varianten lassen sich zusätzlich gewichten. So kann es vorkommen, dass ein Server eine bessere Hardware verbaut hat, als ein anderer. Mit Weighted load balancing lässt sich einzelnen Geräten mehr Last zuschieben.

upstream itrigmitgewicht {
        server srv1.example.com;
        server srv2.example.com weight=3;
        server srv3.example.com;
    }
upstream itrig {
    ip_hash;
    server srv1.example.com weight=2;
    server srv2.example.com;
    server srv3.example.com;
}

Mehr zu der Thematik unter load_balancing.


Nginx als Reverse Proxy verwenden

Den aufmerksamen Lesern dürfte aufgefallen sein, dass in einem Code Beispiel weiter oben eine Zeile mit "proxy_pass" vorhanden ist. Diese Zeile deutet darauf hin, dass NGINX als Reverse Proxy eingesetzt wird und ein Aufruf nicht direkt auf dem Server landet, sondern weitergeleitet wird.

location /webshop {
proxy_pass http://opencart.itrig.local;
}

location /landkarte {
proxy_pass http://192.168.100.99;
}

Es gibt verschiedene "Vorteile" für so eine Weiterleitung.

So kann der Nginx als HTTPS Endpunkt dienen und die Struktur dahinter kann unverschlüsselt agieren. Auch bietet NGINX die Möglichkeit als Reverse Proxy und als Load Balancer gleichzeitig zu arbeiten, die Details sind weiter oben zu lesen.

Weiter erlaubt der vorgeschaltete Server eine Caching Funktion, was zum schnelleren Ausliefern von Webseiten beitragen kann.

Hier ein Beispiel mit gesplittetem Cache aus der offiziellen NGINX Cache Dokumentation.

proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m
                 max_size=10g inactive=60m use_temp_path=off;
proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m
                 max_size=10g inactive=60m use_temp_path=off;

split_clients $request_uri $my_cache {
              50%          “my_cache_hdd1”;
              50%          “my_cache_hdd2”;
}

server {
    # ...
    location / {
        proxy_cache $my_cache;
        proxy_pass http://my_upstream;
    }
}

Das Thema Sicherheit spielt ebenso eine Rolle, da durch den vorgeschalteten Server, die Angriffsfläche kleiner gehalten wird.


NGINX mit Regex

Richtig interessant wird es, sobald die aufgerufene URL verschiedene Eigenschaften besitzt bzw. ein besonderes Verhalten zeigen sollte.

Diese Eigenschaften werden mit regulären Ausdrücken umgesetzt.

Hier sind ein paar Beispiele von regulären Ausdrücken für NGINX :

# Die URL ist durch * case insensitive
 location ~* /itrig/ {
    #...
    #...
    }

# Die URL ist case sensitive das ^ sorgt dafür das nur z.B. /itrig/logo.jpg gültig ist und nach dem ersten Match gestoppt wird.
 location ^~ /itrig/ {
    #...
    #...
    }

# Bilder anhand der Endung umleiten
 location ~ \.(gif|jpg|png)$ {
    root /data/images;
    }

# Unnötige Endungen aussperren (case insensitive)
 location ~* "\.(old|orig|original|php#|php~|php_bak|save|swo|aspx?|tpl|sh|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rdf)$" {
    deny all;
    }

# Einen Alias setzen
 location /_/static {
        alias /path/to/glory;
    }

# Rewrite einer URL,  "pfad" wird entfernt
    location /pfad {
        rewrite ^/pfad(.*)$ $1 break;
        proxy_pass http://splunk-api:8080;
    }

Es bietet sich immer an, eigene Befehle zu testen, bevor sie produktiv eingesetzt werden, denn neben Einschränkungen auf URLs kann ebenso Haus und Hof geöffnet werden.

Ein Regex Test sollte daher immer gemacht werden. Hier findet sich so ein Tool online regex.datahoarder.dev.

Das Tool kann jederzeit auf der eigenen Umgebung gehostet werden und ist auf Github zu finden.

Nginx_Regular_Expression_Tester

 

Installation einer aktuellen Go Version auf Ubuntu

Go ist eine Open-Source Programmiersprache, welche von Google 2009 entwickelt wurde. Die Sprache ist bei vielen Anwendungen beliebt, darunter Docker oder Kubernetes. 

Nun ist eine neue Version 1.13 erschienen, welche neben Sicherheitsfeatures in den Standardeinstellungen auf TLS 1.3 setzt.
Module welche von den Go Servern geladen werden, sind nun durch eine Checksummenprüfung abgesichert.

Weitere Neuerungen verrät das Changelog

Doch wie kommt Go überhaupt auf das eigene System?

golang

Installation von Golang auf Ubuntu

Als erstes möchte ich die manuelle Installation betrachten.

Auf der Downloadseite muss zunächst nach der offiziellen Version gesucht werden.

wget https://dl.google.com/go/go1.13.linux-amd64.tar.gz

Nach dem Download sollte der Hashwert überprüft werden.

sha256sum go1.13.linux-amd64.tar.gz

    68a2297eb099d1a76097905a2ce334e3155004ec08cdea85f24527be3c48e856  go1.13.linux-amd64.tar.gz

Danach folgt das Entpacken, wobei ihr beim Pfad natürlich auch einen anderen verwenden könnt.

sudo tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz

Nun den PATH anpassen und folgende Zeile unten anfügen.

sudo nano $HOME/.profile

    export PATH=$PATH:/usr/local/go/bin

Die neue PATH Variablen laden.

source ~/.profile

go-installation

Nun kann der finale Test erfolgen, wenn alles klappt solltet ihr folgendes Ergebnis sehen.

go

Go is a tool for managing Go source code.

Usage:

        go command [arguments]

The commands are:

        build       compile packages and dependencies
        clean       remove object files and cached files
        doc         show documentation for package or symbol
        env         print Go environment information
        bug         start a bug report
        fix         update packages to use new APIs
        fmt         gofmt (reformat) package sources
        generate    generate Go files by processing source
        get         download and install packages and dependencies
        install     compile and install packages and dependencies
        list        list packages
        run         compile and run Go program
        test        test packages
        tool        run specified go tool
        version     print Go version
        vet         report likely mistakes in packages

Use "go help [command]" for more information about a command.

 

Installation von Go via apt auf Ubuntu

Golang kann unter Ubuntu ebenfalls über den Paketmanager installiert werden. Dazu muss zunächst ein extra Repository hinzugefügt werden.

sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
sudo apt install golang-go

Jetzt könnt ihr euch mit Go austoben.

Im Netz findet ihr jede Menge Beispiele was damit möglich ist.
Zum Beispiel hier oder hier.

 

Ein eigenes Programm ist schnell geschrieben, dazu einfach folgende Schritte ausführen.

Ein neues Verzeichnis anlegen und eine erste Datei anlegen.

mkdir -p /home/user/hello
nano /home/user/hello/helloworld.go


        package main

        import "fmt"

             func main() {
                  fmt.Printf("Hello Go World \n")
             }

Datei builden und ausführen.

cd /home/user/hello

go build
./hello

    Hello Go World

Praktischerweise gibt es eine Online Spielwiese, die zum Probieren einlädt.

Es muss somit zunächst nicht zwingend auf der Kommandozeile gearbeitet werden.

The_Go_Playground

PS. Natürlich kann Golang auch über die vorhandenen Ubuntu Pakete mit sudo apt install golang installiert werden, allerdings erhaltet ihr hier nicht die aktuellste Version.

 

Linux Server auf Botnet Windigo testen

Der Sicherheitsspezialist ESET hat in dieser Woche über die Operation Windigo berichtet. Angeblich wurden seit 2011 mehr als 10 000 linuxbasierte Server von diesem Botnet befallen.

Über diverse Rootkits (Linux/Ebury, Linux/Cdorked, Linux/Onimiki oder Perl/Calfbot) verschafft sich das Botnet Zugriff auf SSH Zugangsdaten oder DNS.

Zusätzlich werden OpenSSH Dateien manipuliert (ssh, sshd, ssh-add). Bei neueren Versionen (Stand Februar 2014) des Rootkits wird angeblich die libkeyutils.so abgehändert und dadurch um einige KB größer.

Ein Befall durch das Botnetz lässt sich mit einem Konsolenbefehl überprüfen:

ssh -G 2>&1 | grep -e illegal -e unknown > /dev/null && echo "System sauber" || echo "System infiziert"

Sollte das System befallen sein, empfehle ich den Server komplett neu aufzusetzen, da durch die offenen Zugangsdaten zusätzliche Änderungen am System vorgenommen worden sein könnten.

linux-logo

Android 4.0 Ice Cream Sandwich und andere Versionen auf dem PC nutzen

Wer sich für Android interessiert, muss nicht zwingend ein Smartphone besitzen. Es gibt verschieden Möglichkeiten, um ein Androidsystem am PC zu booten.

Eine davon wäre eine Entwicklungsumgebung, beispielsweise mit Eclipse und dem Android SDK, welches inzwischen in Version 17 veröffentlicht wurde und nun offiziell die x86 Architektur unterstützt. Für Entwickler ist das sicherlich eine gute Variante, um selbst erstellte Apps im laufenden Betrieb zu testen. Leider ist diese Form der Nutzung etwas behäbig und träge.

Einfacher und schneller geht es mit den freien ISOs von android-x86, dort können Images von Android 2.3, 2.3, 3.2 und dem aktuellen 4.0 Ice Cream Sandwich heruntergeladen und installiert werden.

Bevor es mit der Installation richtig los geht, muss eine virtuelle Maschine aufgesetzt werden, wahlweise mit VirtualBox  oder VMWare. Ich habe mich für VirtualBox entschieden.

Virtuelle Maschine für Android erstellen

Achtung: Bei Android 4 können wir uns diesen Schritt sparen

  • neue virtuelle Maschine
  • Name: Android
  • Betriebssystem: Linux
  • Version: Other Linux
  • Größe Hauptspeicher: 256 MB besser 512MB
  • Festplatte: bootfähig 2GB
  • Installationsmedium: android-x86-2.2-generic.iso
    • Achtung: Alle anderen Versionen der Seite  android-x68 unterstützen kein Netzwerk
  • Neustart

NeuevirtuelleMaschineerstellen

Android 2.2 oder 4 (Ice Cream Sandwich) auf virtueller Maschine installieren

Für Android 4 kann ein fertiges VirtualBox Image verwendet werden, damit fällt die erste Konfiguration der virtuellen Maschine flach. Nützlicherweise bringt dieses Image USB Unterstützung mit.

Android-4

  • Create/Modify Partitions
  • Neue Partition erstellen (new)
  • Primäre Partition erstellen (primary)

Android-4-2

  • Größe belassen
  • Bootfähig machen (bootable)
  • Auswahl mit "Write" und "yes"bestätigen (Achtung z=y)
  • Quit

Android-4-Installation
  • Festplatte (sda1) formatieren
  • Ext3 auswählen
  • Mit "yes" bestätigen
  • Bootloader "GRUB" installieren
  • System Directory read/write fähig machen
  • Installation abschließen
  • ISO aus CD Laufwerk entfernen
  • Android starten

Android-4-start

Die Maus ist nicht zu sehen bzw. nicht integriert

  • Host Taste(Strg-Rechts) + I drücken oder über Maschine\Mauszeiger Integration deaktivieren

Wichtige Tastatur Befehle

  • Alt + F1: Console
  • Alt + F7: Oberfläche
  • Esc: Eins zurück

Netzwerk funktioniert nicht

  • Beide Androidsysteme unterstützen nur DHCP
  • VirtualBox oder VMWare auf Bridge Modus umstellen

Android Market bzw. Google Play funktioniert nicht

Diese Manko muss aufgrund fehlender Lizenzen leider in Kauf genommen werden. Wer den Market verwenden möchte, muss auf das Android SDK in Verbindung mit ein paar Tricks zurückgreifen. Alternativen wie AndroidPit funktionieren leider auch nicht richtig. Beim Froyo Image (Version 2.2) wird zusätzlich ein alternativer App Store angeboten.

Frühjahrsputz im Firefox - Lesezeichen auf Gültigkeit, leere Ordner oder Duplikate überprüfen

Mit der Zeit sammeln sich im Browser immer mehr Lesezeichen an, auch in der Zeit von Liken, Sharen, Plussen und Pinnen sind diese nicht wegzudenken. Je mehr man von diesen kleinen Helferlein hinterlegt, desto schlechter wird die Übersicht, da hilft die beste Ordnerstruktur nichts. 

Hauptproblem dürfte bei vielen Bookmark Sammlungen die Aktualität sein. Existiert die Adresse noch, erscheint eine leere Seite oder sind einige Ordner in der eigenen Struktur eventuell leer.

check-places

All diese Fragen beantwortet CheckPlaces. Das Firefox Add-on überprüft die kompletten Favoriten und gibt ein ausführliches Ergebnis aus. Im Vorfeld kann die Suchfunktion auf die eigenen Belange eingeschränkt werden:

  • Auf doppelte Lesezeichen prüfen
  • Leere Ordner suchen 
  • Check Places Datenbank prüfen
  • Datenbank komprimieren
  • Prüfen ob Seite existiert
  • Überprüfungsdauer

check-places-erg

In der Zusammenfassung können alle gefundenen Probleme noch einmal überprüft und bei Bedarf gelöscht werden. Dem Frühjahrsputz steht somit Nichts mehr im Wege