Я запускаю экземпляр Debian на Amazon EC2 с установленным Node.js. Если я запустил код ниже:
http = require('http');
http.createServer(function (request, response){
response.writeHead(200, {'Content-Type':'text/plain'});
response.end('Hello World\n');
}).listen(80);
console.log("Running server at port 80");
Я получаю вывод ниже, который говорит мне, что через порт 80 прослушивается другой процесс:
Running server at port 80
events.js:72
throw er; // Unhandled 'error' event
^
Error: listen EACCES
at errnoException (net.js:901:11)
at Server._listen2 (net.js:1020:19)
at listen (net.js:1061:10)
at Server.listen (net.js:1127:5)
at Object.<anonymous> (/home/admin/nodetests/nodetest.js:6:4)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
Теперь, когда я проверяю, есть ли процесс (как root, если что-то скрыто) прослушивает порт 80, используя:
netstat -tupln
Я получаю следующий вывод, который говорит мне, что на порту 80 ничего не прослушивается:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1667/sshd
tcp6 0 0 :::22 :::* LISTEN 1667/sshd
Я должен отметить, что в debian порт 80 открыт как правило для входящего трафика, если это имеет значение.
У меня вопрос: что я делаю не так? Почему я не могу идентифицировать процесс, прослушивающий порт 80? Почему он заблокирован в Debian? Какие шаги нужно предпринять, чтобы код работал правильно?
источник
Вместо работы на порту 80 вы можете перенаправить порт 80 на порт вашего приложения (> 1024), используя
Это будет работать, если ваше приложение работает на порту 3000.
источник
sudo
еще больше.Краткий ответ: вы можете разрешить узлу доступ к этому порту, используя:
setcap 'cap_net_bind_service=+ep' /path/to/nodejs
длинный ответ
Редактировать:
Может не работать на новых версиях узлов
источник
Обратите внимание, что если у вас
apache
запущен, вы можете создать обратный прокси на виртуальном хосте. Если ваш узел работает на порту8080
:Конечно, добавить сервер в
/etc/hosts
:Вам нужно будет включить соответствующие модули apache:
... и теперь вы можете подключиться к
http://myLocalServer
.источник
Для тех, кто ищет быстрое и простое решение для среды разработки , переадресация портов через ssh может быть хорошей альтернативой:
Это перенаправляет порт 80 на локальном хосте на порт 3000 на локальном хосте.
Его нужно запускать как root (привилегированный порт). Чтобы отменить его, просто нажмите ctrl-c в терминале. (Вы можете добавить
-f
флаг, чтобы команда выполнялась в фоновом режиме, но затем вам нужно будет найти его снова, чтобы убить его).Это решение требует, чтобы у вас был запущен локальный ssh-сервер . Это можно сделать быстро , но помните о последствиях для безопасности, если вы находитесь в общей сети. Возможно, вы захотите применить хотя бы некоторый уровень дополнительной безопасности (отключить пароль и вход в систему с правами root).
Лично я использую это только на своей локальной машине. Я не уверен, как это повлияет на скорость обработки ваших запросов, если вы запустите это в продакшене, возможно, у кого-то есть идея. В любом случае вам нужно убедиться, что эта команда работает все время, что вызывает больше головной боли. Для производственных сред я предлагаю использовать обратный прокси, например nginx .
источник
ответ на гексацианид правильный. но есть ли какое-нибудь решение, чтобы заставить эту работу работать?
ответ - да.
как?
вы можете использовать,
reverse proxy
например, запуститьnginx reverse proxy
порт on80
и передать прокси в пункт назначения,ip:port
который использует этот узел.вы можете настроить это с помощью,
docker container
что делает жизнь еще проще. это официальная сборка nginx в docker hub, которую вы можете вытащить.есть еще больше преимуществ в использовании,
reverse proxy
что вы можете погуглить.источник
У меня такая же ошибка, и я попытался запустить свое приложение с помощью sudo, и у меня это сработало.
без sudo
и с sudo
источник
Для использования PORT 80 требуются особые разрешения. Использование
sudo
перед запуском инструкции приложения решило мою проблему. например, если вы используете npm для запуска своего приложения, вы можете ввестиsudo npm start
источник
Код ошибки
EACCES
означает, что у вас нет необходимых разрешений для запуска приложений на этом порту. В системах Linux для любого порта ниже 1024 требуется root-доступ.Запускаем программу с
sudo
разрешением. Выполнитеsudo su
команду перед запуском программы.источник