Узел.приложение js не может работать на порту 80, даже если нет другого процесса, блокирующего порт


Я запускаю экземпляр Debian на Amazon EC2 с узлом.Яш установлены. Если я запускаю код ниже:

http = require('http');

http.createServer(function (request, response){
  response.writeHead(200, {'Content-Type':'text/plain'});
  response.end('Hello Worldn');
}).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)

теперь, когда я проверяю, есть ли процесс (как root в случае, если что-то скрыто), прослушивающий порт 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

Я должен обратите внимание, что debian имеет открытый порт 80 в качестве входящего правила, если это имеет значение.

мой вопрос: Что я делаю не так? Почему я не могу определить процесс прослушивания порта 80? Почему он заблокирован в Debian? Какие шаги я должен предпринять, чтобы получить код работает правильно?

7 87

7 ответов:

код ошибки EACCES означает, что у вас нет надлежащих разрешений для запуска приложений на этом порту. В системах Linux, любой порт ниже 1024 требует корневого доступа.

вместо запуска на порту 80 вы можете перенаправить порт 80 на порт вашего приложения (>1024) с помощью

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

Это будет работать, если ваше приложение работает на порту 3000.

короткий ответ: вы можете разрешить доступ узла к этому порту с помощью:

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

ответ

обратите внимание, что если у вас есть 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

вам нужно будет включить соответствующие модули apache:

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

...и теперь вы можете подключиться к http://myLocalServer.

для тех, кто ищет быстрое и простое решение для среда разработки, переадресация портов через ssh может быть хорошей альтернативой:

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

это перенаправляет порт 80 на localhost в порт 3000 на localhost.

Это должно быть Запуск от имени root (привилегированные порты). Чтобы отменить его, просто нажмите CTRL-C в терминале. (Вы можете добавить -f флаг, чтобы команда выполнялась в фоновом режиме, но затем вам нужно найти ее снова, чтобы убить он.)

это решение требует, чтобы у вас было SSH сервер работает локально. это можно сделать быстро, но пожалуйста, имейте в виду последствия для безопасности, если вы находитесь на общей сети. Возможно, вы захотите применить хотя бы некоторый уровень дополнительной безопасности (отключить пароль и корневой логин).

лично я только когда-либо использовать это на моей локальной машине. Я не уверен, как это влияет на скорость обработки ваших запросов, если вы запустите это на производство, может, у кого-то есть идея. В любом случае, вам нужно будет убедиться, что эта команда продолжает работать все время, что вызывает больше головных болей. Ибо рабочих сред, Я предлагаю использовать обратный прокси, как nginx.

Я получил ту же ошибку и я попытался запустить мое приложение с помощью sudo и он работал для меня.

без 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

код ошибки EACCES означает, что у вас нет надлежащих разрешений для запуска приложений на этом порту. В системах Linux, любой порт ниже 1024 требует корневого доступа.

запустите программу с помощью sudo права доступа. Беги sudo su команда перед запуском программы.