SERVER/NODE.JS

[NodeJS] 윈도우10 기반 NodeJS서버 도메인과 SSL 적용

비너발트 2025. 1. 2. 16:37

 

Windows 10 + NodeJS

 

 

AWS 를 사용하지 않고 따로 구축하는 이유

AWS는 굉장히 좋은 서비스이긴 하나 금전적인 이유 그리고 사용방법에 대한 숙련도 이슈로 심각한 문제를 겪을 수 있기 때문에 되도록 사용을 하지 않으려 합니다 다들 한 번씩은 들어보셨을 과금폭탄이라는 문제를 겪는다면 생각만 해도 끔찍하기 때문에 저는 직접 구축해 보는 경험도 할 겸 윈도우 기반 NodeJS서버를 구축해 보기로 했습니다

 

개인적으로 사용할때만 쓰지 않기로 하고 현업에서 쓴다면 물론 써야겠죠!😁

 

그리고 국내에선 NodeJs 환경이 썩.. 흔하지 않은지 호스팅업체에서도 생각보다 사양대비 훨씬 비싸게 서비스하고 있다는 것도 한몫했습니다 JSP 환경도 마찬가지였습니다

 

어떤 식으로 구축했는지?

처음엔 우분투를 설치해서 공부해 볼 겸 리눅스환경에서 해보려다가 시간이 너무 오래 걸릴 것 같아 윈도우기반 서버를 설치하기로 했습니다 데모 서버라서 서버이전을 하는 건 크게 어려울 것 같지 않았기 때문입니다 물론 시간은 걸리겠지만🤔

 

서버 PC는 집에서 노는 PC를 준비하고 iptime DDNS 서비스로 호스트IP 를 고정시켜 주고 도메인을 구매한 뒤 레코드 CNAME으로 마찬가지로 DDNS 호스트명을 고정시켜 줬습니다

 

이후 도메인에 SSL을 적용시키려고 letsencrypt SSL을 설치하려 했더니 selfHosting에서 계속 막혔습니다.. 포트도 열려있는데 아직도 왜 안 됐는지 해결을 못했는데😭 계속 시도하면 7일 접근차단된다고 해서 유료 SSL을 구매해서 설치를 완료했습니다

 

 

//NodeJS app.js

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

// SSL
// 1) 개인키, 서버 인증서, 체인 인증서 파일 읽어오기
const privateKey = fs.readFileSync('C:/key.pem', 'utf8');
const certificate = fs.readFileSync('C:/crt.pem', 'utf8');
const ca = fs.readFileSync('C:/.pem', 'utf8'); 

// 2) HTTPS 서버에 필요한 옵션 생성
const credentials = {
  key: privateKey,
  cert: certificate,
  ca: ca,
};

// 미들웨어
app.set("view engine", "ejs");
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.use("/static", express.static(__dirname + "/static"));
// 도메인 인증용
app.use("/.well-known", express.static(__dirname + "/.well-known"));

// 3) 기존 app 대신, https 서버를 직접 구동
const httpsServer = https.createServer(credentials, app);

// 라우터
const indexRouter = require("./routes");
const favoritesRouter = require("./routes/favorites");
const searchRouter = require("./routes/search");
const usersRouter = require("./routes/users");
const detailRouter = require("./routes/detail");

app.use("/", indexRouter);
app.use("/users", usersRouter);
app.use("/favorites", favoritesRouter);
app.use("/detail", detailRouter);

//  404
app.get("*", (req, res) => {
  res.status(404).render("404");
});

db.sequelize.sync({ force: false }).then((result) => {
  // 4) HTTPS 포트 지정 후 서버 시작
  httpsServer.listen(443, () => {
    console.log('HTTPS Server running on port 443');
  });
});

// -------------------------
// 여기에 http 서버를 추가하여 리다이렉트 시킨다!!
// -------------------------
const httpServer = http.createServer((req, res) => {
  res.writeHead(301, {
    Location: 'https://' + req.headers.host + req.url
  });
  res.end();
});

httpServer.listen(80, () => {
  console.log('HTTP Server (for redirect) running on port 80');
});

 

다음에는 다시 세팅할 일이 생긴다면  Nginx , PHP , NodeJS, Mysql 조합으로 다시 구축하면서 방법을 작성해 보겠습니다