2011-11-14 11 views
10

Attualmente sto provando nginx e nodejs con connect che eseguono nodejs con proxy in nginx. Il problema che ho è che attualmente non eseguo nodejs sotto la radice (/), ma sotto/data come nginx dovrebbe gestire le richieste statiche normalmente. nodejs non dovrebbe sapere che è sotto/data ma sembra essere richiesto.Running nodejs in nginx

In altre parole. Voglio che nodejs "pensi" che funzioni a /. È possibile?

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; 
    } 
} 

codice nodejs:

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

Buona domanda. Non ho ancora trovato una soluzione per questo. Ho anche 2 percorsi nella mia applicazione;/app per l'app Web e/static per tutti i file statici. – andyuk

+0

Fyi. Ho aggiunto un config.js e definito l'impostazione lì insieme a cose assortite. Almeno è in un posto come parte dell'app e non si sviluppa in start-up conf o difficile da trovare env vars. – Asken

+0

Prova a inserire un '/' dopo il numero di porta. Questo ha funzionato per me. –

risposta

3

Penso questa soluzione può essere migliore (se si utilizza qualcosa come espresso o qualcosa di simile che usa la logica "middleware"):

Aggiungere una funzione di middleware per modificare l'URL in questo modo

rewriter.js

Nella vostra applicazione espresso lo fanno in questo 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

Ancora una volta ... forse puoi anche sviluppare la mia app :). La riscrittura era ciò che cercavo e mentre sto usando la connessione funzionerà bene. – Asken

+0

Nessun problema, sono sempre felice di poter aiutare qualcun altro con le domande relative a Node.js. Ho avuto molte domande da pormi quando stavo imparando Node & Express e persone come TJ (Express & Connect autore) sono state davvero così gentili da rispondere a tutte le mie domande. Post scriptum Certo, posso rendere la tua app: P – alessioalex

0

soluzione temporanea: Non è l'ideale per me, ma dovrà dovuti per ora come posso almeno configurarlo . Sto iniziando il server nodo utilizzando:

node app2.js /data 

codice per gestire il nodo principale:

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

Solutions:

  • Scrivi la tua applicazione per cercare la directory sul comando linea. Passa la directory sulla riga di comando quando esegui l'app.

  • Scrivere l'app per cercare la directory in una specifica variabile di ambiente. Imposta prima la variabile d'ambiente quando esegui l'app.

  • Scrivere l'app in modo che la directory corrente sia la directory desiderata. Passa innanzitutto alla directory quando esegui l'app.

  • Scrivere l'app per aumentare la struttura della directory alla ricerca di un file noto (ad esempio, passare alla directory in cerca di ./app2.js e quindi la directory in cui viene trovato quel file è la directory desiderata).

+0

Ho cercato una risposta "migliore" ma sembra che nodejs non sia particolarmente consapevole del contesto in cui è in esecuzione. L'URL completo viene sempre analizzato. Avevo bisogno di capire da dove proviene ASP.Net, dove la cartella dell'applicazione è la radice. Il numero tre non si applica al mio caso ma gli altri sono perfettamente validi. – Asken

1

normalmente faccio questo:

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 app:

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

Poi dal mondo esterno ho potuto fare una richiesta, come http://my-host-name/data/something?someKey=someValue, che nginx passerà sopra al app node.js, che servirà solo a vederlo come /something?someKey=someValue (dato che l'url è stata riscritta).

So che questo non è l'unico approccio, ma imo tra i migliori, come ho sempre rispettato la filosofia di "things that do one thing and do it well". Qui, Nginx è bravo a riscrivere gli URL, mentre Node.js è bravo a gestire le richieste stesse.