IT

Node.js 앱은 포트를 차단하는 다른 프로세스가 없더라도 포트 80에서 사용할 수 없습니다.

lottoking 2020. 9. 4. 07:42
반응형

Node.js 앱은 포트를 차단하는 다른 프로세스가 없더라도 포트 80에서 사용할 수 없습니다.


Node.js는 Amazon EC2에서 Debian 인스턴스를 실행하고 있습니다. 아래 코드를 실행하면 :

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)

이제 다음을 사용하여 포트 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

데비안은 차이가 나는 경우 인바운드 규칙으로 포트 80이 열려있는 점에 유의해야합니다.

내 질문은 : 내가 뭘 잘못하고 있니? 포트 80을 수신하는 프로세스를 발광 할 수없는 이유는 무엇입니까? 데비안에서 차단되는 이유는 무엇입니까? 코드를 실행해야 할 단계를 수행해야합니까?


오류 코드 EACCES는 해당 포트에서 응용 프로그램을 사용할 수있는 권한이 없음을 의미합니다. Linux 시스템에서 1024 미만의 모든 포트에는 루트 액세스가 필요합니다.


포트 80에서 실행하는 대신 다음을 사용하여 포트 80을 애플리케이션의 포트 (> 1024)로 리디렉션 할 수 있습니다.

iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000

애플리케이션이 포트 3000에서 실행중인 경우 작동합니다.


간단한 대답 : 다음을 사용하여 해당 포트에 대한 노드 액세스를 허용 할 수 있습니다.

setcap 'cap_net_bind_service=+ep' /path/to/nodejs

긴 대답

편집하다 :

새 노드 버전에서 작동하지 않습니다.


apache중인 실행 경우 가상 호스트에서 reverse-프록시를 만들 수 있습니다. 노드가 포트에서 실행중인 경우 8080:

<VirtualHost 127.0.0.1:80>
        ServerName myLocalServer

        ProxyPass        /  http://localhost:8080/
        ProxyPassReverse /  http://localhost:8080/
</VirtualHost>

물론 다음에 서버를 추가하십시오 /etc/hosts.

127.0.0.1    myLocalServer

관련 아파치 모듈을 활성화해야합니다.

sudo a2enmod proxy_html
sudo a2enmod proxy_http
sudo a2enmod proxy_connect
sudo a2enmod proxy_ajp
sudo service apache2 restart

... 이제에 딱 수 있습니다 http://myLocalServer.


개발 환경을 위한 빠르고 쉬운 솔루션을 찾는 사람들에게는 ssh를 통한 포트 포워딩이 좋은 대안이 될 수 있습니다.

ssh -L 80:localhost:3000 yourusername@localhost -N

이것은 localhost의 포트 80을 localhost의 포트 3000으로 전달합니다.

루트 (권한이있는 포트) 실행 해야합니다 . 취소하려면 터미널에서 Ctrl-c를 누르십시오. ( -f백그라운드에서 명령을 실행 하도록 플래그를 추가 할 수 있지만 종료하려면 다시 찾아야합니다).

이 솔루션을 사용하려면 로컬에서 실행 되는 ssh 서버 가 있어야합니다 . 신속하게 수행 할 수 있지만 공유 네트워크에있는 경우 보안 의미를 염두에 두십시오. 최소한 일정 수준의 추가 보안을 적용 할 수 있습니다 (비밀번호 및 루트 로그인 비활성화).

나는 개인적으로 이것을 내 로컬 컴퓨터에서만 사용합니다. 프로덕션에서 실행하면 요청 처리 속도에 어떤 영향을 미치는지 잘 모르겠습니다. 누군가 아이디어가있을 수 있습니다. 어쨌든이 명령이 항상 실행되도록해야하므로 더 많은 골칫거리가 발생합니다. 들어 생산 환경 , 내가 사용하는 것이 좋습니다 의 nginx 같은 역방향 프록시를 .


나는 같은 오류가 발생했고 sudo를 사용하여 내 응용 프로그램을 실행 해 보았고 그것은 나를 위해 일했습니다.

sudo없이

mansi@mansi:~/NodePractice$ node myFirst.js 
events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: listen EACCES 0.0.0.0:80
    at Object.exports._errnoException (util.js:870:11)
    at exports._exceptionWithHostPort (util.js:893:20)
    at Server._listen2 (net.js:1224:19)
    at listen (net.js:1273:10)
    at Server.listen (net.js:1369:5)
    at Object.<anonymous> (/home/mansi/NodePractice/myFirst.js:6:4)
    at Module._compile (module.js:410:26)
    at Object.Module._extensions..js (module.js:417:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)

그리고 sudo

mansi@mansi:~/NodePractice$ sudo node myFirst.js 
^C

PORT 80을 사용하려면 몇 가지 특별한 권한이 필요합니다. sudo앱의 문을 실행하기 전에 사용하면 문제가 해결되었습니다. 예를 들어 npm을 사용하여 앱을 실행하는 경우 다음을 입력 할 수 있습니다.sudo npm start


오류 코드 EACCES는 해당 포트에서 애플리케이션을 실행할 수있는 적절한 권한이 없음을 의미합니다. Linux 시스템에서 1024 미만의 모든 포트에는 루트 액세스가 필요합니다.

sudo권한으로 프로그램을 실행하십시오 . 실행 sudo su프로그램을 실행하기 전에 명령을.

참고 URL : https://stackoverflow.com/questions/18947356/node-js-app-cant-run-on-port-80-even-though-theres-no-other-process-blocking-t

반응형