Узел.ошибка 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);
});
проверить это ссылка:
Дайте Безопасное Разрешение Пользователя На Использование Порта 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
попробуйте 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 (разрешение отказано)