अधिकांश बंदरगाहों पर सुनने पर Node.js EACCES त्रुटि


250

मैं एक ऐप का परीक्षण कर रहा हूं (उम्मीद है कि हरोकू पर चल सकता हूं, लेकिन स्थानीय स्तर पर भी समस्या है)। जब यह http.Server.listen () चलाता है, तो यह मुझे एक EACCES त्रुटि दे रहा है - लेकिन यह केवल कुछ पोर्ट पर होती है।

इसलिए, स्थानीय रूप से मैं चल रहा हूं:

joe@joebuntu:~$ node
> var h = require('http').createServer();
> h.listen(900);
Error: EACCES, Permission denied
    at Server._doListen (net.js:1062:5)
    at net.js:1033:14
    at Object.lookup (dns.js:132:45)
    at Server.listen (net.js:1027:20)
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:150:22)
    at Interface.emit (events.js:42:17)
    at Interface._onLine (readline.js:132:10)
    at Interface._line (readline.js:387:8)
    at Interface._ttyWrite (readline.js:564:14)

मेरे पास पोर्ट 900 (या मेरे द्वारा किए गए अन्य 20 पोर्टों में से कोई भी) पर कुछ भी नहीं चल रहा है, इसलिए यह काम करना चाहिए। अजीब हिस्सा यह है कि यह कुछ बंदरगाहों पर काम करता है । उदाहरण के लिए, पोर्ट 3000 पूरी तरह से काम करता है।

इसका क्या कारण होगा?

अपडेट 1:

मुझे पता चला कि मेरे स्थानीय कंप्यूटर पर, EACCES की त्रुटि आ रही है क्योंकि मुझे उन कुछ पोर्ट्स को बाइंड करने के लिए नोड को रूट के रूप में चलाना होगा। मुझे नहीं पता कि ऐसा क्यों होता है, लेकिन sudo का उपयोग इसे ठीक करता है। हालाँकि, यह स्पष्ट नहीं करता है कि मैं इसे हेरोकू पर कैसे ठीक करूँगा। हरोकू पर रूट के रूप में चलाने का कोई तरीका नहीं है, इसलिए मैं पोर्ट 80 पर कैसे सुन सकता हूं?


23
पारंपरिक रूप से 1024 से कम पोर्ट्स को एलिवेटेड परमिशन की आवश्यकता होती है। हरोकू पर आप न तो पोर्ट 80 सुनते हैं, न आप पर्यावरण वैरिएबल के माध्यम से बताते हैं कि पोर्ट को सुनें, और उनकी राउटिंग लेयर को पोर्ट 80 को किनारे पर बांधने दें।
5

आपके अपडेट 1 ने मेरी मदद की। 'सूदो नोड myporgram.js' ने इसे चलाया।
कृपाण

जवाबों:


352

अपने कार्य केंद्र पर चल रहा है

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

तो एक उच्च बंदरगाह की कोशिश करो, या के माध्यम से उन्नत विशेषाधिकार के साथ चलाते हैं sudo। आपके द्वारा निम्न पोर्ट का उपयोग करने के लिए बाध्य विशेषाधिकार को डाउनग्रेड कर सकते हैं process.setgidऔर process.setuid

हरखू पर चल रहा है

हर्को पर अपने ऐप चलाते समय आपको पोर्ट पर्यावरण चर में निर्दिष्ट पोर्ट का उपयोग करना होगा।

Http://devcenter.heroku.com/articles/node-js देखें

const server = require('http').createServer();
const port = process.env.PORT || 3000;

server.listen(port, () => console.log(`Listening on ${port}`));

3
क्या इसका मतलब है कि मुझे हरोकू द्वारा प्रदान किए गए पोर्ट का उपयोग करना है, और फिर वे 80 के पोर्ट को स्थानांतरित करने के लिए पर्दे के पीछे कुछ जादू करेंगे? क्या होगा अगर मैं पोर्ट 80 पर कुछ नहीं चलाना चाहता हूं?
19

12
हाँ। आप केवल उस पोर्ट के बारे में सुन सकते हैं जो हम आपको $ PORT पर बताते हैं। हम आपके पोर्ट पर 80 या 443 रूट करने का ध्यान रखते हैं। जैसे ही हम आपके डायनो को इधर-उधर करते हैं, वास्तविक पोर्ट सभी समय बदल जाता है। कुछ ही समय में इस बिंदु पर हम केवल सार्वजनिक रूप से 80 और 443 से मार्ग का समर्थन
विल

@Will, उस प्रतिबंध उठाने का कोई मौका? विशेष रूप से, 80 या 443 के अलावा बंदरगाहों पर सुनने में सक्षम होने के नाते? यह एक बहुत ही प्रतिबंधक सेट है, सभी चीजों पर विचार किया जाता है।
घीस

2
आप अपने ऐप को http और https से अलग पोर्ट पर क्यों चलाना चाहते हैं?
विल

1
@Will मैं Heroku पर एक साधारण गेम सर्वर होस्ट करना चाहूंगा। एकता crossdomain.xmlको 843 पोर्ट के माध्यम से स्थानांतरित करने की आवश्यकता है ।
पोल्कोवनिकोव।

178

गैर-विशेषाधिकार प्राप्त उपयोगकर्ता (रूट नहीं) 1024 से नीचे बंदरगाहों पर एक सुनने का सॉकेट नहीं खोल सकता है।


5
अपवोट - यह एक अच्छा सामान्य नियम है, लेकिन इसके अपवाद हैं, उदाहरण के लिए, लिनक्स पर 'क्षमताएं'।
मिकमेकाना

3
आपने बस मुझे डिबग के घंटे बचाए। मुझे इसके बारे में पता नहीं था।
मल्हारक

6
मुझे यह पसंद नहीं है, हालांकि, मैं sudoनोड (gulp वास्तव में) का उपयोग करते हुए एक एक्सप्रेस सर्वर चलाने के लिए नहीं करना चाहता । तो समझ में नहीं आता है
प्रकोप

ज्ञान का यह टुकड़ा
mauris

4
@blamb तब का उपयोग MeetMehta के समाधान ^);
Ruffin

108

इस संदर्भ लिंक की जाँच करें :

पोर्ट 80 का उपयोग करने के लिए सुरक्षित उपयोगकर्ता अनुमति दें

याद रखें, हम आपके एप्लिकेशन को रूट उपयोगकर्ता के रूप में नहीं चलाना चाहते हैं, लेकिन एक अड़चन है: आपके सुरक्षित उपयोगकर्ता के पास डिफ़ॉल्ट HTTP पोर्ट (80) का उपयोग करने की अनुमति नहीं है। आप लक्ष्य एक ऐसी वेबसाइट को प्रकाशित करने में सक्षम हो सकते हैं, जिसे आगंतुक URL जैसे उपयोग करने के लिए आसान से नेविगेट करके उपयोग कर सकते हैं http://ip:port/

दुर्भाग्य से, जब तक आप रूट के रूप में साइन इन नहीं करते हैं, आपको सामान्य रूप से URL का उपयोग करना होगा http://ip:port- जैसे कि पोर्ट नंबर> 1024।

बहुत सारे लोग यहां फंस जाते हैं, लेकिन समाधान आसान है। वहाँ कुछ विकल्प हैं, लेकिन यह एक मुझे पसंद है। निम्नलिखित कमांड टाइप करें:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

अब, जब आप एक नोड एप्लिकेशन को बताते हैं कि आप इसे पोर्ट 80 पर चलाना चाहते हैं, तो यह शिकायत नहीं करेगा।


5
यह निश्चित रूप से सबसे अच्छा समाधान है।
मार्क लैजेंडिजक

1
@MarkLagendijk: धन्यवाद मार्क। मैंने भी वही प्रश्न गलत तरीके से पूछा और यहाँ पर विस्तृत उत्तर दिया है stackoverflow.com/questions/23281895/… । इसे बेझिझक संपादित भी कर सकते हैं।
मेहता

6
यह उत्तर क्यों नहीं है
खालिद्दोहम्मद

@KhaledMohamedP: खुशी है कि यह मदद मिली :)
मेहता

कौन कहता है कि यह अभी भी pm2 मॉड्यूल के साथ काम नहीं करता है। अपने pm2 को मारें pm2 killऔर इसका उपयोग करें ।
प्रशांत जया

10

पोर्ट पुनर्निर्देशन करने के लिए एक और तरीका है:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 900 -j REDIRECT --to-port 3000

और अपने सर्वर को> 1024 पोर्ट पर चलाएँ:

require('http').createServer().listen(3000);

पीएस उसी तरह से (443) पोर्ट के लिए किया जा सकता है।


1
शुक्रिया शुक्रिया! इसने मुझे सुरक्षित बंदरगाहों के लिए एक घंटे की डिबगिंग, एसएसएल पुनर्निर्देशन के लिए एक और घंटे की बचत की, और मुझे एडब्ल्यूएस लाइटस्टाइल पर एक विकास सर्वर की दृश्यता को प्रतिबंधित करने की भी अनुमति दी (जो आईपी पते द्वारा अनुरोधों को ठीक करने की अनुमति नहीं देता है)।
मिगेलमोरिन

3

इसका मतलब है कि नोड परिभाषित पोर्ट पर सुनने में सक्षम नहीं है। इसे 1234 या 2000 या 3000 जैसी किसी चीज़ में बदलें और अपने सर्वर को पुनरारंभ करें।


3

हे भगवान!! मेरे मामले में मैं ....listen(ip, port)इसके बजाय कर रहा था ...listen(port, ip)और यह त्रुटि फेंक रहा था संदेश:Error: listen EACCES localhost

मैं पोर्ट नंबर> = 3000 का उपयोग कर रहा था और यहां तक ​​कि व्यवस्थापक पहुंच के साथ भी प्रयास किया गया था। कुछ भी काम नहीं किया। फिर एक करीब से देखने के साथ, मैंने इस मुद्दे पर गौर किया। इसे बदल दिया ...listen(port, ip)और सब कुछ ठीक काम करना शुरू कर दिया !!

अगर किसी और के लिए उपयोगी है तो बस इस मामले में ...


धन्यवाद! मुझे भी यही समस्या थी। मैं होस्टनाम, पोर्ट का उपयोग करके अन्य सभी एपीआई का उपयोग कर रहा हूं।
डेविड

मुझे यह समस्या तब हुई जब मैं वेकान डूकर छवि को चलाने की कोशिश कर रहा था। मैंने इस टिप का उपयोग करके हल किया। धन्यवाद।
33ngelo Polotto

@ dilip-muthukurussimana क्या आपने ....listen(ip, port)अपने उत्तर में (चार के साथ .) इरादा किया था ? मुझे यह महसूस करने में एक मिनट का समय लगा क्योंकि आप तर्कों के क्रम के बारे में बात कर रहे थे।
bschlueter

हां, मेरा मतलब केवल तर्कों का आदेश था। Pls ....वहाँ (चार डॉट्स) नहीं है, जो मुझे लगा कि स्पष्ट था।
दिलीप मुथुकुरसिमाना

2

मुझे अपने मैक पर यह त्रुटि मिली क्योंकि यह एपाचे सर्वर को डिफ़ॉल्ट रूप से उसी पोर्ट का उपयोग करके चलाता था जो नोड सर्वर द्वारा उपयोग किया जाता था जो कि मेरे मामले में पोर्ट 80 था। मुझे बस इतना करना था कि इसे रोक दिया जाए। sudo apachectl stop

आशा है कि यह किसी की मदद करता है।


2

मुझे अपने मैक पर भी यह त्रुटि मिली। मैं npm run devविंडोज में अपना नोडोड्स एप्लिकेशन चलाने के लिए उपयोग करता हूं और यह ठीक काम करता है। लेकिन मुझे अपने मैक पर यह त्रुटि मिली - error given was: Error: bind EACCES null:80

इसे हल करने का एक तरीका इसे रूट एक्सेस के साथ चलाना है। आप उपयोग कर सकते हैं sudo npm run devऔर आपको अपना पासवर्ड डालने की आवश्यकता होगी।

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

संदर्भ: http 80 पोर्ट पर सुनते समय Node.js त्रुटि हुई (अनुमति अस्वीकृत)


2

मुझे इसी तरह की समस्या थी कि यह पोर्ट 8080 पर चलने से इनकार कर रहा था, लेकिन यह भी किसी भी अन्य।

बाहर निकलता है, यह इसलिए था क्योंकि env.localइसमें पढ़ी गई फ़ाइल में चर नामों के बाद टिप्पणी शामिल थी जैसे:

PORT=8080 # The port the server runs at

और इसने इसकी व्याख्या इस तरह की, पोर्ट " 8080 # The port the server runs at" का उपयोग करने की कोशिश की , जो स्पष्ट रूप से एक अमान्य पोर्ट (-1) है। टिप्पणियों को हटाकर इसे पूरी तरह से हल कर दिया।

विंडोज 10 और गिट बश का उपयोग करके।


मुझे पता है कि यह यहाँ वर्णित समस्या नहीं है , लेकिन यह किसी को वहाँ मदद कर सकता है। मैं इस सवाल पर उतरा कि मेरे जवाब के लिए समस्या की तलाश है, इसलिए ... शायद?


हां, मैंने यह अनुभव किया है। .Env फ़ाइलों में मानों के बाद टिप्पणियाँ इसका कारण बन सकती हैं।
शाम

1

याद रखें कि यदि आप sudo को 80 पोर्ट में बाँधने के लिए उपयोग करते हैं और env वैरिएबल PORT & NODE_ENV का उपयोग कर रहे हैं, तो आपको उन वेरिएक्स को पुनः प्राप्त करना होगा, जैसे आप अब रूट प्रोफाइल के तहत हैं न कि आपकी यूजर प्रोफाइल। तो, यह मेरे मैक पर काम करने के लिए मैंने निम्नलिखित किया:

sudo su
export NODE_ENV=production
export PORT=80
docpad run

1

यह तब होता है जब आप जिस पोर्ट पर स्थानीय रूप से होस्ट करने का प्रयास कर रहे हैं, वह पोर्टफॉवर्ड है


1

प्रयास करें:

http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html

स्थापित करने के बाद, आप निम्नलिखित फ़ोल्डर में जिस पोर्ट नंबर का उपयोग करना चाहते हैं, उसके नाम के साथ एक फ़ाइल जोड़ सकते हैं:

यह chmod का उपयोग करके 500 अनुमतियाँ दें और उस उपयोगकर्ता के स्वामित्व को परिवर्तित करें जिसे आप प्रोग्राम चलाना चाहते हैं।

उसके बाद, अपने प्रोजेक्ट में "ऑर्बिटबाइंड नोड ..." उस उपयोगकर्ता के रूप में करें।


1

इस लाइन में विशेष रूप से server.js में पोर्ट नंबर बदलने से मेरी त्रुटि हल हो गई

const port = process.env.PORT || 8085;

मैंने अपने पोर्ट नंबर को 8080 से 8085 में बदल दिया।

आशा करता हूँ की ये काम करेगा।


0

कई अलग-अलग तरीकों की कोशिश करने के बाद, मेरी खिड़कियों पर IIS को फिर से स्थापित करने से समस्या हल हो गई।


0

मेरी त्रुटि का उपयोग करके हल किया गया है (Windows पर)

app.set('PORT', 4000 || process.env.PORT);

app.listen(app.get('PORT'), <IP4 address> , () => {
    console.log("Server is running at " + app.get('PORT'));
});

Windows फ़ायरवॉल में नेटवर्क तक पहुँचने के लिए NodeJS ऐप को अनुमति दें।


0

पुनरारंभ पर्याप्त नहीं था! समस्या को हल करने का एकमात्र तरीका निम्नलिखित है:

आपको उस पोर्ट पर चलने वाली सेवा को मारना होगा।

cmd पर, व्यवस्थापक के रूप में चलाएँ, फिर टाइप करें: netstat -aon | खोजें / मैं "सुन रहा हूँ"

फिर आपको सक्रिय सेवा के साथ एक सूची मिलेगी, उस पोर्ट की खोज करें जो 4200 पर चल रहा है और प्रक्रिया आईडी का उपयोग करें जो इसे मारने के लिए अंतिम कॉलम है

: टास्ककिल / एफ / पीआईडी ​​2652

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