2012-01-09 14 views
7

पर ECONNREFUSED मैंने Node.js. का उपयोग करके एक वेब-सर्वर लिखा है। जब मैंने अपने सर्वर को टेस्टर के साथ परीक्षण करने का प्रयास किया तो मैंने इसके लिए लिखा है, मैं केवल तभी सफल होता हूं जब मैं सर्वर के लिए उपयोग कर रहा पोर्ट 80 नहीं है। मैंने नेटस्टैट पर जांच की है, और कोई अन्य एप्लिकेशन पोर्ट का उपयोग नहीं कर रहा है 80 त्रुटि मैं कंसोल पर हो रही है है:नोड.जेएस: पोर्ट 80

Error: connect ECONNREFUSED 
    at errnoException (net.js:640:11) 
    at Object.afterConnect [as oncomplete] (net.js:631:18) 

क्या इस मामले में किया जा सकता है?

+0

सर्वर के लिए पोर्ट नंबर क्या है? हो सकता है कि आपको पोर्ट 80 से बांधने की अनुमति न हो। – Finslicer

+1

मैंने 8080 की कोशिश की है और यह एक आकर्षण की तरह काम करता है। – limlim

+0

यदि आप उदाहरण के लिए उबंटू का उपयोग कर रहे हैं (या अन्य यूनिक्स सिस्टम) तो आप 'sudo node sample.js' आज़मा सकते हैं। यह आम तौर पर चाल है। – alessioalex

उत्तर

3

आपको सामान्य उपयोगकर्ता (उदा। गैर रूट) के नीचे 1024 (80 सहित) के नीचे बंदरगाहों से जुड़ने की अनुमति नहीं हो सकती है, उच्च संख्या वाले पोर्ट (1024 से ऊपर, उदाहरण के लिए 8080) का प्रयास करें।

[संपादित करें]

अपने लक्ष्य प्रणाली के आधार पर, और यह सोचते हैं आप अपने व्यवस्थापक हैं, तो आप शायद इसलिए की तरह समस्या को हल करने कर सकते हैं:

  1. अपने कार्यक्रम sudo का उपयोग कर "निष्पादित ", जैसे: sudo node ./myprogram.js

  2. या, अपने सिस्टम पर "root" उपयोगकर्ता के रूप में लॉगिन करें और प्रोग्राम को सामान्य के रूप में चलाएं।

हालांकि, एक नियमित आधार पर इनमें से किसी कर की आदत डालना नहीं है (जब तक आप समझ क्यों), वे संभावित सुरक्षा संबंधी दोषों को जो दुर्भावनापूर्ण, प्रेरित व्यक्तियों द्वारा दोहन हो सकता है शुरू कर सकते हैं।

+0

मुझे पोर्ट को 80 पर सेट करना होगा (यह एक असाइनमेंट है जिसे मुझे सबमिट करना है, इसलिए इसे पोर्ट 80 पर भी काम करना है)। मैं यह अनुमति कैसे प्राप्त कर सकता हूं? – limlim

+0

सिस्टम प्रशासक द्वारा अनुमति दी जा सकती है। ध्यान दें कि आपका प्रोग्राम किसी भी पोर्ट नंबर पर भी काम करेगा, जब तक कि प्रोग्राम चलाने वाले उपयोगकर्ता को उस बंदरगाह से जुड़ने की अनुमति हो। – maerics

+0

यह मेरा खुद का कंप्यूटर है। मैं उसे कैसे कर सकता हूँ? – limlim

10

यह मूल रूप से माताओं से जवाब के लिए एक अतिरिक्त है, लेकिन चूंकि मैं एक कोड उदाहरण जोड़ना चाहता हूं, इसलिए मैं सुरक्षा समस्याओं को रोकने के लिए अतिरिक्त जानकारी के साथ एक और उत्तर लिखता हूं।

आमतौर पर वेब सर्वर रूट के रूप में शुरू होते हैं, क्योंकि 1024 से नीचे बंदरगाहों पर बांधने के लिए इसकी आवश्यकता होती है, लेकिन फिर वे उस उपयोगकर्ता को बदलते हैं जो वे किसी विशेषाधिकार प्राप्त उपयोगकर्ता के अधीन नहीं जाते हैं।

आप process.setuid("username") का उपयोग करके node.js के साथ ऐसा कर सकते हैं।

निम्न उदाहरण सर्वर शुरू होता है और उसके बाद उपयोगकर्ता "www-डेटा" के लिए रूट अनुमतियों ड्रॉप के बाद वह खुद को पोर्ट 80 करने के लिए बाध्य है जब रूट के रूप में शुरू कर दिया:

function StartServer() { 
    console.log("Starting server..."); 
    // Initalizations such as reading the config file, etc. 
    server = http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
    }); 
    try { 
    server.listen(80, "0.0.0.0", function(){ 
     process.setuid("www-data"); 
    }); 
    } 
    catch(err) { 
    console.error("Error: [%s] Call: [%s]", err.message, err.syscall); 
    process.exit(1); 
    } 
} 
+1

+1 भी, केवल एफवाईआई आप [भाषा वाक्यविन्यास हाइलाइटिंग संकेत] जोड़ सकते हैं (http://meta.stackexchange.com/questions/981/syntax- हाइलाइटिंग- भाषा- संकेत) ([लिंक] (http: // मेटा। stackexchange.com/questions/981/syntax- हाइलाइटिंग- भाषा- संकेत)) अपने कोड स्निपेट में उन्हें सुंदर बनाने के लिए! – maerics

+0

धन्यवाद, अनुमान लगाएं कि यह प्रश्न में जावास्क्रिप्ट टैग के बिना स्वयं काम नहीं करता है :) – Bastian

+0

हाँ, ऑटो-डिटेक्ट को किसी कारण से ईसीएमएस्क्रिप्ट डेरिवेटिव्स के साथ सबसे अधिक परेशानी होती है। – maerics

17

आप की आदत नहीं करना चाहिए एक विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में नोड चल रहा है। यहाँ एक विधि मैं 6 अलग मशीनों पर उपयोग कर रहा हूँ है:

उपयोग iptables इसलिए की तरह 8080 को पोर्ट 80 पर आने वाले ट्रैफ़िक को अग्रेषित करने के:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 

तो बचाने के लिए सुनिश्चित हो कि

sudo iptables-save 

यूडी भी इसे आरसीएलएलोकल में जोड़ना चाहते हैं, इसलिए वे रीबूट या इंस्टेंस लॉन्च (ईसी 2 या अन्य क्लाउड के मामले में) पर सेट हैं

फिर आप सुरक्षित रूप से नोड श्रोनी शुरू कर सकते हैं 8080 पर किसी भी उपयोगकर्ता के रूप में जी।

+0

क्या आपको बंदरगाह 8080 पर बंदरगाह 80 तक आउटबाउंड ट्रैफिक बनाने की भी आवश्यकता नहीं है? – Tom

+0

@ टॉम आप नहीं करते हैं। वह स्वचालित है। इस समाधान पर – talentedmrjones

+0

विशाल +1। मैंने एक ही काम करने के लिए अपाचे वर्चुअलहोस्ट का उपयोग करने पर विचार किया था, लेकिन यह चाल थी! – benipsen

0

उपरोक्त सूची में मैंने जो वैकल्पिक विकल्प नहीं देखा है, वह भी नोड निष्पादन योग्य पर निम्न आदेश निष्पादित करके आपकी प्रक्रिया को विशेषाधिकार प्राप्त पोर्ट (< 1024) से जुड़ने की अनुमति देता है। (पथ अनुकूलन)

setcap 'cap_net_bind_service=+ep' /opt/meteor/.meteor/tools/latest/bin/node 

झुंझलाहट है कि आप इस आदेश का हर बार जब आप को अपडेट करने या नोड निष्पादन बदल फिर से जारी करना होगा।

सादर,

0

मैं Node.js के सामने Nginx सर्वर (पोर्ट 80) (किसी भी बंदरगाह> 1024) का उपयोग करें। यह बहुत अच्छा काम करता है।

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