Узел.ошибка JS EACCES при прослушивании большинства портов

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

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

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

11 ответов


работает на вашей рабочей станции

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

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

работает на heroku

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

см.http://devcenter.heroku.com/articles/node-js

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

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

непривилегированного пользователя (не root) не может открыть сокет на портах ниже 1024.


проверить это ссылка:

Дайте Безопасное Разрешение Пользователя На Использование Порта 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\``

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


другой подход - сделать перенаправление портов:

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

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

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

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


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


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

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

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


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

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


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

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

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


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

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

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

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

после этого выполните " узел authbind ...- как пользователь вашего проекта.


Я получил эту ошибку на моем Mac. Я использую "npm run dev" для запуска моего приложения nodejs в windows, и он отлично работает. но я получил эту ошибку на моем mac-ошибка была: ошибка: bind EACCES null: 80 mac.

Решение #1 дает root-доступ и запускает его (что обычно). используйте "sudo npm run dev" и вам нужно ввести пароль, это работает для меня. надеюсь, это поможет!

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