포트 80 (Ubuntu / Linode)으로 Node.js를 실행할 때 모범 사례 [닫기]


260

에 첫 번째 Node.js서버를 설정 cloud Linux node중이며에 대한 세부 사항이 상당히 익숙 Linux admin합니다. (BTW 나는 동시에 아파치를 사용하려고하지 않습니다.)

모든 것이 올바르게 설치되었지만을 사용하지 않으면 노드 root login로들을 수 없습니다 port 80. 그러나 보안상의 이유로 루트로 실행하지는 않습니다.

가장 좋은 방법은 무엇입니까?

  1. 보안 / 샌드 박스 화되도록 노드에 대한 좋은 권한 / 사용자를 설정 하시겠습니까?
  2. 이 제한 조건 내에서 포트 80을 사용하도록 허용하십시오.
  3. 노드를 시작하고 자동으로 실행하십시오.
  4. 콘솔로 전송 된 로그 정보를 처리합니다.
  5. 기타 일반적인 유지 관리 및 보안 문제.

포트 80 트래픽을 다른 수신 포트로 전달해야합니까?

감사

답변:


532

포트 80

클라우드 인스턴스에서 수행하는 작업은이 명령을 사용하여 포트 80을 포트 3000으로 리디렉션하는 것입니다.

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

그런 다음 포트 3000에서 Node.js를 시작합니다. 포트 80에 대한 요청은 포트 3000에 매핑됩니다.

또한 /etc/rc.local파일을 편집 하고 해당 줄에서을 뺀 값을 추가해야합니다 sudo. 머신이 부팅 될 때 리디렉션이 추가됩니다. 당신은 필요가 없습니다 sudo/etc/rc.local명령이 거기 실행되기 때문에 root시스템이 부팅 할 때.

로그

사용 영원히 당신의 Node.js를을 시작하는 모듈. 충돌이 발생하면 다시 시작되고 콘솔 로그를 파일로 리디렉션합니다.

부팅시 시작

포트 리디렉션을 위해 편집 한 파일에 Node.js 시작 스크립트를 추가하십시오 /etc/rc.local. 시스템이 시작될 때 Node.js 실행 스크립트가 실행됩니다.

디지털 오션 및 기타 VPS

이는 Linode뿐만 아니라 Digital Ocean, AWS EC2 및 기타 VPS 제공 업체에도 적용됩니다. 그러나 RedHat 기반 시스템 /etc/rc.local/ect/rc.d/local입니다.


3
그 대답에 감사드립니다.
로봇 버그

21
BTW, 우분투에서는 /etc/rc.local입니다
kehers

12
종종 "-i eth0"플래그는 가상 개인 서버에 문제가됩니다. 필요에 따라 eth0을 교체하십시오.
JHAWN

7
Node.js 시작 스크립트를에 추가하면 시스템 부팅시 /etc/rc.local실행되지 root않습니까? 포트 80 리디렉션의 목적을 무효화합니다.
jamix

4
포트 리디렉션이 작동하려면 대상 포트도 방화벽에서 작동해야합니다. 부팅시 노드 인스턴스를 시작하는 WRT에서는 사용자를 지정할 수있는 배포판의 init 스크립트 / 시스템 파일을 사용합니다.
bk138

116

안전한 사용자에게 포트 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에서 실행하라고 지시하면 불평하지 않습니다.

참조 링크를 확인하십시오


9
이것이 더 좋고 더 간단한 대답입니다.
Kyle Chadha

2
또한 여기에 자세한 답변이 추가되었습니다. stackoverflow.com/questions/23281895/…
Mehta 만나기

1
NGINX와 같은 웹 서버는 포트 80에서 어떻게 실행됩니까? 비슷한 일을합니까?
에릭 앤드류 루이스

1
@EricAndrewLewis : 나는 그것이 의존한다고 말할 것이다. 루트가 아닌 모드로 서버를 실행하면이 오류가 나타납니다. Nginx 서버를 루트 사용자로 실행하고 있다면 어떨까요? 또한 일반 사용자로 실행 중이고 오류가 발생하는 경우. 위 명령을 실행하여 포트에 액세스 할 수있는 안전한 권한을 부여하십시오. stackoverflow.com/questions/31369480/…
Mehta를 만나십시오

16

포트 80 (또는 443)에 바인딩 한 후 루트 권한을 삭제하십시오.

이렇게하면 포트 80/443을 보호 된 상태로 유지하면서 요청을 루트로 제공 할 수 없습니다.

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}

위 함수를 사용한 전체 작업 예 :

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

전체 참조 에서 자세한 내용을 참조하십시오 .


9

포트 80 (원래의 질문 이었음)의 경우 Daniel이 옳습니다. 나는 최근 에 SSL 인증서를 관리하는 가벼운 nginx 프록시 로 이동하여 https전환해야했습니다 iptables. 나는 유용하다고 답을 과 함께 요지gabrielhpugliese 그 처리 방법에. 기본적으로 나는

바라건대 다른 사람이 두통을 덜 수 있기를 바랍니다. 나는 이것을하는 순수한 노드 방법이 있다고 확신하지만 nginx는 빠르며 효과가있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.