Ich habe eine Node-Anwendung, die auf Port 8443 läuft. Mein Nginx verarbeitet die Webanforderungen auf Port 80 und 443 und sollte den Benutzer auf 8443 umleiten.
hier ist meine /etc/nginx/sites-enabled/default
Konfiguration:
upstream my_upstream {
server 127.0.0.1:8443;
keepalive 64;
}
server {
listen 80;
server_name myapp.com;
rewrite ^/(.*) https://myapp.com/$1 permanent;
}
server {
listen 443 ssl;
server_name 12.34.12.34 www.myapp.com myapp.com *.myapp.com;
ssl_certificate /path/to/my/cert.crt;
ssl_certificate_key /path/to/my/private.key
// other ssl params
location / {
proxy_redirect off;
proxy_pass https://my_upstream;
// other params
}
}
Mit dieser Konfiguration kann ich auf meine App zugreifen über
http(s)://myapp.com:8443
nur wenn ich die folgenden iptables hinzufüge
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443
iptables -t nat -A OUTPUT -p tcp --dport 443 -o lo -j REDIRECT --to-port 8443
Ich kann zugreifen
http(s)://myapp.com
Fragen:
Es erscheint mir irgendwie albern, mit iptables von Port 80 auf 443 und 8443 umzuleiten. Gibt es eine Möglichkeit, dies nur mit nginx zu tun (oder ist das der richtige Weg?).
Ist dieser Ansatz (die Anwendung auf einem nicht standardmäßigen Port wie 8443 zu haben) überhaupt eine gute Idee?
Antwort1
Einfach. Da Ihr node.js auf Port 8443 läuft und Sie, soweit ich verstanden habe, keinen anderen Dienst haben, der auf Anfragen auf anderen Ports wartet, können Sie dies einfach in Ihrer nginx-Konfiguration tun:
server {
# here comes the rest of your nginx configuration
location / {
proxy_pass http://127.0.0.1:8443;
}
}
Sie müssen weder iptables-Regeln verwenden noch einen Upstream-Abschnitt in Ihrer Nginx-Konfiguration erstellen. Nginx kann (und sollte) alle Port-Umleitungen standardmäßig durchführen (wie es normalerweise jeder Reverse-Proxy tut).
Ich könnte mich irren, aber der Grund, warum Ihre Anwendung nach Befolgung der iptables-Regeln zu funktionieren beginnt, liegt darin, dass Ihre Clients aufgrund der Portumleitung direkt auf Ihren node.js-Server zugreifen, ähnlich wie wenn wir Squid als transparenten Proxy verwenden.
Dieser Artikel kann Ihnen helfen. Ignorieren Sie die Tatsache, dass er an Apache gerichtet war:
Viel Glück und viele Grüße!
Antwort2
Es ist ein wenig sinnlos und verschwenderisch, eine Verschlüsselung zwischen Nginx und Ihrem Upstream durchzuführen 127.0.0.1
, wenn Ihr Upstream mit läuft 127.0.0.1
.
Wenn überhaupt, wäre Ihre Lösung mit iptables
Umleitung tatsächlich viel effizienter, als einfach Nginx in den Mix einzubinden, ohne Änderungen am Upstream vorzunehmen.
Aber wir müssen fragen: Wenn Sie keine der coolen Zusatzfunktionen von nginx nutzen, warum möchten Sie es dann überhaupt in den Mix aufnehmen?
Der richtige Ansatz wäre, Ihren Upstream ohne auszuführen https
und sowohl http als auch https mit nginx zum Upstream umzuleiten. Der Grund, warum Ihre aktuelle Konfiguration nicht funktioniert, hat wahrscheinlich mit einem Konfigurationsfehler zu tun, der aus den bisher eingefügten Snippets nicht ersichtlich ist.