2011-11-14 18 views
10

Actualmente estoy probando nginx y nodejs con la conexión ejecutando nodejs con proxy en nginx. El problema que tengo es que actualmente no ejecuto nodejs bajo la raíz (/) pero bajo/data ya que nginx debe manejar las solicitudes estáticas como normal. nodejs no debería tener que saber que está bajo/datos, pero parece ser necesario.Ejecutando nodejs bajo nginx

En otras palabras. Quiero que nodejs "piense" que se ejecuta en /. ¿Es eso posible?

nginx config:

upstream app_node { 
    server 127.0.0.1:3000; 
} 

server { 
... 

    location /data { 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header Host $http_host; 
      proxy_set_header X-NginX-Proxy true; 

      proxy_pass http://app_node/data; 
      proxy_redirect off; 
    } 
} 

nodejs código:

exports.routes = function(app) { 
    // I don't want "data" here. My nodejs app should be able to run under 
    // any folder 
    app.get('/data', function(req, res, params) { 
      res.writeHead(200, { 'Content-type': 'text/plain' }); 
      res.end('app.get /data'); 
    }); 
    // I don't want "data" here either 
    app.get('/data/test', function(req, res, params) { 
      res.writeHead(200, { 'Content-type': 'text/plain' }); 
      res.end('app.get /data/test'); 
    }); 
}; 
+0

Buena pregunta. No he encontrado una solución para esto todavía. También tengo 2 rutas en mi aplicación;/aplicación para la aplicación web y/estática para todos los archivos estáticos. – andyuk

+0

Fyi. Agregué un config.js y definí la configuración allí junto con una variedad de cosas. Al menos está en un lugar como parte de la aplicación y no está distribuido en confesiones de inicio o es difícil de encontrar. – Asken

+0

Intente colocar un '/' después del número de puerto. Eso funcionó para mí. –

Respuesta

3

creo que esta solución puede ser mejor (si está utilizando algo así como expreso o algo similar que utiliza la lógica "middleware"):

Añadir una función de middleware para cambiar la url al igual que

rewriter.js

En su aplicación expresos de este modo:

app.config

// your configuration 
app.configure(function(){ 
    ... 
    app.use(require('./rewriter.js').temp_rewrite()); 
    ... 
}); 

// here are the routes 
// notice you don't need to write '/data' in front anymore all the time 

app.get('/', function (req, res) { 
    res.send('This is actually site.com/data/'); 
}); 

app.get('/example', function (req, res) { 
    res.send('This is actually site.com/data/example') 
}); 
+1

Usted otra vez ... tal vez usted puede convertir mi aplicación en su lugar :). La reescritura era lo que estaba buscando y, como estoy usando Connect, funcionará bien. – Asken

+0

No hay problema, siempre estoy contento de poder ayudar a alguien más con las preguntas relacionadas con Node.js. Tenía muchas preguntas que hacerme cuando estaba aprendiendo Node & Express y personas como TJ (autor de Express & Connect) tuvieron la amabilidad de responder todas mis preguntas. PD Claro, puedo hacer tu aplicación: P – alessioalex

0

solución temporal: No es ideal para mí, pero que tendrá que debido por ahora ya que al menos puedo configurarlo . Estoy empezando el servidor del nodo usando:

node app2.js /data 

Código para manejar el nodo raíz:

exports.routes = function(app) { 
    var me = this; 

    // get the root path 
    me.proxyRootPath = process.argv[2]; 

    // using the proxyRootPath to answer to the correct request 
    app.get(me.proxyRootPath, function(req, res, params) { 
      res.writeHead(200, { 'Content-type': 'text/plain' }); 
      res.end('app.get /data'); 
    }); 
    // using the proxyRootPath to answer to the correct request 
    app.get(me.proxyRootPath + '/test', function(req, res, params) { 
      res.writeHead(200, { 'Content-type': 'text/plain' }); 
      res.end('app.get /data/test'); 
    }); 
}; 
0

Soluciones:

  • Escribe tu aplicación para buscar el directorio en el comando línea. Pase el directorio en la línea de comando cuando ejecuta la aplicación.

  • Escriba su aplicación para buscar el directorio en una variable de entorno específica. Establezca la variable de entorno primero cuando ejecuta la aplicación.

  • Escriba su aplicación para asumir que su directorio actual es el directorio deseado. Cambie al directorio primero cuando ejecuta la aplicación.

  • Escriba su aplicación para intensificar el árbol de directorios buscando un archivo conocido (por ejemplo, intensifique el directorio buscando ./app2.js, y luego el directorio en el que se encuentra ese archivo es el directorio deseado).

+0

He estado buscando una respuesta "mejor", pero parece que nodejs no está particularmente al tanto del contexto en el que se está ejecutando. La URL completa siempre se está analizando. Necesitaba entender esto proveniente de ASP.Net, donde la carpeta de la aplicación es la raíz. El número tres no se aplica a mi caso, pero los otros son perfectamente válidos. – Asken

1

normalmente hago esto:

nginx config:

upstream app_node { 
    server 127.0.0.1:3000; 
} 

server { 
    ... 
    location /data/ { 
    ... 
    proxy_pass http://app_node 
    rewrite ^/data/(.*)? /$1 break; 
    } 
} 

nodo.js aplicación:

app.get('/something', function(req, res, next) { 
    ... 
}); 

Luego del mundo exterior que podría hacer una petición como http://my-host-name/data/something?someKey=someValue, que nginx pasará a la aplicación Node.js, que sólo se ven como /something?someKey=someValue (ya que la URL se volvió a escribir)

Sé que este no es el único enfoque, pero estoy entre los mejores, ya que siempre respeto la filosofía de "things that do one thing and do it well". Aquí, Nginx es bueno para reescribir las URL, mientras que Node.js es bueno en el manejo de las solicitudes.