Узел.в 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?

750   11  

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-ошибка была: Error: bind EACCES null: 80 mac.

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

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

Comments

    Ничего не найдено.