nginx

2011-11-14 17 views
10

के तहत नोडजेज़ चलाना मैं वर्तमान में nginx में noxjs को चलाने वाले कनेक्ट नोडज के साथ nginx और nodejs को आजमा रहा हूं। मेरी समस्या यह है कि मैं वर्तमान में रूट (/) के तहत नोडजेज़ नहीं चलाता लेकिन नीचे/डेटा के रूप में nginx को सामान्य अनुरोधों को सामान्य के रूप में संभालना चाहिए। नोडजेज को यह नहीं पता होना चाहिए कि यह नीचे/डेटा है लेकिन ऐसा लगता है कि यह आवश्यक है।nginx

दूसरे शब्दों में। मैं नोडज को "सोचने" के लिए चाहता हूं कि यह/पर चलता है। क्या यह संभव है?

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 कोड:

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

अच्छा सवाल। मुझे अभी तक इसका समाधान नहीं मिला है। मुझे अपने आवेदन में 2 पथ भी मिल गए हैं;/सभी ऐप के लिए वेब ऐप और/स्थिर के लिए ऐप। – andyuk

+0

Fyi। मैंने एक config.js जोड़ा और मिश्रित सामग्री के साथ सेटिंग को परिभाषित किया। कम से कम यह ऐप के हिस्से के रूप में एक स्थान पर है और एनवी वर्र्स को खोजने के लिए स्टार्ट-अप conf या हार्ड में फैल नहीं है। – Asken

+0

पोर्ट नंबर के बाद '/' रखने का प्रयास करें। यह मेरे लिए काम किया। –

उत्तर

3

मुझे लगता है कि इस समाधान बेहतर हो सकता है (यदि आप एक्सप्रेस या कुछ इसी तरह की तरह कुछ "मिडलवेयर" तर्क का उपयोग करता है का उपयोग कर रहे हैं):

एक मिडलवेयर समारोह में शामिल करें ताकि

तरह यूआरएल को बदलने के लिए

rewriter.js

अपने एक्सप्रेस ऐप्लिकेशन में इतना पसंद करते हैं:

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

आप फिर से ... शायद आप इसके बजाय मेरे ऐप dev कर सकते हैं :)। पुनः लिखना वह था जो मैं बाद में था और जैसा कि मैं कनेक्ट का उपयोग कर रहा हूं, यह ठीक काम करेगा। – Asken

+0

कोई समस्या नहीं, मैं हमेशा Node.js संबंधित प्रश्नों के साथ किसी और की मदद करने में सक्षम होने के लिए खुश हूं। मेरे पास खुद से पूछने के लिए कई सवाल थे जब मैं नोड और एक्सप्रेस सीख रहा था और टीजे (एक्सप्रेस एंड कनेक्ट लेखक) जैसे लोग मेरे सभी सवालों के जवाब देने के लिए वास्तव में बहुत दयालु थे। अनुलेख निश्चित रूप से, मैं आपका ऐप बना सकता हूं: पी – alessioalex

0

अस्थायी समाधान: मेरे लिए आदर्श नहीं है, लेकिन यह अब मैं कम से कम यह कॉन्फ़िगर कर सकते हैं के रूप में के लिए कारण होगा ।

node app2.js /data 

कोड रूट नोड को संभालने के लिए:

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

समाधान:

  • आदेश पर निर्देशिका के लिए देखने के लिए अपने अनुप्रयोग लिखें मैं का उपयोग कर नोड सर्वर शुरू कर लाइन। जब आप ऐप चलाते हैं तो कमांड लाइन पर निर्देशिका पास करें।

  • एक विशिष्ट वातावरण चर में निर्देशिका को देखने के लिए अपना ऐप लिखें। जब आप ऐप चलाते हैं तो पहले पर्यावरण चर सेट करें।

  • अपने ऐप को यह निर्धारित करने के लिए लिखें कि उसकी वर्तमान निर्देशिका इच्छित निर्देशिका है। जब आप ऐप चलाते हैं तो पहले निर्देशिका में बदलें।

  • एक ज्ञात फ़ाइल की तलाश में निर्देशिका पेड़ को ऊपर उठाने के लिए अपना ऐप लिखें (उदाहरण के लिए, ./app2.js की तलाश में निर्देशिका को ऊपर उठाएं, और फिर वह निर्देशिका जिसमें वह फ़ाइल मिलती है वह निर्देशिका है)।

+0

मैं एक "बेहतर" उत्तर ढूंढ रहा हूं लेकिन ऐसा लगता है कि नोडजेस विशेष रूप से संदर्भ के संदर्भ में नहीं जानते हैं। पूरा यूआरएल हमेशा पार्स किया जा रहा है। मुझे एएसपी.Net से आने वाले मेरे सिर को लपेटने की ज़रूरत थी जहां एप्लिकेशन फ़ोल्डर रूट है। नंबर तीन मेरे मामले पर लागू नहीं होता है लेकिन अन्य पूरी तरह मान्य हैं। – Asken

1

मैं सामान्य रूप से ऐसा करते हैं:

nginx config:

upstream app_node { 
    server 127.0.0.1:3000; 
} 

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

नोड।js एप्लिकेशन:

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

तो बाहर की दुनिया से मैं इस तरह के रूप http://my-host-name/data/something?someKey=someValue एक अनुरोध है, जो nginx Node.js एप्लिकेशन, जो केवल /something?someKey=someValue के रूप में यह देखेंगे करने के लिए ऊपर से गुजरती होगा बना सकता है (के बाद से यूआरएल में लिखा गया था)।

मैं जानता हूँ कि यह केवल दृष्टिकोण नहीं है, लेकिन imo बेहतर लोगों के बीच, के रूप में मैं हमेशा "things that do one thing and do it well" के दर्शन का सम्मान करते हैं। यहां, Nginx यूआरएल को फिर से लिखने में अच्छा है, जबकि Node.js स्वयं अनुरोधों को संभालने में अच्छा है।

 संबंधित मुद्दे