Помилка Node.js EACCES під час прослуховування у більшості портів


250

Я тестую додаток (сподіваюсь, що він працює на heroku, але у мене також є проблеми на місцевому рівні). Це дає мені помилку EACCES, коли вона працює http.Server.listen () - але вона трапляється лише в деяких портах.

Отже, локально я бігаю:

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?


23
Порти менше 1024 традиційно вимагають підвищених дозволів. На Heroku ви не слухаєте порт 80, ви слухаєте порт, який вони вам повідомляють через змінні середовища, і дозволяють їх шару маршрутизації обробляти порт 80, прив'язуючи до краю.
Mâtt Frëëman

Ваше оновлення 1 допомогло мені. 'sudo node myporgram.js' змусив його працювати.
Шабля

Відповіді:


352

Працює на вашій робочій станції

Як правило, процеси, що працюють без привілеїв 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, () => console.log(`Listening on ${port}`));

3
Чи означає це, що я повинен використовувати порт, наданий Heroku, і тоді вони зроблять якусь магію за кадром, щоб перенести це на порт 80? Що робити, якщо я хочу запустити щось не на порт 80?
jwegner

12
Так. Ви можете слухати лише порт, про який ми вам говоримо, на $ PORT. Ми дбаємо про маршрутизацію 80 або 443 до вашого порту. Фактичний порт змінюється весь час, коли ми переміщаємо вашу диноту. На даний момент ми тільки публічно підтримувати маршрутизацію від 80 і 443.
Вілл

@ Будете, чи є шанс зняти це обмеження? Зокрема, вміти слухати на портах, відмінних від 80 чи 443? Це дуже обмежувальний набір, всі речі враховані.
ghayes

2
Чому ви хочете, щоб ваша програма працювала на іншому порту, ніж http та https?
Буде

1
@ Я хотів би розмістити простий ігровий сервер на Heroku. Єдності потрібно перенести crossdomain.xmlчерез 843 порт.
polkovnikov.ph

178

Непривілейований користувач (не root) не може відкрити розетку прослуховування на портах нижче 1024.


5
Оновлено - це хороше загальне правило, але з цього є винятки, наприклад, "можливості" в Linux.
mikemaccana

3
Ти щойно врятував мені години налагодження. Я про це не знав.
Мальхарк

6
Мені цього не подобається, я не хочу це робити sudoпід час запуску експрес-сервера за допомогою вузла (насправді gulp). Тож не має сенсу
блага

ця частинка мудрості
mauris

4
@blamb Тоді використовуйте рішення MeetMehta ; ^)
ruffin

108

Перевірте це посилання :

Надати безпечний користувачеві дозвіл на використання порта 80

Пам'ятайте, що ми НЕ хочемо запускати ваші програми як основного користувача, але є помилка: ваш безпечний користувач не має дозволу використовувати порт 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, вона не скаржиться.


5
Це, безумовно, найкраще рішення.
Марк Лагендійк

1
@MarkLagendijk: Дякую. Я також запитав те саме питання помилково і розмістив детальну відповідь тут stackoverflow.com/questions/23281895/… . Ви можете також редагувати його.
Зустріньтеся з Мехтою

6
чому це не відповідь 👍
KhaledMohamedP

@KhaledMohamedP: Радий, що це допомогло :)
Знайомтесь з Мехтою

Хто каже, що це все ще не працює з модулем pm2. Вбийте свій pm2 за допомогою pm2 killта відтворіть його.
Прасант Джая

10

Ще один підхід - зробити перенаправлення портів:

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) порту.


1
Дякую дякую! Це врятувало мені одну годину налагодження безпечних портів, ще одну годину для перенаправлення SSL, а також дозволило мені обмежити видимість сервера розробки на AWS Lightstail (що не дозволяє точної настройки запитів за IP-адресою).
miguelmorin

3

Це означає, що вузол не здатний прослуховувати певний порт. Змініть його на щось на зразок 1234 або 2000 або 3000 та перезапустіть сервер.


3

О БОЖЕ МІЙ!! У моєму випадку я робив ....listen(ip, port)замість цього, ...listen(port, ip)і це підсилювало помилку msg:Error: listen EACCES localhost

Я використовував номери портів = = 3000 і навіть намагався отримати доступ адміністратора. Нічого не вийшло. Потім при ближчому перегляді я помітив проблему. Змінив це, ...listen(port, ip)і все почало нормально працювати !!

Просто виклик цього на випадок, якщо це корисно комусь іншому ...


Дякую! У мене була така ж проблема. Я звик до всіх інших API, що використовують ім’я хоста, порт.
Девід

У мене була ця проблема, коли я намагався запустити зображення докера Wekan. Я вирішив, використовуючи цю пораду. Дякую.
Венло Полотто

@ dilip-muthukurussimana Чи ви мали намір ....listen(ip, port)відповісти у своїй відповіді (з чотирма .)? Знадобилося мені хвилину, щоб зрозуміти, що ти говорив про порядок аргументів через це.
bschlueter

Так, я мав на увазі лише порядок аргументів. Pls не ставити туди ....(чотири крапки), що я вважав очевидним.
Діліп Мутукурсуссімана

2

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

Сподіваюся, що це комусь допоможе.


2

Я отримав цю помилку і на моєму комп'ютері. Я використовую npm run devдля запуску програми Nodejs в Windows, і вона працює чудово. Але я отримав цю помилку на своєму mac - error given was: Error: bind EACCES null:80.

Один із способів вирішити це - запустити його з кореневим доступом. Ви можете використовувати sudo npm run devі вам потрібно буде ввести свій пароль.

Зазвичай бажано обслуговувати вашу програму на непривілейованому порту, наприклад 3000, який працюватиме без кореневих прав.

довідка: Помилка Node.js EACCES під час прослуховування на порту http 80 (дозвіл відхилений)


2

У мене була подібна проблема, що вона забороняла працювати на порту 8080, але також і будь-яку іншу.

Виявляється, це було тому, що env.localфайл, який він читав, містив коментарі після імен змінних, таких як:

PORT=8080 # The port the server runs at

І це інтерпретували так, намагаючись використовувати порт "8080 # The port the server runs at ", який, очевидно, недійсний порт (-1). Видалення коментарів цілком вирішило це.

До речі, використовуючи Windows 10 та Git Bash.


Я знаю, що це не зовсім описана тут проблема, але це може допомогти комусь там. Я приземлився на це питання, шукаючи проблему для своєї відповіді, так що ... можливо?


Так, я це пережив. Коментарі до значень у файлах .env можуть спричинити це.
Даноз

1

Пам'ятайте, якщо ви використовуєте sudo для прив'язки до порту 80 і використовуєте змінну env PORT & NODE_ENV, ви повинні повторно експортувати ці параметри, оскільки ви зараз перебуваєте під корінним профілем, а не за своїм профілем користувача. Отже, щоб змусити це працювати на моєму Mac, я зробив наступне:

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

1

це трапляється, якщо порт, на якому ви намагаєтесь розмістити локально, перебуває через порт


1

Спробуйте автоматичне зв’язування:

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

Після установки ви можете додати файл із назвою номера порту, який ви хочете використовувати, у такій папці: / etc / authbind / byport /

Надайте йому 500 дозволів за допомогою chmod та змініть право власності на користувача, під яким хочете запустити програму.

Після цього зробіть "authbind node ..." як цей користувач у вашому проекті.


1

Мою помилку вирішили лише змінивши номер порту в server.js, особливо в цьому рядку

const port = process.env.PORT || 8085;

Я змінив свій номер порту на 8085 з 8080 року.

Сподіваюся, це допомагає.


0

Спробувавши багато різних способів, повторна установка IIS на моїх вікнах вирішила проблему.


0

Мою помилку усунено за допомогою (у Windows)

app.set('PORT', 4000 || process.env.PORT);

app.listen(app.get('PORT'), <IP4 address> , () => {
    console.log("Server is running at " + app.get('PORT'));
});

Дозволити додатку NodeJS отримати доступ до мережі у брандмауері Windows.


0

перезавантаження було недостатньо! Єдиний спосіб вирішити проблему полягає в наступному:

Ви повинні вбити службу, яка працює в цьому порту.

у cmd, запустіть як адміністратор, а потім введіть: netstat -aon | знайти / я "слухаю"

тоді ви отримаєте список з активною службою, знайдете порт, який працює в 4200, і використовуйте ідентифікатор процесу, який є останнім стовпцем, щоб його вбити

: taskkill / F / PID 2652

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.