포트 80(Ubuntu/Linode)에서 Node.js를 실행하는 경우의 모범 사례
첫 번째 설정 중입니다.Node.js
의 서버cloud Linux node
그리고 저는 이 사건의 세부 사항들에 대해 꽤 생소합니다.Linux admin
(참고로 저는 Apache를 동시에 사용하려고 하는 것이 아닙니다.)
모든 것이 올바르게 설치되었지만 사용하지 않는 한root login
들을 수 없습니다.port 80
노드를 포함합니다.하지만 보안상의 이유로 루트로 실행하지는 않을 것입니다.
다음 중 가장 좋은 방법은 무엇입니까?
- 안전하게 / 샌드박스로 보호되도록 노드에 대한 적절한 사용 권한 / 사용자를 설정하시겠습니까?
- 이러한 제약 조건 내에서 포트 80을 사용할 수 있습니다.
- 노드를 시작하고 자동으로 실행합니다.
- 콘솔로 전송된 로그 정보를 처리합니다.
- 기타 일반적인 유지보수 및 보안 문제.
포트 80 트래픽을 다른 수신 포트로 전달해야 합니까?
감사해요.
포트 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
.
포트 80을 사용할 수 있는 안전한 사용자 권한 부여
응용 프로그램을 루트 사용자로 실행하지는 않지만 안전한 사용자에게 기본 HTTP 포트(80)를 사용할 수 있는 권한이 없다는 문제가 있습니다.당신의 목표는 다음과 같이 사용하기 쉬운 URL로 이동하여 방문자가 사용할 수 있는 웹 사이트를 게시하는 것입니다.http://ip:port/
이 루트로 하지 않는 한, 당신은 " 을스럽게루도트로지않그하인합는다니다유한"와 같은 해야 할 입니다.http://ip:port
여기서 포트 번호 > 1024.
많은 사람들이 여기에 갇히지만, 해결책은 쉽습니다.몇 가지 선택지가 있지만 이것이 제가 좋아하는 것입니다.다음 명령을 입력합니다.
sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
이제 Node 응용 프로그램에 포트 80에서 실행하기를 원한다고 말하면 불만이 없습니다.
이 참조 링크를 확인하십시오.
포트 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());
});
자세한 내용은 이 전체 참조를 참조하십시오.
포트 80(원래 질문)에 대해서는 Daniel이 정확하게 맞습니다.나는 최근에 이사했습니다.https
그리고 전환해야 했습니다.iptables
SSL 인증서를 관리하는 가벼운 nginx 프록시에 연결합니다.저는 그것을 다루는 방법에 대한 가브리엘의 요지와 함께 유용한 답을 찾았습니다.기본적으로 나는
OpenSSL을 통해 SSL CSR(인증서 서명 요청)을 생성
openssl genrsa 2048 > private-key.pem openssl req -new -key private-key.pem -out csr.pem
- 이 중 한 곳에서 실제 인증서를 받았습니다(저는 우연히 코모도를 사용했습니다).
- 설치된 nginx
변내용경을 했습니다.
location
/etc/nginx/conf.d/example_ssl.conf
location / { proxy_pass http://localhost:3000; proxy_set_header X-Real-IP $remote_addr; }
개별 인증서를 함께 -ing하여 nginx의 인증서를 포맷하고 my nginx에서 연결했습니다.
example_ssl.conf
주석이 것,에서 ' ...) 파일 (그고주석filename을없것들, '이서에니'제다습, ...)ssl_certificate /etc/nginx/ssl/cert_bundle.cert; ssl_certificate_key /etc/nginx/ssl/private-key.pem;
그것이 다른 누군가의 두통을 덜어줄 수 있기를 바랍니다.순수 노드 방식으로 이 작업을 수행할 수 있지만 nginx는 신속하고 효과적이었습니다.
언급URL : https://stackoverflow.com/questions/16573668/best-practices-when-running-node-js-with-port-80-ubuntu-linode
'programing' 카테고리의 다른 글
Visual Studio(C#, VB)에서 "32비트 선호" 컴파일러 플래그는 무엇을 의미합니까? (0) | 2023.05.26 |
---|---|
템플릿 형식의 C# 일반 new()에 인수 전달 (0) | 2023.05.26 |
SQL Server 2008 R2에서 CONCAT 기능을 사용하려면 어떻게 해야 합니까? (0) | 2023.05.26 |
Node.js에서 기본 HTML 로드 (0) | 2023.05.26 |
Python 3에서 바이트에 대한 b' 접두사 없이 인쇄 (0) | 2023.05.26 |