nginx config mit Node-Applikationen

ger.ruler

Ensign
Registriert
Nov. 2007
Beiträge
254
Moin,

ich habe ein kleines Problem. Ich möchte 2 Nodejs-Apps, die ich mit pm2 manage, über nginx laufen lassen. Die Idee dahinter ist, auf Ports in den FrontEnd-Apps zu verzichten und die Endpunkte über eine Subdomain anzusprechen. Ich bin diesem hier ab Step3 gefolgt und die Basis-Route funktioniert auch, allerdings wird der Endpunkt nicht aufgelöst.
https://www.digitalocean.com/commun...js-application-for-production-on-ubuntu-22-04

Aus Sicht der Apps ist alles i.O. . Habe zum Testen die Ports in ufw freigegeben und die Apps lassen sich über direktes Ansprechen finden.

Ubuntu 22.04 lxc
nginx
nodejs v16.10

Lt. der Beschreibung lassen sich 2 Serverblocks in derselben File konfigurieren, mein config ist gelinked und sieht so aus:
Code:
server {
    listen 80;
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://0.0.0.0:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    
    location /endpoint {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://0.0.0.0:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Funktioniert das mit dem Reverse-Proxy nicht so, wie ich mir das gedacht habe ^^ ?
 
Du hast zwei Server definiert, die auf Port 80 hören. Wenn der erste Server in deiner NGINX Config Port 80 allokiert, dann kann ja nicht noch ein zweiter auf den Port hören, da der Port dann schon geblockt ist.
Zieh am besten den "location /endpoint" Eintrag in den ersten Server und lösche danach den zweiten Server. Dann sollte es gehen :)
 
sry, copy paste Fehler aus der falschen Datei :D
1665645321620.png

Ergänzung ()

1665645387425.png
 
Okay.
Eine Sache noch vorweg: Du meintest du möchtest gerne Subdomains einrichten, das sind aber keine Subdomains sondern Paths oder "Subpaths". (siehe hier)

Also ich nehme mal an, dass deine Node.JS Apps nicht unter der IP 0.0.0.0, sondern unter 127.0.0.1 oder localhost laufen. Schau mal, was du entweder in deiner Konfiguration stehen hast, wo du die App startest oder was dein Framework per Default als IP Adresse nimmt.

Normalerweise setzt man auch die IP Addresse des proxy_pass auf 127.0.0.1 und lässt die App auf 127.0.0.1 hören, so vermeidest du, dass von außen, also an deinem NGINX vorbei, auf die Apps zugegriffen werden kann.
 
Die ip in den Apps habe ich manuell auf 0.0.0.0 angepasst, ich hatte vorher das Problem, dass die Nodes nicht extern erreichbar waren, trotz Portfreigabe. Nach etwas Research hatte ich gelesen, dass unter Ubuntu Nodejs mit localhost nicht funktioniert.
 
Wenn du jede App unter einer eigenen Subdomain erreichen willst (also z.B. app1.meinedomain.de und app2.meinedomain.de), dann einen eigenen Serverblock mit passender server_name Direktive pro App anlegen. Für nginx können beliebig viele Server-Blöcke auf demselben Port lauschen, solange die Namen via server_name eindeutig sind.
Funktioniert natürlich nur, wenn auch ein passender "Host"-Header in den http-Anfragen mitgeliefert wird, was aber jeder Browser automatisch erledigt.

Siehe auch: http://nginx.org/en/docs/http/server_names.html

Via "location" definierst du nur einen Pfad innerhalb eines Servers, auf den er "speziell" reagieren soll. Wäre daher gut, wenn du nochmal genau beschreibst, was du erreichen willst. Am besten mit konkreten Beispieladressen und der jeweiligen Zielapp.
 
Deine NGINX Config scheint ja wunderbar zu funktionieren, starte nginx doch mal und ruf die logs mal ab und mach dann mal ein paar Requests gegen die eine bzw. die andere App.
Kopiere dann bitte mal die Logs hier rein.

Für die Logs kannst du folgendes nutzen:
Code:
journalctl -efx -u nginx
 
KillerCow schrieb:
Wenn du jede App unter einer eigenen Subdomain erreichen willst (also z.B. app1.meinedomain.de und app2.meinedomain.de), dann einen eigenen Serverblock mit passender server_name Direktive pro App anlegen. Für nginx können beliebig viele Server-Blöcke auf demselben Port lauschen, solange die Namen via server_name eindeutig sind.
Funktioniert natürlich nur, wenn auch ein passender "Host"-Header in den http-Anfragen mitgeliefert wird, was aber jeder Browser automatisch erledigt.

Siehe auch: http://nginx.org/en/docs/http/server_names.html

Via "location" definierst du nur einen Pfad innerhalb eines Servers, auf den er "speziell" reagieren soll. Wäre daher gut, wenn du nochmal genau beschreibst, was du erreichen willst. Am besten mit konkreten Beispieladressen und der jeweiligen Zielapp.
Ja, wie @bykof erwähnt hat, möchte ich pfade nutzen ^^
also / -> nodeApp1 3000
und /endpoint -> nodeApp2 3001

Richtige Subdomains wäre auch toll, da werde ich mich aber irgendwann später mal hinarbeiten :)
Ergänzung ()

1665648408566.png

1665648429848.png

1665648586949.png

1665648619789.png


Logs sind aber irgendwie keine da :D ? Ich glaube du hast Recht, da läuft irgendwie nichts ?

Oct 13 08:09:22 frontend-server systemd[1]: Started A high performance web server and a reverse proxy server.
-- Subject: A start job for unit nginx.service has finished successfully
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
--
-- A start job for unit nginx.service has finished successfully.
--
-- The job identifier is 3844.
 

Anhänge

  • 1665648614966.png
    1665648614966.png
    4,9 KB · Aufrufe: 165
Zuletzt bearbeitet:
ger.ruler schrieb:
Richtige Subdomains wäre auch toll, da werde ich mich aber irgendwann später mal hinarbeiten :)
Das wäre gar nicht so schwer. Müsste ca. so funktionieren:

Code:
# Config App1
server {
   listen 80;

   server_name app1.meineDomain.de;

   location / {
        proxy_pass https://127.0.0.1:3000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
   }
}

# Config App1
server {
   listen 80;

   server_name app2.meineDomain.de;

   location / {
        proxy_pass https://127.0.0.1:3001;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
   }
}

Brauchst entsprechende DNS-Einträge mit app1.meineDomain.de und app2.meineDomain.de die auf nginx verweisen. Wenn du die Domain im Besitz hast, und die Nameserver bei einem Anbieter liegen, bei dem es eine API für DNS gibt (z.B.) Cloudflare, ist es auch kinderleicht ein Zertifikat zu kriegen und https zu nutzen.
 
  • Gefällt mir
Reaktionen: netzgestaltung und bykof
ger.ruler schrieb:
Ja, wie @bykof erwähnt hat, möchte ich pfade nutzen ^^
also / -> nodeApp1 3000
und /endpoint -> nodeApp2 3001

Richtige Subdomains wäre auch toll, da werde ich mich aber irgendwann später mal hinarbeiten :)
Ergänzung ()

Anhang anzeigen 1269880
Anhang anzeigen 1269881
Anhang anzeigen 1269883
Anhang anzeigen 1269885

Logs sind aber irgendwie keine da :D ? Ich glaube du hast Recht, da läuft irgendwie nichts ?

Oct 13 08:09:22 frontend-server systemd[1]: Started A high performance web server and a reverse proxy server.
-- Subject: A start job for unit nginx.service has finished successfully
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
--
-- A start job for unit nginx.service has finished successfully.
--
-- The job identifier is 3844.

Node App 1 funktioniert ja wie gewollt.
Bei der zweiten Node App sieht man, dass der versucht den /endpoint path weiterzureichen. Dazu müsstest du in der nginx.config ein
Code:
proxy_pass https://127.0.0.1:3001/;
einrichten. Entscheidend ist das / am Ende.
Quelle: https://serverfault.com/questions/562756/how-to-remove-the-path-with-an-nginx-proxy-pass
 
kamanu schrieb:
Brauchst entsprechende DNS-Einträge mit app1.meineDomain.de und app2.meineDomain.de die auf nginx verweisen. Wenn du die Domain im Besitz hast, und die Nameserver bei einem Anbieter liegen, bei dem es eine API für DNS gibt (z.B.) Cloudflare, ist es auch kinderleicht ein Zertifikat zu kriegen und https zu nutzen.
Achso, das ganze soll rein netzwerkintern laufen ^^
Ergänzung ()

bykof schrieb:
Node App 1 funktioniert ja wie gewollt.
Bei der zweiten Node App sieht man, dass der versucht den /endpoint path weiterzureichen. Dazu müsstest du in der nginx.config ein
Code:
proxy_pass https://127.0.0.1:3001/;
einrichten. Entscheidend ist das / am Ende.
Quelle: https://serverfault.com/questions/562756/how-to-remove-the-path-with-an-nginx-proxy-pass
Echt jetzt.... ich bin kurz davor aus dem Fenster zu springen..... 2 Tage verschenkt wegen einem behinderten Slash :/

btw: daran lags
 
  • Gefällt mir
Reaktionen: kamanu und bykof
ger.ruler schrieb:
Achso, das ganze soll rein netzwerkintern laufen ^^
Ergänzung ()


Echt jetzt.... ich bin kurz davor aus dem Fenster zu springen..... 2 Tage verschenkt wegen einem behinderten Slash :/

btw: daran lags
:D freut mich, dass es geklappt hat!
Die zwei Tage waren gut investiert, nur so lernt man es richtig ^^
 
  • Gefällt mir
Reaktionen: s1ave77
bykof schrieb:
Die zwei Tage waren gut investiert, nur so lernt man es richtig ^^
Naja, nach einem Tag fängt man damit an, stumpf configs zu kopieren von angeblichen out of the box tutorials weil es einen aufregt xD ..... Aber immerhin ist jetzt nochmal das Feingespür für solche Syntaxfehler geschärft worden ^^

Danke :)
 
KillerCow schrieb:
Aber ja, der nginx ist an einigen Stellen etwas speziell... daran gewöhnt man sich aber schnell :D
xD das ist das Problem, wenn man auto lint gewohnt ist und sich über semikolon, slash und quotes kaum mehr Sorgen macht ^^.....
 
Der Slash ist ja nicht per se falsch, er verändert nur das Verhalten, wie nginx die Anfrage weiterleitet. Da kann dir kein Checktool der Welt helfen, weil das ja nicht weiß, was du da genau erreichen willst ;)

Immer diese verwöhnten Entwickler... :P
 
ger.ruler schrieb:
Naja, nach einem Tag fängt man damit an, stumpf configs zu kopieren von angeblichen out of the box tutorials weil es einen aufregt
Das Problem an vorgeschriebenen Config und Tutorials ist halt, dass die selten genau für den eigenen Anwendungsfall ausgerichtet sind oder eben wichtige Details wie den / am Ende nicht erwähnen/erklären.

Also selbst bei Copy&Paste und Tutorials sollte man nebenbei einen Blick in die offizielle Doku werfen, um die Sachen auch zu verstehen (und anpassen zu können).
 
  • Gefällt mir
Reaktionen: KillerCow
mibbio schrieb:
Also selbst bei Copy&Paste und Tutorials sollte man nebenbei einen Blick in die offizielle Doku werfen, um die Sachen auch zu verstehen (und anpassen zu können).
Ja, normalerweise sollte man eigentlich direkt im Vorfeld die Docs aufsuchen... bis auf wenige Ausnahmen sind diese gut, verständlich und mit reichlich Beispielen gefüttert.... allerdings kam bei mir der Punkt, wo ich mich selbst für zu dumm erklärt hatte und das Tut aufgesucht hab :D positiv war, das meine initiale Implementierung bis auf 2 Zeilen kaum abgewichen war ^^

..ärgert mich immer noch, das mich ein Zeichen in die Knie gezwungen hat :D
 
Zurück
Oben