Узел.в 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-ошибка была: Error: bind EACCES null: 80 mac.
Решение #1-это дать корневой доступ и запустить его (что является обычным). используйте "sudo npm run dev" и вам нужно ввести пароль, это работает для меня. надеюсь, что это может помочь!
ссылки:узел.ошибка JS EACCES при прослушивании порта http 80 (разрешение отказано)
Comments