NGINX + Node y EJS

135 views
Skip to first unread message

Ricky

unread,
Apr 11, 2015, 4:16:57 PM4/11/15
to node...@googlegroups.com
Estimados todos,
En la empresa queremos aligerar la carga de Node ya que esperamos una concurrencia de usuarios bastante alta por tal motivo queremos que los archivos estáticos (imagenes, html -ejs-, javascript, css, etc) sean servidos por Nginx, y bueno ya se como hacerlo. Mi problema es el siguiente:

Usando Express estoy configurando como carpeta pública la siguiente: /public y estoy utilizando como motor de plantillas EJS, el cual, cuando un usuario se logea, lo redirecciono con ciertas variables de sesion que se manejan en su entorno local (Ya saben, esto se puede hacer con EJS).. Mi problema es que ahora, usando Nginx no voy a usar Express para servir los archivos EJS, sino el mismo Nginx, por lo que no se como hacer para enviarle esas VARIABLES que les he comentado arriba.

Espero se me haya entendido y alguien tenga alguna idea, esto contra el reloj :(

Saludos.

Angel Java Lopez

unread,
Apr 11, 2015, 4:24:46 PM4/11/15
to node...@googlegroups.com
Hmmm... no entendi

Cuales son las URL que sirve directamente nginx?

Cual es la URL del recurso que quieres servir?

Angel "Java" Lopez
@ajlopez

--
Has recibido este mensaje porque estás suscrito al grupo "NodeJS ES" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nodejs-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

DiegoUG

unread,
Apr 11, 2015, 4:33:53 PM4/11/15
to nodejs-es
facil, si tienes que configurar a express para buscar los estaticos, con la ruta que usa nginx para servir los estaticos en nginx.

listo ya con eso tus variables y demas cosas buscaran los archivos en la ruta correcta
--
  Diego Alonso Uribe Gamez

Desarrollador web

Twitter: @DiegoUG

Google+: +DiegoAlonsoUribeGamez



Luis Enrique Muñoz

unread,
Apr 11, 2015, 4:39:12 PM4/11/15
to node...@googlegroups.com
Permíteme ser un poco mas gráfico:
Para configurar el directorio de vistas, el motor de plantilla y la carpeta pública, hacemos los siguiente usando express:
 
app.set('views', path.join(__dirname, '../app/views'));
app.set('view engine', 'ejs');
app.use(express.static('./public'));

pero... la idea es que express (Node) no se encarga de servir los archivos estáticos (html, imagenes, css, js, etc) sino solo se encargue de la API REST y la comunicación por websockets que he creado para mi aplicación... esto con la intención de aligerar la carga cuando ingresen los miles de usuarios de varios colegios con los cuales la empresa donde trabajo tiene convenio.

Con este propósito leyendo me encontré con nginx y me pareció guapísimo, partiendo desde que se puede ocultar el puerto y hacerlo actuar como un proxy inverso (si mal no recuerdo es el nombre que se le da), como también puede encargarse de servir los archivos estáticos de Express.

server {
        ...
        location ~ ^/(images/|img/|javascript/|js/|css/|stylesheets/|flash/|media/|static/|robots.txt|humans.txt|favicon.ico) {
          root /usr/local/MI_APLICACION/node/public;
          access_log off;
          expires max;
        }
        ...
    }

De esta forma node solo se encarga de hacer todas las demás tareas transaccionales para los cuales ha sido diseñado.

MI PROBLEMA:
Usando Express yo hago o siguiente:
     res.render('alumno', {
         objeto: req.session.usuario,
         url: 'http://localhost',
         puerto: 3000
      }); 

y lo que digo a continuación es una teoría: ¿Haría que nuevamente sea express el que  realiza el render cuando ya he definido que sea nginx el que se encargue de hacerlo?

Estoy sacando referencias del siguiente artículo (Muy bueno dicho sea de paso):

Gracias por responder.

Luis Enrique Muñoz

unread,
Apr 11, 2015, 4:40:03 PM4/11/15
to node...@googlegroups.com
Diego, no comprendo bien tu explicación... podrías ser un poco mas claro por favor.

Gracias por responder, saludos.

Javier Viola

unread,
Apr 11, 2015, 4:47:12 PM4/11/15
to node...@googlegroups.com
Hola Ricky, 
                   Cómo dijo Angel no queda muy claro que es lo que queres hacer.  Lo que yo entendí es que vos queres hacer todo el delivery de archivos estáticos ( html, css, ejs templates, etc ) vía nginx y con node.js hacer el handle de la lógica de tu aplicación.
Para eso debería hacer el render de ejs en el cliente ( browser ), pero para hacer el render de ejs necesitas la data de express por lo que debería hacer una segunda llamada al server ( esta vez para obtener la infoción de node ) y una vez recibida hacer el render.

para hacerlo gráfico sería algo como

browser                                                           Server (nginx )                             Server(node)
GET /usuarios ------------------------------------------------->
                      <------ responde( html / css  / ejs / js )
GET /usuarios:3000 (request a node iniciado desde js) ---------------------------------------------->                       

                        <------------------------------------------------ return data --------------------------------------

y con una callback en el browser algo como

// load the template file, then render it with data
var html = new EJS({url: 'cleaning.ejs'}).render(data);

No sé si es esto lo que tienes en mente, espero que ayude

Saludos!

DiegoUG

unread,
Apr 11, 2015, 4:57:37 PM4/11/15
to nodejs-es
node es el que deberia hacer el render del temnplate html, en el template html colocas una ruta css, son esos estaticos los que sive nginx, a menos que estes haciendo un single page aplication.

para hacer el response de una html con express usando node obligatoriamente tienes que usar node y una ruta local para el template.

nginx lu puedes usar para servir archivos img, css, js del lado del front, y creo que no mas, solo esos archivos que usamos en front.

Luis Enrique Muñoz

unread,
Apr 11, 2015, 4:59:53 PM4/11/15
to node...@googlegroups.com
Hola Javier,
Has entendido lo que quiero hacer, aunque no se si el ejemplo que me das se aplique a mi caso. Primero que nada no sabía que se podía hacer el render en el browser. El proceso de acceso de la pagina A a la pagina B en mi aplicación es el siguiente.
  1. Pagina A (Login). El usuario escribe su usuario y contraseña, esos datos al presionarse el botón ingresar viajan hasta el servidor (antes sin la ayuda de nginx) a la ruta "/comprobar-login". En dicha ruta uso un controlador que se encarga de revisar en la DB si el usuario existe, en caso sea afirmativo, ahí mismo redirecciono -Con ciertas variables- hacia la Página B (Una página de acceso restringido).
  2. Pagina B, recibe la data enviada (Puerto, URL, y un objeto de datos para inicializar la APP) y listo, la página es dibujada en el browser.
Según tu propuesta, cargaría primero la página, luego hago la llamada al servidor para extraer es información y luego realizaría el render de la página según el tipo de usuario. Si hago eso, expondría la plataforma a cualquier usuario fastidioso.

... Si es que te he entendido bien.

Saludos,


Luis Enrique Muñoz

unread,
Apr 11, 2015, 5:01:36 PM4/11/15
to node...@googlegroups.com
Empezaba a sospechar aquello que mencionas Diego, lo cual quería evitar ya que tratándose de que serán miles los usuarios que se conecten, solo me queda prender velitas para que no se caiga mi servidor (se me nota nervioso? :P )

Si no hay otra alternativa, caballero nomas...

Saludos

Javier Viola

unread,
Apr 11, 2015, 5:07:02 PM4/11/15
to node...@googlegroups.com
Luis,
         Pero es ese caso debería utilizar un session store como redis o alguna otra db (para no tener problemas si utilizas multiples server), entonces al ingresar a la página A esta genera un token de session y lo persiste. 
Redirecciona al user a la pagina b con la cookie o token de session.
Luego desde la página B se hace el request de la info ( con el token para validar que sea un usuario autorizado a acceder a esa info)

Saludos!

Luis Enrique Muñoz

unread,
Apr 11, 2015, 5:29:53 PM4/11/15
to node...@googlegroups.com
De haberlo sabido con tiempo.. hemos usado MySQL por un tema de tiempo y conocimientos (hasta esa fecha)... La idea que propones de Redis realmente me parece la solución, pero ya no tengo tiempo para implementar esa solución debo hacerlo con lo que tengo.

Definitivamente debo migrar hacia lo que mencionas para lo cual voy a buscar mas info. Gracias Javier y todos los que participaron, me han aclarado el panorama.

Saludos.
Reply all
Reply to author
Forward
0 new messages