Node.js Ошибка EACCES при прослушивании большинства портов

Я тестирую приложение (надеюсь, что он будет работать на геройку, но у меня есть проблемы локально). Это дает мне ошибку EACCES при запуске http.Server.listen() - но это происходит только на некоторых портах.

Итак, локально я запускаю:

[email protected]:~$ 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 пришла, потому что я должен запустить node как root, чтобы привязываться к этим определенным портам. Я не знаю, почему это происходит, но использование sudo исправляет его. Однако это не объясняет, как я исправлю это на Heroku. В Heroku нет возможности запускать root, поэтому как я могу прослушивать порт 80?

Ответ 1

Запуск на вашей рабочей станции

Как правило, процессы, выполняющиеся без привилегий root, не могут привязываться к портам ниже 1024.

Поэтому попробуйте порт более высокого уровня или запустите с повышенными привилегиями через sudo. Вы можете понизить привилегии после привязки к низкому порту, используя process.setgid и process.setuid.

.Бег на геройку

При запуске ваших приложений на heroku вы должны использовать порт, указанный в переменной среды PORT.

Смотрите http://devcenter.heroku.com/articles/node-js

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

server.listen(port, function() {
  console.log('Listening on ' + port);
});

Ответ 2

Непривилегированный пользователь (не root) не может открыть прослушивающий сокет на портах ниже 1024.

Ответ 3

Проверьте ссылку reference link:

Дайте безопасное разрешение пользователя на использование порта 80

Помните, мы НЕ хотим запускать ваши приложения от имени пользователя root, но есть загвоздка: ваш безопасный пользователь не имеет разрешения на использование порт HTTP по умолчанию (80). Ваша цель - иметь возможность публиковать веб-сайт, который посетители могут использовать, перейдя на простой в использовании URL-адрес, такой как http://ip:port/

К сожалению, если вы не войдете в систему как root, вам обычно придется использовать URL вроде http://ip:port - где номер порта> 1024.

Многие люди застряли здесь, но решение легко. Там несколько варианты, но это тот, который мне нравится. Введите следующие команды:

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

Теперь, когда вы сообщаете приложению Node, что вы хотите, чтобы оно запускалось на порту 80, это не будет жаловаться.

Ответ 4

Другим подходом является перенаправление портов:

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

И запустите сервер нa > 1024 портах:

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

ps то же самое можно было бы сделать для порта https (443), кстати.

Ответ 5

Это означает, что node не может прослушивать определенный порт. Измените его на 1234 или 2000 или 3000 и перезапустите сервер.

Ответ 6

OMG!! В моем случае я делал ....listen(ip, port) вместо ...listen(port, ip), и это вызывало ошибку msg: Error: listen EACCES localhost

Я использовал номера портов >= 3000 и даже пытался с доступом администратора. Ничего не получилось. Затем, с более близким переосмыслением, я заметил проблему. Изменил его на ...listen(port, ip), и все стало нормально работать.

Просто назовите это в случае, если это полезно кому-то еще...

Ответ 7

Я тоже получил эту ошибку на своем Mac. Я использую npm run dev для запуска моего приложения Nodejs в Windows, и оно работает нормально. Но я получил эту ошибку на моем Mac - error given was: Error: bind EACCES null:80.

Один из способов решить эту проблему - запустить его с правами root. Вы можете использовать sudo npm run dev, и вам потребуется ввести пароль.

Обычно предпочтительнее обслуживать ваше приложение через непривилегированный порт, например 3000, который будет работать без прав root.

ссылка: Ошибка EACCES Node.js при прослушивании через порт http 80 (разрешение отклонено)

Ответ 8

Я получил эту ошибку на своем mac, потому что он запускал сервер Apache по умолчанию, используя тот же самый порт, что и сервер node, который в моем случае был портом 80. Все, что мне нужно было сделать, это остановить его sudo apachectl stop

Надеюсь, это поможет кому-то.

Ответ 9

Помните, если вы используете sudo для привязки к порту 80 и используете переменные env PORT и NODE_ENV, вы должны повторно экспортировать эти vars, поскольку теперь вы находитесь под корневым профилем, а не с вашим профилем пользователя. Итак, чтобы заставить это работать на моем Mac, я сделал следующее:

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

Ответ 10

это происходит, если порт, который вы пытаетесь локально размещать, - это portfowarded

Ответ 11

Попробуйте authbind:

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

После установки вы можете добавить файл с именем номера порта, который вы хотите использовать в следующей папке:/etc/authbind/byport/

Дайте ему 500 разрешений с помощью chmod и измените право собственности на пользователя, которому вы хотите запустить программу.

После этого выполните "authbind node..." в качестве этого пользователя в вашем проекте.

Ответ 12

Попробовав много разных способов, переустановка IIS на мои окна решила проблему.