본문 바로가기
백엔드

Node.js 로 https서버 생성하고PM2로 실행하기(404에러)

by 하_영 2023. 5. 25.

📌http로 연결을 해둔 상태에서 시작

https://hayoung-dev-story.tistory.com/30

 

[윈도우] AWS EC2인스턴스 생성 및 서버 배포(Nginx, PM2),403 forbidden 해결 방법

AWS에서 EC2 인스턴스 생성합니다. 이름을 적고 원하는 운영체제 선택 프리티어 사용가능으로 된 인스턴스로 사용 윈도우에서 인스턴스에 접근하기 위해서 PuTTY를 사용하는데 이 PuTTY로 인스턴스

hayoung-dev-story.tistory.com

 

 

(Node.js 기준)

웹서버에서 SSL인증서를 등록해서 HTTPS를 사용하려면 https 모듈을 사용해야한다.

서버를 실행시키는 파일에서 https로 서버를 만들어주면 된다. (보통 app.js )

 

기존 코드 (HTTP)

//서버연결
app.listen(5000, '0.0.0.0', (err) => {  
	if (err) {    console.log(`서버 연결 실패 : ${err}`);  
	} else {
	    console.log(`${env.PORT}서버 연결 성공`);
	}
});

HTTPS 모듈을 사용한 코드

const express = require('express');
const app = express();
const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('/private.key의 경로'),
  cert: fs.readFileSync('/certificate_combined.crt(두개의 crt결합) 의 경로')
}

//라우터
app.get('/', (req, res) => {
  res.send('this is HOME PAGE');
});

const server = https.createServer(options,app);
//app객체를 넣어서 app미들웨어,라우터를 server랑 연결

//서버연결
server.listen(5000,(err) => {
  if (err) {
    console.log(`서버 연결 실패 : ${err}`);
  } else {
    console.log(`https 서버 연결 성공`);
  }
});

보통 nginx에서 프론트의 https 포트를 443번으로 사용하기 때문에 웹서버에서는 443번이 아닌 다른 포트를 사용해줘야 한다. 이때 같은 포트를 사용하면 404에러가 난다.

 

일반적으로 웹서버는 항상 열어두어야 하기 때문에 PM2를 사용해서 서버를 열어두게된다.

PM2를 실행시키는 명령어

pm2 start npm --name "my-app-http" -- start
pm2 start npm --name "my-app-https" -- start -- --https

https 옵션을 붙이면 https 프로토콜을 사용해서 실행시키고, https옵션을 붙이지 않으면 http프로토콜을 사용해서 실행시키게 되는데

https 모듈을 사용해서 만든 서버일경우에는 이미 https 프로토콜을 사용하므로 https옵션을 사용해주지 않아도 된다.

443번 포트를 사용하면 URL에서 자동으로 포트번호가 숨겨지는데 웹서버에서 만든 HTTPS서버는 5000번 포트를 사용했기때문에 포트번호를 적어줘야한다.

 

 

→ 포트번호는 NGINX의 설정파일에서 리버스프록시를 사용해서 숨길수있다.

 server {
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        server_name  ticketwantit.shop;
        root         /home/ec2-user/ticketwantit/FE-TicketWantIt;

        location /api {
          proxy_pass https://ticketwantit.shop:5000; //포트번호 숨기기
        }

        ssl_certificate "/etc/nginx/hayoung/certificate_combined.crt";
        ssl_certificate_key "/etc/nginx/hayoung/private.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers PROFILE=SYSTEM;
        ssl_prefer_server_ciphers on;

       # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

       error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
   }