2011-11-14 12 views
10

Obecnie próbuję nginx i nodejs z połączeniem działającym nodejs proxied w nginx. Problem w tym, że obecnie nie uruchamiam nodejs pod rootem (/), ale pod/data, ponieważ nginx powinien obsługiwać żądania statyczne jak zwykle. nodejs nie powinien wiedzieć, że jest pod/dane, ale wydaje się, że jest wymagany.Uruchamianie nodejs pod nginxem

Innymi słowy. Chcę, żeby nodejs "sądził", że działa w /. Czy to jest możliwe?

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

kod 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

Dobre pytanie. Nie znalazłem jeszcze rozwiązania dla tego. Mam również 2 ścieżki w mojej aplikacji;/app dla aplikacji internetowej i/static dla wszystkich plików statycznych. – andyuk

+0

Fyi. Dodałem plik config.js i zdefiniowałem tam ustawienie wraz z różnymi dodatkami. Przynajmniej jest w jednym miejscu jako część aplikacji i nie rozprzestrzenia się w konflikcie startowym lub trudno znaleźć wrogie env. – Asken

+0

Spróbuj umieścić znak "/" po numerze portu. To działało dla mnie. –

Odpowiedz

3

Myślę, że to rozwiązanie może być lepiej (jeśli używasz coś podobnego Express lub coś podobnego, że wykorzystuje „middleware” logiki):

Dodaj funkcję middleware, aby zmienić adres URL podobnie jak

rewriter.js

W wyraźnej aplikacji zrobić tak:

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

Jeszcze raz ... może uda Ci się rozwinąć moją aplikację :). Napisanie było tym, czego szukałem, a ponieważ korzystam z połączenia, wszystko działa dobrze. – Asken

+0

Nie ma problemu, zawsze cieszę się, że mogę pomóc komuś z pytaniami związanymi z Node.js. Miałem wiele pytań do siebie, gdy uczyłem się Node & Express, a ludzie tacy jak TJ (autor Express & Connect) byli na tyle uprzejmi, aby odpowiedzieć na wszystkie moje pytania. P.S. Oczywiście, mogę utworzyć Twoją aplikację: P – alessioalex

0

rozwiązanie tymczasowe: Nie idealny dla mnie, ale będziesz musiał ze względu na teraz, jak mogę go skonfigurować przynajmniej . Zaczynam serwer węzła przy użyciu:

node app2.js /data 

kod do obsługi węzła głównego:

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

rozwiązania:

  • Napisz swoją aplikację, aby zajrzeć do katalogu na komendzie linia. Przekaż katalog w wierszu poleceń po uruchomieniu aplikacji.

  • Napisz swoją aplikację, aby wyszukać katalog w określonej zmiennej środowiskowej. Ustaw najpierw zmienną środowiskową po uruchomieniu aplikacji.

  • Napisz swoją aplikację, aby założyć, że jej katalog jest katalogiem docelowym. Przejdź do katalogu po uruchomieniu aplikacji.

  • Napisz swoją aplikację, aby przyspieszyć działanie drzewa katalogów w poszukiwaniu znanego pliku (np. Zwiększ katalog, szukając ./app2.js, a następnie katalog, w którym znajduje się ten plik, jest katalogiem docelowym).

+0

Szukałem "lepszej" odpowiedzi, ale wygląda na to, że nodejs nie jest szczególnie świadomy kontekstu, w którym działa. Cały adres URL jest zawsze analizowany. Musiałem otoczyć głowę tym, co pochodzi z ASP.Net, gdzie folder aplikacji jest rootem. Numer trzy nie dotyczy mojej sprawy, ale pozostałe są całkowicie poprawne. – Asken

1

I zwykle to zrobić:

nginx config:

upstream app_node { 
    server 127.0.0.1:3000; 
} 

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

węzła.js aplikacja:

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

Następnie od świata zewnętrznego mogę złożyć zamówienie, takie jak http://my-host-name/data/something?someKey=someValue nginx, która ominie do node.js aplikacji, który będzie tylko zobaczyć go jako /something?someKey=someValue (ponieważ URL został przepisany).

Wiem, że to nie jedyne podejście, ale jestem jednym z lepszych, ponieważ zawsze szanuję filozofię "things that do one thing and do it well". Tutaj Nginx jest dobry w przepisywaniu adresów URL, podczas gdy Node.js dobrze radzi sobie z żądaniami.