nginx proxy_pass mit Unterordner

11

ok, diese aufgabe sollte einfach sein, aber ich kann sie einfach nicht zum arbeiten bringen. Ich möchte einen Unterordner nach meinem Domainnamen (tatsächlich nach der IP dieses Domainnamens) haben, der zu einem bestimmten Port auf demselben Server umleitet. Im Wesentlichen möchte ich nicht mehr viele Ports verwenden müssen.

Hier ist meine Nginx-Konfiguration dafür

server {
    listen 80;

    index index.html index.htm index.nginx-debian.html index.php;

    server_name aaa.bbb.ccc.ddd;

    location ^~ /app2 {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://aaa.bbb.ccc.ddd:8001;
    }
}

Beim Zugriff auf aaa.bbb.ccc.ddd / app2 möchte ich, dass dies in http: //aaa.bbb.ccc.ddd: 8001 aufgelöst wird .

Dies kann möglicherweise so kompliziert sein. Was fehlt mir hier?

Vielen Dank, Pat

pAt84
quelle
Meinen Sie "Weiterleitungen zu einem Port" oder "Proxys zu einem Port"? Sie sind ganz anders. Ihre Frage ist unklar. Vielleicht können Sie Ihren Anwendungsfall einschließlich des Clients erweitern.
Tim

Antworten:

12

Da Sie dies als Reverse-Proxy-Frage markiert haben, meine ich, dass Sie die Anfrage als Proxy verwenden möchten, damit der Benutzer nur die http://aaa.bbb.ccc.ddd/app2URL in seinem Browser sieht .

Sie können Ihren locationBlock folgendermaßen ändern :

location ~/app2(.*)$ {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://aaa.bbb.ccc.ddd:8001$1;
}

Hier erfassen wir den URI-Teil nach /app2to $1variable und verwenden ihn in der proxy_passDirektive.

Tero Kilkanen
quelle
Vielen Dank. Das hat den Trick gemacht. aaa.bbb.ccc.ddd: 8001 wird nur teilweise angezeigt. Es gibt Websockets auf dieser Seite und jede Menge Java-Skript. Ich denke, das liegt daran, dass ich den Port als Proxy verwende und ihn nicht wie oben erwähnt weiterleitet. Ist dies tatsächlich nur mit Nginx möglich?
pAt84
Wie sehen die URLs von Ressourcen auf der aaa.bbb.ccc.ddd:8001Seite aus? Höchstwahrscheinlich müssen Sie die URLs korrigieren, um das /app2Teil zu enthalten .
Tero Kilkanen
Es ist wirklich nur ein Websocket (zeigt einige Radardaten, Automotive ...). Der Quellcode enthält kein Zeichen von "app2".
pAt84
Hm ok ja. Zum Aufrufen des Websockets verwendet JS "var ws = new WebSocket ('ws: //' + location.host + '/ ws');". location.host vermisst jetzt die Portnummer, wodurch das Ganze nicht mehr funktioniert.
pAt84
Ok, es scheint also, dass ich nach dem Aufruf von aaa.bbb.ccc.ddd / app2 aaa.bbb.ccc.ddd: 8001 intern verwenden muss. Eine andere Möglichkeit besteht darin, das gesamte Java-Skript zu ändern. Der Grund dafür ist, dass ich nginx verwenden möchte, um mir eine "Ein-Port-Lösung" zu geben, aber nachdem ich darauf zugegriffen habe (z. B. über http // aaa.bbb.ccc.ddd / app2), würde ich es intern brauchen, um loszulegen zurück zu aaa.bbb.ccc.ddd: 8001. Ist das möglich?
pAt84