Node.js ऐप पोर्ट 80 पर नहीं चल सकता, भले ही पोर्ट को ब्लॉक करने की कोई अन्य प्रक्रिया न हो


94

मैं Node.js स्थापित के साथ Amazon EC2 पर डेबियन का एक उदाहरण चला रहा हूं। यदि मैं नीचे कोड चलाता हूं:

http = require('http');

http.createServer(function (request, response){
  response.writeHead(200, {'Content-Type':'text/plain'});
  response.end('Hello World\n');
}).listen(80);
console.log("Running server at port 80");

मुझे आउटपुट मिलता है जो बताता है कि पोर्ट 80 पर सुनने की एक और प्रक्रिया है:

Running server at port 80

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EACCES
    at errnoException (net.js:901:11)
    at Server._listen2 (net.js:1020:19)
    at listen (net.js:1061:10)
    at Server.listen (net.js:1127:5)
    at Object.<anonymous> (/home/admin/nodetests/nodetest.js:6:4)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

अब जब मैं यह देखने के लिए जाँच करता हूँ कि क्या कोई प्रक्रिया है (जैसा कि कुछ भी छिपा हुआ है) पोर्ट 80 का उपयोग करके सुन रहा है:

netstat -tupln

मुझे नीचे आउटपुट मिलता है, जो मुझे बताता है कि पोर्ट 80 पर कुछ भी नहीं सुन रहा है:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1667/sshd       
tcp6       0      0 :::22                   :::*                    LISTEN      1667/sshd

मुझे ध्यान देना चाहिए कि डेबियन के पास इनबाउंड नियम के रूप में 80 खुला पोर्ट है अगर इससे कोई फर्क पड़ता है।

मेरा सवाल है: मैं क्या गलत कर रहा हूं? कैसे मैं 80 पोर्ट को सुनने की प्रक्रिया की पहचान नहीं कर सकता हूं? यह डेबियन में अवरुद्ध क्यों है? कोड को सही ढंग से चलाने के लिए मुझे क्या कदम उठाने चाहिए?

जवाबों:


197

त्रुटि कोड का EACCESमतलब है कि आपके पास उस पोर्ट पर एप्लिकेशन चलाने के लिए उचित अनुमति नहीं है। लिनक्स सिस्टम पर, 1024 से नीचे के किसी भी पोर्ट को रूट एक्सेस की आवश्यकता होती है।


5
इस प्रकार, sudo नोड myapp.js यह करेगा यदि आपके पास sudo का उपयोग करने के लिए प्राधिकरण है (बस किसी भी संपादक के लिए इसे से निपटने)।
एलेक्सा

20
@ एलेक्सा लेकिन एक सर्वर को रूट के रूप में चलाना कोई बड़ी संख्या नहीं है
पैट्रिक इवांस

1
फिर आप पोर्ट 80 पर नोड कैसे चलाते हैं? तुम बस चाहिए ... नहीं और एक प्रॉक्सी का उपयोग करें?
एलेक्सा

9
@PatrickEvans मुझे लगता है कि सबसे अच्छा अभ्यास एक अलग बंदरगाह पर चलने के लिए होगा और सिर्फ एक पोर्ट-अग्रेषण नियम स्थापित करना होगा जैसा कि यहां उल्लेख किया गया है: stackoverflow.com/questions/16573668/…
एलेक्सा

73

पोर्ट 80 पर चलने के बजाय आप पोर्ट 80 को अपने एप्लिकेशन के पोर्ट (> 1024) का उपयोग करके पुनर्निर्देशित कर सकते हैं

iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000

यदि आपका एप्लिकेशन पोर्ट 3000 पर चल रहा है तो यह काम करेगा।


1
इसे किया। पता चला कि आपको एक ताजा डेबियन इंस्टॉलेशन में iptables चलाने के लिए रूट होना होगा, अन्यथा $ PATH इसे इंगित नहीं करेगा।
ब्रायन ये

हाँ, यह शायद इसे करने का सबसे आसान तरीका था। मैं Google क्लाउड कम्प्यूट पर हूं जिसने पोर्ट 80 को छूने पर मुझे मुद्दे दिए। यह बहुत अच्छा था। धन्यवाद।
एंडी

यह स्वीकृत समाधान होना चाहिए। वेब सर्वर को सुडो के रूप में चलाना खतरनाक है, संभावित रूप से एक हमलावर रूट एक्सेस दे रहा है यदि आवेदन में कोई भेद्यता है; इसके अलावा, यदि एप्लिकेशन किसी भी फाइल को बनाने के लिए थे, तो वे अन्य उपयोगकर्ताओं के लिए अप्राप्य होंगे, जिससे आप sudoऔर भी अधिक उपयोग कर पाएंगे ।
jesusiniesta

यकीन नहीं क्यों, लेकिन Ubuntu 14.04 पर यह मेरे लिए काम नहीं किया। अब मैं ssh के माध्यम से पोर्ट फ़ॉरवर्डिंग का उपयोग करता हूं, जो कि उतना ही आसान है। मैंने नीचे एक उत्तर पोस्ट किया ।
पैनेटर

19

संक्षिप्त उत्तर: आप उस पोर्ट का उपयोग करके नोड एक्सेस की अनुमति दे सकते हैं:

setcap 'cap_net_bind_service=+ep' /path/to/nodejs

लंबा जवाब

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

नए नोड संस्करणों पर काम नहीं कर सकते


इसने चाल चली। @LinuxMint - sudo ने 'cap_net_bind_service = + ep' / usr / लोकल / बिन / नोड सेट किया
संयुक्त

कभी-कभी एक अद्यतन स्थान पथ को नोड में बदल देगा, और यह काम करना बंद कर देगा। इसलिए आपको इसे फिर से नोड के नए पथ के लिए चलाने की आवश्यकता होगी।
स्टीमपॉवर

ऐसा लगता है कि यह अब पिछले नोड संस्करण 8 से काम नहीं करेगा। github.com/nodejs/node/issues/22648
timaw

6

ध्यान दें कि यदि आपके पास apacheचल रहा है, तो आप एक vhost पर रिवर्स प्रॉक्सी बना सकते हैं। यदि आपका नोड पोर्ट पर चल रहा है 8080:

<VirtualHost 127.0.0.1:80>
        ServerName myLocalServer

        ProxyPass        /  http://localhost:8080/
        ProxyPassReverse /  http://localhost:8080/
</VirtualHost>

बेशक, इसमें सर्वर जोड़ें /etc/hosts:

127.0.0.1    myLocalServer

आपको संबंधित अपाचे मॉड्यूल को सक्षम करने की आवश्यकता होगी:

sudo a2enmod proxy_html
sudo a2enmod proxy_http
sudo a2enmod proxy_connect
sudo a2enmod proxy_ajp
sudo service apache2 restart

... और अब आप इससे जुड़ सकते हैं http://myLocalServer


3

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

ssh -L 80:localhost:3000 yourusername@localhost -N

यह लोकलहोस्ट पर पोर्ट 80 पर लोकलहोस्ट पर 3000 पोर्ट करता है।

इसे रूट (विशेषाधिकार प्राप्त पोर्ट) के रूप में चलाने की आवश्यकता है । इसे रद्द करने के लिए, बस टर्मिनल में ctrl-c मारा। (आप जोड़ सकते हैं-f पृष्ठभूमि में कमांड चलाने के लिए ध्वज को , लेकिन फिर आपको इसे मारने के लिए फिर से खोजने की आवश्यकता है)।

इस समाधान के लिए आपको एक ssh सर्वर को स्थानीय रूप से चलाने की आवश्यकता होती है । यह जल्दी से किया जा सकता है , लेकिन यदि आप एक साझा नेटवर्क पर हैं तो सुरक्षा निहितार्थों को ध्यान में रखें। आप कम से कम कुछ अतिरिक्त सुरक्षा (पासवर्ड और रूट लॉगिन अक्षम करना) लागू करना चाह सकते हैं।

मैं व्यक्तिगत रूप से कभी भी इसका उपयोग अपनी स्थानीय मशीन पर करता हूं। मुझे यकीन नहीं है कि यदि आप इसे उत्पादन पर चलाते हैं, तो यह आपके अनुरोधों की प्रसंस्करण गति को कैसे प्रभावित करता है, शायद किसी को इसका अंदाजा हो। वैसे भी, आपको यह सुनिश्चित करने की आवश्यकता होगी कि यह कमांड हर समय चलता रहे, जो अधिक सिरदर्द का परिचय देता है। के लिए उत्पादन वातावरण , मैं एक उपयोग करने का सुझाव nginx तरह रिवर्स प्रॉक्सी


2

हेक्सासैनाइड उत्तर सही है। लेकिन क्या इस काम को करने का कोई उपाय है?

इसका जवाब है हाँ।

कैसे?

आप reverse proxyउदाहरण के लिए nginx reverse proxyपोर्ट पर रन के लिए उपयोग कर सकते हैं 80और प्रॉक्सी को ip:portउस स्थान पर गंतव्य के लिए पास कर सकते हैं जो इसका उपयोग करता है।

आप इसे उपयोग करके सेट कर सकते हैं docker containerजिससे जीवन और भी आसान हो जाता है। यह डॉकटर हब में nginx का आधिकारिक निर्माण है जिसे आप इसे खींच सकते हैं।

इसका उपयोग करने में और भी अधिक लाभ हैं reverse proxyकि आप इसे गूगल कर सकते हैं।


0

मुझे वही त्रुटि मिली है और मैंने sudo का उपयोग करके अपना एप्लिकेशन चलाने की कोशिश की और यह मेरे लिए काम कर गया।

बिना सूदो के

mansi@mansi:~/NodePractice$ node myFirst.js 
events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: listen EACCES 0.0.0.0:80
    at Object.exports._errnoException (util.js:870:11)
    at exports._exceptionWithHostPort (util.js:893:20)
    at Server._listen2 (net.js:1224:19)
    at listen (net.js:1273:10)
    at Server.listen (net.js:1369:5)
    at Object.<anonymous> (/home/mansi/NodePractice/myFirst.js:6:4)
    at Module._compile (module.js:410:26)
    at Object.Module._extensions..js (module.js:417:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)

और सुडो के साथ

mansi@mansi:~/NodePractice$ sudo node myFirst.js 
^C

... जो ठीक वही है जो आप नहीं करना चाहते हैं। यह सुरक्षा मुद्दे बनाता है।
bvdb

-1

PORT 80 का उपयोग करने के लिए कुछ विशेष अनुमतियों की आवश्यकता होती है। sudoऐप के रनिंग स्टेटमेंट से पहले इस्तेमाल करने से मेरी समस्या हल हो गई। उदाहरण के लिए, यदि आप अपना ऐप चलाने के लिए npm का उपयोग कर रहे हैं, तो आप टाइप कर सकते हैंsudo npm start


1
यह उत्तर दूसरों द्वारा पहले से उपलब्ध कराई गई सामग्री का उत्तर देने के लिए कुछ नहीं जोड़ता है। यदि आप अतिरिक्त जानकारी जोड़ रहे हैं तो कृपया केवल उत्तर दें।
ब्रायन येह

-2

त्रुटि कोड का EACCESमतलब है कि आपके पास उस पोर्ट पर एप्लिकेशन चलाने के लिए उचित अनुमति नहीं है। लिनक्स सिस्टम पर, 1024 से नीचे के किसी भी पोर्ट को रूट एक्सेस की आवश्यकता होती है।

कार्यक्रम को sudoपरमिट के साथ चलाएं । sudo suप्रोग्राम चलाने से पहले कमांड चलाएं ।


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