Nginx Reverse Proxy mit dynamischem Zielhost


Für meine Statusseite https://status.trashserver.net setze ich aus verschiedenen Gründen einen eigenen Reverse Proxy ein, um auf der Übersichtsseite von Uptimerobot.com HTTPS TLS-Verschlüsselung anbieten zu können. Nach der Einrichtung meines Nginx Webproxies war die Statusseite jedoch regelmäßig nicht mehr erreichbar (“502 - Bad Gateway”). Erst nach einem Neustart von Nginx konnte die Seite wieder aufgerufen werden. Die Ursache für die regelmäßigen Unterbrechungen war eine dynamische IP-Adresse hinter dem Zielhost “stats.uptimerobot.com”. Mit folgender, klassischer Konfiguration wird der Zielhost nur ein Mal beim Start von Nginx aufgelöst:

server {
    server_name status.trashserver.net;

    [...]

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass https://stats.uptimerobot.com;
        proxy_redirect off;
    }

    [...]
}

Wenn die zum Start ermittelte IP-Adresse sich ändert und nicht mehr auf den erwarteten Host zeigt, kommt es zum beschriebenen Fehler. Ich habe also nach einer Möglichkeit gesucht, Nginx dazu zu zwingen, den Hostnamen regelmäßig neu aufzulösen. Bei tenzer.dk bin ich fündig geworden: Setzt man den Upstream in Form einer Variablen, und gibt einen Resolver an, verhält sich Nginx wie gewünscht und kommt auch mit dynamischen IP-Adressen zurecht:

server {
    server_name status.trashserver.net;

    [...]

    resolver 192.168.2.1;
    set $upstream1 https://stats.uptimerobot.com/rk3R0IDJq/;
    set $upstream2 https://stats.uptimerobot.com;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass $upstream1;
        proxy_redirect off;
    }

    location ~ ^/(.+) {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass $upstream2;
        proxy_redirect off;
    }
}