Tengo una aplicación de nodo ejecutándose en el puerto 8443. Mi nginx maneja las solicitudes web en los puertos 80 y 443 y debería redirigir al usuario al 8443.
aquí está mi /etc/nginx/sites-enabled/default
configuración:
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
}
}
con esta configuración puedo acceder a mi aplicación a través de
http(s)://myapp.com:8443
sólo cuando agrego las siguientes iptables
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
puedo acceder
http(s)://myapp.com
Preguntas:
Me parece un poco tonto redirigir desde el puerto 80 al 443 al 8443 usando iptables. ¿Hay alguna manera de hacer esto solo con nginx (o es este el camino a seguir?).
¿Es este enfoque (tener la aplicación en un puerto no estándar como 8443) una buena idea?
Respuesta1
Fácil. Dado que su node.js se ejecuta en el puerto 8443 y, hasta donde tengo entendido, no tiene ningún otro servicio escuchando solicitudes en otros puertos, simplemente puede hacer esto en su configuración de nginx:
server {
# here comes the rest of your nginx configuration
location / {
proxy_pass http://127.0.0.1:8443;
}
}
No es necesario utilizar ninguna regla de iptables ni crear una sección ascendente en su configuración de nginx. nginx puede (y debe) realizar todos los redireccionamientos de puertos de fábrica (como lo hace normalmente cualquier proxy inverso).
Podría estar equivocado, pero la razón por la que su aplicación comienza a funcionar después de las reglas de iptables es porque sus clientes comienzan a acceder a su servidor node.js directamente, debido a la redirección del puerto, que es similar a cuando usamos Squid como proxy transparente.
Este artículo puede ayudarte. Ignore el hecho de que estaba dirigido a Apache:
¡Buena suerte y saludos cordiales!
Respuesta2
Es un poco inútil y un desperdicio realizar cifrado 127.0.0.1
entre nginx y su upstream, cuando su upstream se ejecuta en 127.0.0.1
.
En todo caso, su solución con iptables
redireccionamiento sería mucho más eficiente que simplemente incorporar nginx a la mezcla, sin ningún cambio en el flujo ascendente.
Pero tenemos que preguntarnos: si no estás usando ninguna característica interesante adicional de nginx, ¿por qué quieres agregarla a la mezcla en primer lugar?
El enfoque correcto sería ejecutar su flujo ascendente sin https
y redirigir tanto http como https al flujo ascendente con nginx. La razón por la que su configuración actual no funciona probablemente tenga que ver con algún error de configuración, que no es obvio a partir de los fragmentos que ha pegado hasta ahora.