NGINX LoadBalancing

Ursprünglich habe ich haproxy eingesetzt, aber durch meinen Spieltrieb für den Versuch mit dem LoadBalancing von 2 piHoles, Port 53 UDP, was mit haproxy nicht funktioniert, hat mich dazu bewogen, nginx für den Zweck genauer unter die Lupe zu nehmen. Und es war erschreckend leichter als ich dachte.

Damit euer nginx immer aktuell bleibt, empfiehlt sich das Repository, welches von nginx selbst angeboten wird. Bei CentOS erstellen wir die Datei /etc/yum.repos.d/nginx.repo und füllen sie mit folgendem Inhalt:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key

Danach aktivieren wir es nur noch mit yum-config-manager --enable nginx-mainline und schon können wir ihn mit yum install nginx installieren.

Unter Debian ist es ein wenig aufwendiger. Wir brauchen erst mal apt install curl gnupg2 ca-certificates lsb-release, die bei jeder Debian Installation mit sicherheit schon installiert sind. Der Stable Branche sollte für die Zwecke ausreichend sein:

echo "deb http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Wer lieber aktuellere Versionen bevorzugt, kann auch den Mainline Branch hinzufügen:

echo "deb http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Damit apt jetzt aber auch mit dem neuen Repository umgehen kann, müssen wir uns mithilfe von curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add - den GPG Schlüssel holen. Erst danach können wir unsere lokalen Repositoryinformationen via apt update aktualisieren und apt install nginx installieren.

Die Konfiguration danach ist simpel. Wer noch einen anderen Webserver auf Port 80 und 443 laufen hat, sollte die nginx Konfiguration unter /etc/nginx/conf.d löschen oder anpassen. Wenn nginx für sonst nichts anderes genutzt wird, kann ebenfalls alles in dem Verzeichnis löschen.

An das Ende von /etc/nginx/nginx.conf hab ich dann folgendes gepackt:

stream {
    log_format onion '$remote_addr [$time_local] '
                     'TOR:$server_port/$protocol $status "$upstream_addr" '
                     '"$upstream_bytes_sent" "$upstream_bytes_received" ';

    include /etc/nginx/streams.d/*.conf;
}

Danach brauchen wir nur noch nach einem mkdir -p /etc/nginx/streams.d/ die Datei /etc/nginx/streams.d/tor.conf an zu legen. Da kommt dann folgender Inhalt rein:

limit_conn_zone $binary_remote_addr zone=addr:1m;

upstream backends_onionnet {
    zone    onionnet 256k;
    least_conn;

    server 192.168.22.4:9050   weight=50;
    server 192.168.22.3:9050   weight=50;
}

server {
    listen 185.244.192.119:7670; # Hier natürlich eure IP Adresse rein
    listen 192.168.22.2:7670;    # Wenn ihr z.B. euer Smartphone mit im Wireguard hab
    listen 127.0.0.1:7670;       # Gewohnheit
    listen [2a03:4000:27:7b:dead:beef:feae:5]:7670; # Vorrausgesetzt, euer Server kann IPv6. Natürlich dann mit eurer ersetzen!

    limit_conn addr 50;
    limit_conn_log_level info;
    proxy_download_rate 625k;
    proxy_upload_rate   125k;

    access_log /var/log/nginx/stream-access.log onion;
    proxy_pass backends_onionnet;
}