[http] 대부분의 포트에서 청취 할 때 Node.js EACCES 오류

앱을 테스트하고 있습니다 (허 로쿠에서 실행하기를 원하지만 로컬에서도 문제가 있습니다). http.Server.listen ()을 실행할 때 EACCES 오류가 발생하지만 일부 포트에서만 발생합니다.

그래서 로컬에서 실행 중입니다.

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 오류가 발생한다는 것을 알았습니다. 왜 이런 일이 발생하는지 모르겠지만 sudo를 사용하면 문제가 해결됩니다. 그러나 이것은 Heroku에서 어떻게 고칠 지 설명하지 않습니다. Heroku에서 루트로 실행할 방법이 없으므로 포트 80에서 어떻게들을 수 있습니까?



답변

워크 스테이션에서 실행

일반적으로 루트 권한없이 실행되는 프로세스는 1024 미만의 포트에 바인딩 할 수 없습니다.

따라서 더 높은 포트를 사용하거나을 통해 높은 권한으로 실행하십시오 sudo. 낮은 포트에 바인딩 한 후 권한을 다운 그레이드 할 수 있습니다.process.setgidprocess.setuid.

heroku에서 실행

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}`));


답변

권한이없는 사용자 (루트 아님)는 1024 미만의 포트에서 청취 소켓을 열 수 없습니다.


답변

참조 링크를 확인하십시오 .

안전한 사용자에게 포트 80 사용 권한 부여

우리는 응용 프로그램을 루트 사용자로 실행하고 싶지 않지만 장애가 있습니다. 안전한 사용자에게는 기본 HTTP 포트 (80)를 사용할 권한이 없습니다. 목표는 방문자가 사용하기 쉬운 URL로 이동하여 방문자가 사용할 수있는 웹 사이트를 게시하는 것입니다
http://ip:port/

불행히도 루트로 로그인하지 않으면 일반적으로 http://ip:port포트 번호> 1024 와 같은 URL을 사용해야합니다 .

많은 사람들이 여기에 붙어 있지만 해결책은 쉽습니다. 몇 가지 옵션이 있지만 이것이 내가 좋아하는 옵션입니다. 다음 명령을 입력하십시오.

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);

추신 https (443) 포트에 대해서도 동일하게 수행 할 수 있습니다.


답변

노드가 정의 된 포트에서 청취 할 수 없음을 의미합니다. 1234 또는 2000 또는 3000과 같은 것으로 변경하고 서버를 다시 시작하십시오.


답변

세상에! 제 경우에는 ....listen(ip, port)대신에 하고있었습니다...listen(port, ip) 하고 있었고 오류 msg가 발생했습니다.Error: listen EACCES localhost

포트 번호> = 3000을 사용하고 있었고 관리자 액세스로 시도했습니다. 아무것도 해결되지 않았습니다. 그런 다음 자세히 살펴보면서 문제를 발견했습니다. 로 변경...listen(port, ip) 하고 모든 것이 잘 작동하기 시작했습니다!

다른 사람에게 유용 할 경우를 대비하여 전화하십시오.


답변

노드 서버에서 사용하는 것과 동일한 포트를 사용하여 기본적으로 아파치 서버를 실행했기 때문에 내 Mac 에서이 오류가 발생했습니다. 내 경우에는 포트 80이었습니다. sudo apachectl stop

이것이 누군가를 돕기를 바랍니다.