Узел.приложение 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 ответов:
код ошибки
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