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
실행중인 경우 가상 호스트에서 역방향 프록시를 만들 수 있습니다. 노드가 포트에서 실행중인 경우 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 같은 역방향 프록시를 .
답변
헥사 시안화물 대답이 맞습니다. 그러나 이것을 작동시키는 해결책이 있습니까?
대답은 ‘예’입니다.
어떻게?
당신은 사용할 수 있습니다 reverse proxy
예를 들어 실행 a를 nginx reverse proxy
포트 80
및 대상에 프록시를 통과 ip:port
노드의 사용을.
당신 docker container
은 삶을 더 쉽게 만드는 사용하여 이것을 설정할 수 있습니다 . 이것은 당신이 그것을 가져올 수있는 도커 허브 에있는 nginx 의 공식 빌드입니다 .
reverse proxy
Google 을 사용 하면 더 많은 이점 이 있습니다.
답변
나는 같은 오류가 발생했고 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