반응형
- Nginx를 리버스 프록시로 설정 → Node.js 서버를 외부에 노출하지 않고 Nginx를 통해 트래픽을 전달
- 로드 밸런싱 → 여러 개의 Node.js 인스턴스를 띄우고 Nginx가 트래픽을 분산
- 정적 파일 서빙 → Nginx에서 정적 파일을 직접 제공
- 캐싱 설정 → 성능 향사아을 위한 캐싱 적용
- 압축(gzip, Brotli) 적용 → 트래픽 감소 및 성능 향상
- 보안 설정 (HTTPS, CORS, Rate Limiting 등)
프로젝트 구조
nginx-node-docker/
│── backend/ # Node.js 서버 코드
│ ├── server.js
│ ├── package.json
│ ├── Dockerfile
│── nginx/
│ ├── default.conf # Nginx 설정 파일
│ ├── Dockerfile
│── docker-compose.yml # Docker Compose 설정
Node.js 서버 코드(backend/server.js)
const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;
app.get("/", (req, res) => {
res.send("Hello from Node.js server!");
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
Node.js 서버의 Dockerfile (backend/Dockerfile)
# Node.js 기반 이미지 사용
FROM node:18-alpine
# 작업 디렉토리 설정
WORKDIR /app
# package.json과 package-lock.json 복사
COPY package.json ./
# 필요한 패키지 설치
RUN npm install
# 서버 코드 복사
COPY . .
# 컨테이너가 실행될 때 노출할 포트
EXPOSE 3000
# 애플리케이션 실행
CMD ["node", "server.js"]
Nginx 설정
Nginx 설정 파일 (nginx/default.conf)
# HTTP 서버 설정
server {
listen 80;
# 기본 서버 설정
server_name localhost;
# 정적 파일 서빙 (필요한 경우)
location /static/ {
root /usr/share/nginx/html;
index index.html;
}
# 리버스 프록시 설정
location / {
proxy_pass <http://backend>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 캐싱 설정 (예: 이미지, CSS, JS 파일)
location ~* \\.(?:ico|css|js|gif|jpe?g|png|woff2?|eot|ttf|svg)$ {
expires 6M;
access_log off;
add_header Cache-Control "public, max-age=15778800, immutable";
}
# Gzip 압축 활성화
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
}
Nginx의 Dockerfile (nginx/dockerfile)
# Nginx 공식 이미지 사용
FROM nginx:alpine
# 기본 설정 파일 덮어쓰기
COPY default.conf /etc/nginx/conf.d/default.conf
# 정적 파일을 제공하는 경우 (필요하면 추가)
COPY static/ /usr/share/nginx/html
Docker compose 설정 (docker-compose.yml)
version: "3.8"
services:
backend:
build: ./backend
container_name: node_backend
restart: always
ports:
- "3000:3000"
networks:
- app_network
nginx:
build: ./nginx
container_name: nginx_proxy
restart: always
ports:
- "80:80"
depends_on:
- backend
networks:
- app_network
networks:
app_network:
driver: bridge
실행 방법
Docker compose 실행
docker-compose up -d --build
추가 실습
1) 로드 밸런싱 적용
같은 Node.js 컨테이너를 여러 개 띄우고 Nginx가 트래픽을 분산하도록 설정할 수 있다.
- Nginx 설정 변경 (nginx/default.conf)
upstream backend_servers {
server backend1:3000;
server backend2:3000;
}
server {
listen 80;
location / {
proxy_pass http://backend_servers;
}
}
- docker-compose.yml에서 backend 인스턴스 여러 개 추가
services:
backend1:
build: ./backend
container_name: node_backend_1
networks:
- app_network
backend2:
build: ./backend
container_name: node_backend_2
networks:
- app_network
- 트래픽이 두 개의 Node.js 서버로 자동 분배됨!
2) HTTPS 적용
Let’s Encrypt 인증서를 사용하면 무료로 HTTPS 적용 가능. Nginx 설정을 다음과 같이 변경하면 HTTPS를 활성화할 수 있어.
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass <http://backend>;
}
}
Let’s Encrypt + Cerbot을 사용해서 인증서 자동 갱신 설정도 가능!
3) Rate Limiting (속도 제한)
Nginx에서 DDoS 방지, API 요청 제한을 걸 수 있다.
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass <http://backend>;
}
}
}
위 설정은 1초에 10개 요청까지 허용하고, 초과 시 제한함.
반응형
'backend' 카테고리의 다른 글
[Redis] Redis를 이용한 동시성 이슈 해결 실습 - Redlock (0) | 2025.02.20 |
---|---|
[Redis] Redis를 이용한 동시성 이슈 해결 실습해보기 - SETNX 사용 방법 (0) | 2025.02.20 |