javascript - nodejs - pm2
Nginx Reverse Proxying a Node.js con Rewrite (1)
Tengo varias aplicaciones ejecutándose detrás de un proxy inverso Nginx, uno de los cuales es un servidor Node con Express.js. Estoy proxying domain.com/demo/app/<path>
a localhost:7003/<path>
usando esta configuración de Nginx:
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;
}
...
}
}
Esto funciona muy bien y la app
recibe solicitudes como si estuviera enraizada en /
. El problema es que la app
maneja sus propios archivos estáticos y puede realizar solicitudes de rutas como css/app.css
o images/image.jpg
. Pero debido al proxy inverso, estos realmente existen en /demo/app/css/app.css
y /demo/app/images/image.jpg
respectivamente.
Lo he resuelto haciendo que Nginx pase a Node un encabezado personalizado que indica la ruta de acceso raíz, que el servidor de Nodo envía a las URL de todas las solicitudes posteriores. Pero ahora mi código está lleno de estas cadenas de ruta raíz. Por ejemplo, parte de mis plantillas de back-end:
link(rel=''stylesheet'', href="#{basePath}/css/base.css")
link(rel=''stylesheet'', href="#{basePath}/css/skeleton.css")
link(rel=''stylesheet'', href="#{basePath}/css/layout.css")
¿Cuál es una forma más elegante de manejar esto? ¿No hay una forma de que Nginx reconozca las solicitudes provenientes de un servidor ascendente y las reenvíe automáticamente a ese servidor?
Hice que nginx sirva archivos estáticos sin siquiera pasar esas solicitudes al nodo agregando la directiva de ubicación al archivo de configuración nginx de la aplicación (que se incluye en nginx.conf):
location ~ /(img|js)/ {
rewrite ^(.*)$ /public/$1 break;
}
location / {
proxy_pass http://localhost:3000/;
...
}
En caso de que la solicitud llegue a / img o / js, el directorio nginx sirve a los archivos de / public / img o / public / js respectivamente. Todas las demás solicitudes son enviadas al nodo.
Puede agregar más directorios si necesita (como / css o / views, si almacena plantillas ahí que desea usar tanto en el nodo como en el navegador) y tiene cualquier estructura de directorio dentro de esos directorios, nginx solo los prepede / public para ellos y obtiene archivos desde allí sin que la aplicación de su nodo siquiera lo sepa.