मैं UNIX सॉकेट के माध्यम से Nginx प्रॉक्सी_पास Node.js HTTP सर्वर को कैसे कॉन्फ़िगर करूं?


16

मैं एक UNIX डोमेन सॉकेट के माध्यम से Node.js HTTP सर्वर से कनेक्ट करने के लिए Nginx सर्वर को कॉन्फ़िगर करने का प्रयास कर रहा हूं।

Nginx कॉन्फ़िगरेशन फ़ाइल:

server {
  listen 80;

  location / {
    proxy_pass http://unix:/tmp/app.socket:/;
  }
}

( http://wiki.nginx.org/HttpProxyModule#proxy_pass के अनुसार )

Node.js स्क्रिप्ट:

var http = require('http');

http.createServer(function(req, res) {
  console.log('received request');
  req.end('received request\n');
}).listen('/tmp/app.socket');

अब, जब मैं फोन करने की कोशिश करता हूं

curl http://localhost/

मैं केवल कर्ल में 502 बैड गेटवे त्रुटि पृष्ठ प्राप्त करता हूं और Node.js प्रक्रिया पर कुछ भी नहीं।

क्या मुझसे कुछ ग़लत हो रहा है?

संपादित करें:

क्वांटा के समाधान की कोशिश करने के बाद, गलती Nginx कॉन्फ़िगरेशन के साथ होनी चाहिए, क्योंकि Node.js प्रक्रिया सॉकेट से कनेक्शन को सही ढंग से स्थापित करती है।

मैंने Nginx को इस तरह से कॉन्फ़िगर करने का भी प्रयास किया:

upstream myapp {
  server unix:/tmp/app.socket;
}

server {
  listen 80;

  location / {
    proxy_pass http://myapp;
  }
}

लेकिन यह भी काम नहीं किया।

BTW मैं Nginx v1.0.6 का उपयोग कर रहा हूँ।

जब मैं दूसरे कॉन्फ़िगरेशन का उपयोग करता हूं, तो Nginx में त्रुटि लॉग के लिए निम्नलिखित लिखा जा रहा है

2011/09/28 13:33:47 [crit] 1849#0: *5 connect() to unix:/tmp/app.socket failed  (13: Permission denied) while connecting to upstream, client: 127.0.0.1,        server: , request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/app.socket:/", host: "localhost:80"

जवाबों:


7

chmod 777 /tmp/app.socket

यह एक समाधान है लेकिन समाधान नहीं है।

आप शायद एक ही उपयोगकर्ता और / या एक ही समूह के साथ दोनों webservers चलाना चाहिए ताकि आप अपने सॉकेट दुनिया को पढ़ने योग्य बनाने के लिए नहीं है। मैं यह भी नहीं देखता कि एक सॉकेट को निष्पादन योग्य बनाने की आवश्यकता क्यों है। तो 6 पर्याप्त होना चाहिए। यानी: 660


यूनिक्स अनुमतियों से कम परिचित लोगों के लिए, यदि यह योजना एक ही होस्ट पर कई खातों के लिए उपयोग की जाती थी, तो प्रत्येक खाता दूसरों के सॉकेट में लिख सकता था। यही कारण है कि यह "एक समाधान नहीं है" भले ही यह काम करता है।
मार्क स्टोसबर्ग

5

"502 बैड गेटवे" का अर्थ है कि नग्नेक्स को अपस्ट्रीम सर्वर से प्रतिक्रिया नहीं मिल सकती है। सुनिश्चित करें कि आपके पास एक प्रक्रिया है जिस पर सुनो /tmp/app.socket:

# netstat --protocol=unix -nlp | grep app.socket

मुझे एक प्रक्रिया सुनने को मिली है /tmp/app.socket। जब मैं आपकी आज्ञा चलाता हूं तो यह मुझे देता है unix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket। लेकिन आपकी टिप के लिए धन्यवाद। यह कमांड काफी काम की है।
पोवरब

3

मैंने इसे हल किया। त्रुटि संदेश संदेश मैं ऊपर पोस्टेट मुझे उत्तर की ओर ले जाता है।

मैंने हमेशा एक सामान्य उपयोगकर्ता के रूप में Node.js प्रक्रिया शुरू की, जबकि Nginx को रूट द्वारा शुरू किया गया था। जब Node.js शुरू किया गया था, तो उसने srwxr-xr-xअधिकारों के साथ सॉकेट बनाया । इसलिए नग्नेक्स सॉकेट को नहीं लिख सकता था, यह केवल इसे पढ़ सकता था। इस तरह सब कुछ सही ढंग से सेट हो सकता है, जब प्रक्रियाएं शुरू हो जाती हैं। लेकिन एक बार जब मैंने एक वेब पेज को कॉल किया, तो नेग्नेक्स ने महसूस किया कि सॉकेट के अनुरोध को प्रॉक्सी करने का अधिकार नहीं था।

हल चलाना था

chmod 777 /tmp/app.socket

अब, सब कुछ ठीक है।

वैसे भी धन्यवाद!


2

मुझे पता है कि मुझे पार्टी में देर हो रही है, लेकिन इस सटीक समस्या के लिए यह पृष्ठ Google खोज में आया है। शेल कमांड चलाना वास्तव में मेरे लिए एक आदर्श समाधान नहीं है, और यह है कि मैंने इसे कैसे हल किया;

चामॉड को मैन्युअल रूप से चलाने के बजाय, आप सॉकेट बनने के बाद नोड को 'एफएस' लाइब्रेरी के साथ कर सकते हैं:

var fs = require('fs');

var server = http.createServer(...This varies by implementation...);

server.listen('/path/to/socket');

server.on('listening', onListening);

function onListening() {
  fs.chmodSync('/path/to/socket', '777');
}

जाहिर है अगर आपके पास पहले से मौजूद घटना में अन्य चीजें हैं, तो आपको कॉल को मौजूदा फ़ंक्शन में chmodSync में जोड़ना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.