Frage Nginx Reverse Proxying zu Node.js mit Rewrite


Ich habe mehrere Apps, die hinter einem Nginx-Reverse-Proxy laufen, von denen einer ein Node-Server mit Express.js ist. Ich bin stellvertretend domain.com/demo/app/<path> zu localhost:7003/<path> mit dieser Nginx-Konfiguration:

http {

    ...

    server {

        listen 80;
        server_name domain.com;

        ...

        location /demo/app {

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Scheme $scheme;

            rewrite ^/demo/app/?(.*) /$1 break;
            proxy_pass http://localhost:7003;
        }

        ...
    }
}

Das funktioniert super und app empfängt Anfragen, als ob es verwurzelt wäre /. Das Problem ist app handhabt seine eigenen statischen Dateien und macht möglicherweise Anfragen für Routen wie css/app.css oder images/image.jpg. Aber wegen des Reverse-Proxy existieren diese tatsächlich bei /demo/app/css/app.css und /demo/app/images/image.jpg beziehungsweise.

Ich habe das gelöst, indem ich Nginx dazu gebracht habe, einen benutzerdefinierten Header an Node zu übergeben, der den Root-Pfad angibt, den der Node-Server den URLs aller nachfolgenden Anforderungen voranstellt. Aber jetzt ist mein Code mit diesen Stammpfadzeichenfolgen übersät. Zum Beispiel ein Teil meiner Backend-Vorlagen:

link(rel='stylesheet', href="#{basePath}/css/base.css")
link(rel='stylesheet', href="#{basePath}/css/skeleton.css")
link(rel='stylesheet', href="#{basePath}/css/layout.css")

Was ist eine elegantere Art, damit umzugehen? Gibt es keine Möglichkeit, Nginx dazu zu bringen, Anfragen von einem Upstream-Server zu erkennen und automatisch an diesen Server weiterzuleiten?


13
2017-12-26 02:34


Ursprung


Antworten:


Ich habe nginx statische Dateien bereitstellen lassen, ohne diese Anforderungen an Knoten zu übergeben, indem ich der nginx-Konfigurationsdatei der Anwendung (die in nginx.conf enthalten ist) eine location-Anweisung hinzufüge:

location ~ /(img|js)/ {
    rewrite ^(.*)$ /public/$1 break;
}

location / {
    proxy_pass http://localhost:3000/;
    ...
}

Falls eine Anfrage an / img oder / js Verzeichnis kommt, bedient nginx Dateien aus / public / img oder / public / js Verzeichnis. Alle anderen Anfragen werden an Knoten weitergeleitet.

Sie können weitere Verzeichnisse hinzufügen, wenn Sie benötigen (wie / css oder / views, wenn Sie dort Vorlagen speichern, die Sie sowohl im Knoten als auch im Browser verwenden möchten) und eine Verzeichnisstruktur in diesen Verzeichnissen haben, nginx fügt ihnen einfach / public vor ruft Dateien von dort ab, ohne dass Ihre Knoten-App davon weiß.


9
2017-12-26 14:02