Software Frage Reverse Proxy (Nginx) – ich bekomme URL Rewriting nicht hin.

Dieses Thema im Forum "Tech & FAQ Forum" wurde erstellt von mikado, 10 Mai 2018.

  1. mikado

    mikado ɯ ᴉ ʞ ɐ p o

    Registriert seit:
    6 Januar 2003
    Beiträge:
    1.897
    Hi,

    ich bekomme grad (neue) graue Haare. Ich habe hier einen NUC mit einem I3 als Server am laufen. Den habe ich mit Ubuntu 16.04.4 LTS und relativ minimalem setup und Docker am laufen.

    Da rennen jetzt verschiedene Images, hauptsächlich OpenHAB. Zur Überwachung habe ich ein Monitorix Image draufgetan.

    docker run --name monitorix -d -p 8082:8080 geiseri/monitorix

    Läuft prächtig auf seinem 8082’er port.

    Unter anderem läuft auch ein NGINX server, der mir als reverse Proxy dient.

    Läuft prima. Ist auch von der Fritzbox per hhtps nach draussen offen; mit basic auth und SSL. Geht soweit alles. Openhab, shellinabox und so bekomme ich auch sauber raus. Das prinzipielle Risiko ist mir klar, dank IPV6 bekomme ich aber kein VPN hin. Leider.

    Läuft auch alles gut, nur das monitorix zickt.

    Code:
      location /monitorix/ {
      proxy_pass  http://localhost:8082/;
      proxy_buffering  off;
      proxy_set_header Host  $http_host;
      proxy_set_header X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto  $scheme;
      }
    

    Das Problem: http://openhab/monitorix/ kommt zurück mit einer Seite. In deren Quelltext steht aber z.B.

    Code:
    <img src="/logo_top.png" border="0">
    oder
    Code:
    <form action="/monitorix-cgi/monitorix.cgi" method="get">
    Also alles auf root referenziert; nicht auf monitorix. Bild ist also brocken; Form geht ins 401.

    Was ich versucht habe:
    • proxy_redirect http://localhost:8082/ /monitorix/;
    • proxy_redirect default;
    • rewrite ^(.*)/monitorix-cgi/(.*)$ $1/monitorix/monitorix-cgi/$2 last;
    Ich meine ja alles sollte gehen; letzteres zumindest für die Form. Tut es aber nicht. Ausprobiert hab ich schon so einiges, nu stehe ich total auf dem Schlauch.

    Monitorix ist jetzt nicht wichtig, es gibt andere tools. Irgendwie kann man monitorix auch eine andere URL intern beibiegen, da müsste ich aber ein neues Image bauen.

    Ich bin halt der Meinung, meine Versuche müssten eigentlich funktionieren. Hab ich was ganz blödes gemacht? Wie debuggt man sowas?

    Gruß
    Mikado

    Nachtrag:

    auch bei
    Code:
            ##
            # Logging Settings
            ##
    
            access_log /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log debug;
    
    bekomme ich beim obigen request nur ein müdes
    Code:
    192.168.178.37 - - [10/May/2018:19:31:56 +0000] "GET /monitorix/ HTTP/1.1" 200 9                            68 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, lik                            e Gecko) Chrome/66.0.3359.139 Safari/537.36"
    192.168.178.37 - - [10/May/2018:19:31:56 +0000] "GET /logo_top.png HTTP/1.1" 404                              274 "http://openhab/monitorix/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Appl                            eWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
    
    Zuletzt bearbeitet: 10 Mai 2018
  2. mikado

    mikado ɯ ᴉ ʞ ɐ p o

    Registriert seit:
    6 Januar 2003
    Beiträge:
    1.897
    Sub_filter ist wohl das richtige tool für das was ich will. Rewrite modifiziert nur request URLs, rederict nur Header urls.
  3. mikado

    mikado ɯ ᴉ ʞ ɐ p o

    Registriert seit:
    6 Januar 2003
    Beiträge:
    1.897
    So, meine Lösung:
    Code:
       
       location /monitorix/ {
            proxy_pass                              http://localhost:8082/;
            proxy_redirect default;
            sub_filter_once off;
            sub_filter '/monitorix-cgi/'            '/monitorix/monitorix-cgi/';
            sub_filter '/imgs/'                    '/monitorix/imgs/';
            sub_filter 'monitorixico.png'          'monitorix/monitorixico.png';
            sub_filter 'logo_bot.png'              'monitorix/logo_bot.png';
            sub_filter 'logo_top.png'              'monitorix/logo_top.png';
            proxy_buffering                        off;
            proxy_set_header Host                  $http_host;
            proxy_set_header X-Real-IP              $remote_addr;
            proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto      $scheme;
        }
    
    leider kann der blöde sub_filter keine regexp.

    Tipps und Hinweise für mehr Eleganz sind gerne wilkommen.
  4. jjk

    jjk Neues Mitglied

    Registriert seit:
    15 Mai 2018
    Beiträge:
    3
    Hattest Du initial versucht den / bei der location definition wegzulassen. Nginx reagiert da sehr empfindlich, weil die location nur matched wenn der Request diesen auch enthält
    mikado sagt Danke.
  5. mikado

    mikado ɯ ᴉ ʞ ɐ p o

    Registriert seit:
    6 Januar 2003
    Beiträge:
    1.897
    Matchen tuts ja, nur absolut (per/) referenzierter content geht halt nicht...
  6. jjk

    jjk Neues Mitglied

    Registriert seit:
    15 Mai 2018
    Beiträge:
    3
    Gibt es denn noch andere location Blöcke? Wenn es einen anderen gäbe, der eine RegExp benutzt, würde der genommen. Also Du könntest

    Code:
    location ^~ /monitorix/ { ... }
    benutzen, wenn dann die URL matched würde nginx nicht weiter suchen ...
    mikado sagt Danke.
  7. mikado

    mikado ɯ ᴉ ʞ ɐ p o

    Registriert seit:
    6 Januar 2003
    Beiträge:
    1.897
    cool. was gelernt. mach ich. Ja, hätte passieren können.