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 на мои окна решила проблему.