[NodeJS] 윈도우10 기반 NodeJS서버 도메인과 SSL 적용
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 조합으로 다시 구축하면서 방법을 작성해 보겠습니다