নোড.জেএস অ্যাপ্লিকেশন পোর্ট ৮০ এ চলতে পারে না যদিও পোর্টটি ব্লক করার কোনও প্রক্রিয়া নেই


94

আমি নোড.জেএস ইনস্টল করে অ্যামাজন ইসি 2 তে ডিবিয়ান উদাহরণ চালাচ্ছি। যদি আমি নীচের কোডটি চালাই:

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)

এখন যখন আমি কোনও প্রক্রিয়া আছে কিনা তা পরীক্ষা করে দেখি (কোনও কিছুই গোপনের মূল হিসাবে) port০ বন্দরটিতে শোনার মাধ্যমে:

netstat -tupln

আমি নীচের আউটপুটটি পেয়েছি, যা আমাকে পোর্ট ৮০ তে কিছু শুনছে না বলে জানিয়েছে:

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 শুনার প্রক্রিয়াটি সনাক্ত করতে পারি না? এটি কেন দেবিয়ানকে অবরুদ্ধ করা হয়েছে? কোডটি সঠিকভাবে চলতে কি পদক্ষেপ নিতে হবে?

উত্তর:


198

ত্রুটি কোড EACCESমানে আপনার কাছে সেই বন্দরে অ্যাপ্লিকেশনগুলি চালানোর জন্য উপযুক্ত অনুমতি নেই। লিনাক্স সিস্টেমে, 1024 এর নীচের যে কোনও পোর্টের রুট অ্যাক্সেস প্রয়োজন।


5
সুতরাং, sudo নোড myapp.js এটি করবে যদি আপনার sudo ব্যবহার করার অনুমোদন থাকে (কেবল কোনও প্রাথমিকের জন্য এটি পরীক্ষা করা)।
অ্যালেক্সএমএ

21
@ অ্যালেক্সএমএ তবে রুট হিসাবে একটি সার্ভার চালানো কোনও বড় সংখ্যা নয়
প্যাট্রিক ইভান্স

4
তাহলে আপনি পোর্ট ৮০ তে নোডটি কীভাবে চালাবেন? আপনি কি ঠিক ... না এবং একটি প্রক্সি ব্যবহার করা উচিত?
অ্যালেক্সএমএ

9
@PatrickEvans আমি অনুমান সেরা অনুশীলনের একটি ভিন্ন পোর্টে চালানোর জন্য এবং শুধুমাত্র একটি বন্দর-ফরোয়ার্ড করলে নিয়ম স্থাপন করা হবে এখানে হিসাবে উল্লেখ করেছে: stackoverflow.com/questions/16573668/...
AlexMA

73

80 পোর্টে চলার পরিবর্তে আপনি 80 কে আপনার অ্যাপ্লিকেশনের বন্দরে (> 1024) পুনর্নির্দেশ করতে পারেন

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

আপনার অ্যাপ্লিকেশনটি 3000 পোর্টে চলতে থাকলে এটি কাজ করবে।


4
এটা করেছে. সন্ধান পেয়েছে যে একটি নতুন ডেবিয়ান ইনস্টলেশনতে আপনাকে iptables চালাতে রুট হতে হবে, অন্যথায় AT PATH এটি দেখায় না।
ব্রায়ান ইয়ে

হ্যাঁ এটি সম্ভবত এটি করার সহজতম উপায় ছিল। আমি গুগল ক্লাউড কম্পিউটেমে আছি যা পোর্ট ৮০ স্পর্শ করার সময় আমাকে সমস্যা দিয়েছে। ধন্যবাদ
অ্যান্ডি

এটি গ্রহণযোগ্য সমাধান হওয়া উচিত। ওয়েব সার্ভারকে sudo হিসাবে চালানো বিপজ্জনক, যদি অ্যাপ্লিকেশনটিতে কোনও দুর্বলতা থাকে তবে সম্ভাব্যভাবে আক্রমণকারীকে মূল অ্যাক্সেস দেয়; এছাড়াও, যদি অ্যাপ্লিকেশনটি কোনও ফাইল তৈরি করে থাকে তবে সেগুলি আপনাকে sudoআরও বেশি ব্যবহার করে তুলতে অন্য ব্যবহারকারীর জন্য অ্যাক্সেসযোগ্য হবে ।
jesusiniesta

নিশ্চিত না কেন, তবে উবুন্টু 14.04 এ এটি আমার পক্ষে কার্যকর হয়নি। আমি এখন ssh এর মাধ্যমে পোর্ট ফরওয়ার্ডিং ব্যবহার করি, যা ঠিক তত সহজ। আমি নীচে একটি উত্তর পোস্ট ।
প্যানিপিটার

20

সংক্ষিপ্ত উত্তর: আপনি ব্যবহার করে সেই বন্দরে নোড অ্যাক্সেসের অনুমতি দিতে পারেন:

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

দীর্ঘ উত্তর

সম্পাদনা করুন:

নতুন নোড সংস্করণে কাজ করতে পারে না


কৌতুকটি করেছিল @ লিনাক্সমিন্ট - সুডো সেটক্যাপ 'ক্যাপ_নেট_বাইন্ড_সার্ভিস = + এপি' / ইউএসআর / লোকাল / বিন / নোড
একত্রিত করুন

কখনও কখনও একটি আপডেট নোডে অবস্থানের পথ পরিবর্তন করে এবং এটি কাজ করা বন্ধ করে দেয়। নোডের নতুন পাথের জন্য আপনাকে এটিকে আবার চালাতে হবে।
স্টিফ পাওয়ার্ড

দেখে মনে হচ্ছে এটি আর আগের নোড সংস্করণটি কাজ করবে না g 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 -L 80:localhost:3000 yourusername@localhost -N

এটি লোকালহোস্টে 80 পোর্টটি লোকালহোস্টে 3000 পোর্টে ফরোয়ার্ড করে।

এটি রুট হিসাবে ( চালিত বন্দর) হিসাবে চালানো দরকার needs এটি বাতিল করতে, কেবল টার্মিনালে ctrl-c চাপুন। ( -fপটভূমিতে কমান্ডটি চালানোর জন্য আপনি পতাকাটি যুক্ত করতে পারেন তবে এটি হত্যা করার জন্য আপনাকে আবার এটি সন্ধান করতে হবে)।

এই সমাধানটির জন্য আপনার স্থানীয়ভাবে একটি ssh সার্ভার চালানো দরকারএটি দ্রুত সম্পন্ন করা যেতে পারে তবে আপনি যদি একটি ভাগ করা নেটওয়ার্কে থাকেন তবে দয়া করে সুরক্ষা সম্পর্কিত বিষয়টি মনে রাখবেন। আপনি কমপক্ষে অতিরিক্ত সুরক্ষার কিছু স্তর প্রয়োগ করতে চান (পাসওয়ার্ড এবং রুট লগইন অক্ষম করুন)।

আমি ব্যক্তিগতভাবে কেবল আমার স্থানীয় মেশিনে এটি ব্যবহার করি। আমি নিশ্চিত না যে এটি আপনার অনুরোধগুলির প্রক্রিয়াকরণের গতিকে কীভাবে প্রভাবিত করে যদি আপনি এটি উত্পাদন চালিয়ে যান, সম্ভবত কারও ধারণা আছে। যাইহোক, আপনাকে নিশ্চিত করতে হবে যে এই কমান্ডটি সর্বদা চলমান থাকে যা আরও বেশি মাথা ব্যথার পরিচয় দেয়। জন্য উৎপাদন পরিবেশের , আমি একটি ব্যবহার করার পরামর্শ দিই nginx মত বিপরীত প্রক্সি


2

hexacyanide উত্তর সঠিক। তবে এই কাজটি করার কোনও সমাধান আছে কি?

উত্তরটি হল হ্যাঁ.

কিভাবে?

আপনি reverse proxyউদাহরণস্বরূপ কোনও nginx reverse proxyপোর্ট অন চালাতে 80এবং প্রক্সিটি গন্তব্যে পৌঁছে দিতে পারেনip:port নোড এটি ব্যবহার করতে পারেন।

আপনি এটি ব্যবহার করে সেট আপ করতে পারেন docker containerযা জীবনকে আরও সহজ করে তোলে। এটি এনজিএনএক্সের অফিসিয়াল বিল্ড ডিকার হাবের এনগিনেক্সের যা আপনি এটি টানতে পারেন।

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)

এবং sudo সঙ্গে

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

... যা হ'ল আপনি যা করতে চান না। এটি সুরক্ষা সংক্রান্ত সমস্যা তৈরি করে।
বিভিডিবি

-2

ত্রুটি কোড EACCES মানে আপনার কাছে সেই বন্দরে অ্যাপ্লিকেশনগুলি চালানোর জন্য উপযুক্ত অনুমতি নেই। লিনাক্স সিস্টেমে, 1024 এর নীচের যে কোনও পোর্টের রুট অ্যাক্সেস প্রয়োজন।

অনুমতি নিয়ে প্রোগ্রামটি চালান sudosudo suপ্রোগ্রাম চালানোর আগে কমান্ড রান করুন ।


হেক্সাসায়ানাইডের উত্তরের পোস্টের মন্তব্যগুলি দেখুন। ধন্যবাদ
ব্রায়ান ইয়ে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.