728x90
반응형

✅ 1. HTTPS 설정 예제 (ssl_certificate, ssl_certificate_key)

nginx
 
server {
    listen 443 ssl;                       # HTTPS 포트
    server_name example.com;             # 도메인명

    ssl_certificate     /etc/ssl/certs/example.com.crt;   # 인증서 경로
    ssl_certificate_key /etc/ssl/private/example.com.key; # 키 파일 경로
    ssl_protocols       TLSv1.2 TLSv1.3;  # 보안 프로토콜
    ssl_ciphers         HIGH:!aNULL:!MD5; # 암호화 알고리즘

    location / {
        root   /usr/share/nginx/html;
        index  index.html;
    }
}

Tip: Let's Encrypt로 무료 인증서를 자동 발급하려면 Certbot과 연동하세요.


✅ 2. Production용 Gzip 압축 + 캐시 설정

nginx
 
http {
    gzip on;
    gzip_comp_level 5;                    # 압축 레벨 (1~9)
    gzip_types text/plain application/json text/css application/javascript;

    server {
        location ~* \.(js|css|png|jpg|svg|woff2?)$ {
            expires 30d;                   # 30일 캐시
            add_header Cache-Control "public, max-age=2592000";
        }
    }
}

효과:

  • Gzip으로 응답 사이즈 최소화
  • 정적 자산에 강력한 캐시 적용 → 페이지 속도 향상

✅ 3. React / Vue 정적 배포용 Nginx 설정

nginx
 
server {
    listen 80;
    server_name yourdomain.com;

    root /usr/share/nginx/html;            # build 결과 위치 (예: React의 build/)
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;  # SPA 라우팅 지원
    }

    location ~* \.(js|css|png|jpg|svg|woff2?)$ {
        expires 7d;
        add_header Cache-Control "public";
    }
}

📦 build 결과물을 /usr/share/nginx/html에 복사한 뒤 도커 컨테이너로 배포하거나, EC2에 nginx 설치 후 serve하면 됩니다.


✅ 4. FastAPI / NestJS 백엔드 리버스 프록시 설정

nginx
 
server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass         http://localhost:8000;   # FastAPI / NestJS 서버
        proxy_http_version 1.1;
        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;
    }
}
  • NestJS 기본 포트: 3000, FastAPI 기본 포트: 8000
  • HTTPS 적용 시엔 위 예제와 ssl_certificate를 함께 설정하세요

✅ 요약


HTTPS 적용 ssl_certificate, listen 443 ssl
Gzip 압축 gzip on, gzip_types, gzip_comp_level
정적 프론트엔드 호스팅 root, try_files, `location ~* .(js
백엔드 API 연동 proxy_pass, proxy_set_header 등 리버스 프록시 설정
728x90
반응형
728x90
반응형

Nginx 기본 설정 파일 (nginx.conf) 예제이며, 지시자(directive)마다 한글 주석을 달아 이해하기 쉽게 구성해드렸습니다.
버전은 Nginx 1.24 기준이며, 대부분의 설정은 최신 버전에서도 동일하게 작동

# 전역 설정 영역 (Global Settings)
user  nginx;                    # Nginx 프로세스를 실행할 사용자 (리눅스 유저)
worker_processes  auto;        # 워커 프로세스 수 (CPU 수에 따라 자동 설정)

error_log  /var/log/nginx/error.log warn;  # 에러 로그 파일 경로 및 로그 수준
pid        /var/run/nginx.pid;             # PID 파일 경로

# 이벤트 처리 설정
events {
    worker_connections  1024;   # 각 워커 프로세스당 최대 동시 접속 수
}

# HTTP 서버 설정 블록
http {
    include       /etc/nginx/mime.types;    # MIME 타입 정의 포함
    default_type  application/octet-stream; # 기본 응답 Content-Type

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';  # 커스텀 로그 포맷 정의

    access_log  /var/log/nginx/access.log  main;  # 액세스 로그 경로 및 포맷 지정

    sendfile        on;            # sendfile() 사용 여부 (성능 향상)
    tcp_nopush      on;            # sendfile 최적화 (헤더와 콘텐츠를 한꺼번에 전송)
    tcp_nodelay     on;            # 지연 없이 패킷 즉시 전송

    keepalive_timeout  65;         # 연결 유지 시간 (초)
    types_hash_max_size 2048;      # MIME 타입 해시 테이블 크기

    include /etc/nginx/conf.d/*.conf;  # 개별 서버 블록 포함

    # 기본 서버 설정 (예시)
    server {
        listen       80;                    # 80번 포트로 수신
        server_name  localhost;            # 수신할 도메인 또는 IP

        # 에러 페이지 처리
        error_page 404 /404.html;          # 404 페이지 지정

        location = /404.html {
            root   /usr/share/nginx/html;  # 정적 파일 위치
        }

        # 정적 파일 서빙 경로
        location / {
            root   /usr/share/nginx/html;  # 정적 파일 기본 루트 디렉토리
            index  index.html index.htm;   # 기본 인덱스 파일 목록
        }

        # 예시: API 프록시 설정
        location /api/ {
            proxy_pass http://localhost:3000/;  # 백엔드 API 서버로 프록시
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }

        # 기타 에러 페이지 정의
        error_page 500 502 503 504 /50x.html;

        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

 

 

✅ 주요 디렉티브 요약

user Nginx 데몬 실행 사용자 지정
worker_processes 병렬로 처리할 프로세스 수
error_log 에러 로그 저장 경로와 로그 레벨
events 워커당 커넥션 제한 등 이벤트 처리 설정
http HTTP 설정을 포함한 서버 및 로깅 설정
server 하나의 가상 서버 블록
location URI 패턴에 따른 요청 처리 방식 정의
proxy_pass 리버스 프록시 백엔드 주소 지정
root 정적 파일 루트 디렉토리 설정
index index 파일 우선순위

 

728x90
반응형
728x90
반응형

🎯 왜 dev/prod 환경을 분리해야 할까?

항목개발 환경 (dev)운영 환경 (prod)
코드 변경 자주 변경, 테스트 위주 변경 최소화, 안정성 중시
로깅/디버깅 상세 로그, 리로드 기능 활성화 최소 로그, 보안 로그, 핫리로드 비활성화
외부 연동 로컬 DB, 모킹 서버 실제 DB, 외부 연동 시스템 사용
이미지 구성 bind-mount, 캐시 비활용 완전한 이미지 빌드, 멀티스테이지 빌드 활용
보안 민감 정보 노출 가능 환경변수로 암호화된 키, TLS, CORS 제약 등 적용

🧱 구조 설계 예시

my-app/
├── docker-compose.yml          # 공통 설정
├── docker-compose.dev.yml      # 개발 전용 override
├── docker-compose.prod.yml     # 운영 전용 override
├── Dockerfile
├── Dockerfile.prod             # 운영 빌드 전용 (최적화)
└── .env, .env.prod

📄 docker-compose.yml (공통 베이스)

version: "3.8"
services:
  app:
    image: my-app
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: development
    depends_on:
      - db

  db:
    image: postgres:15
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: devuser
      POSTGRES_PASSWORD: devpass

volumes:
  db_data:

🛠️ docker-compose.dev.yml

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/app          # 코드 바인딩
      - /app/node_modules
    environment:
      NODE_ENV: development
    command: npm run start:dev

✅ 주요 포인트:

  • 로컬 코드 변경 반영 (volumes)
  • 디버깅, 핫리로드 가능
  • 개발자용 .env 사용

🚀 docker-compose.prod.yml

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.prod
    environment:
      NODE_ENV: production
    command: npm run start:prod
    restart: always

✅ 주요 포인트:

  • 정적 이미지 빌드
  • restart: always 설정
  • 운영용 .env.prod 연동 가능

🐳 Dockerfile vs Dockerfile.prod 예시

Dockerfile (dev 용):

FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "run", "start:dev"]

Dockerfile.prod (운영 최적화):

dockerfile
 
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app .
CMD ["npm", "run", "start:prod"]

▶️ 실행 방법

  • 개발 환경:
     
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up --build
  • 운영 환경:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up --build -d

 

  • 추가로 .env 파일 분리 관리도 권장:
# .env.dev
DATABASE_URL=postgres://devuser:devpass@db:5432/dev

✅ 정리 요약

 

항목개발  환경 (dev) 운영 환경 (prod)
Dockerfile 빠른 빌드, 볼륨 mount 멀티스테이지, 경량화
docker-compose docker-compose.dev.yml docker-compose.prod.yml
실행 방식 -f docker-compose.dev.yml -f docker-compose.prod.yml
보안/최적화 X (속도 우선) ✅ 보안, 로그, 성능, 재시작 정책 적용
CI/CD 통합 활용 개발 테스트용, 로컬 디버깅 CD 파이프라인에 최종 이미지 사용 가능
728x90
반응형
728x90
반응형

🧱 Dockerfile vs docker-compose 비교


 

항목 Dockerfile docker-compose
목적 단일 애플리케이션의 이미지를 정의 여러 컨테이너(서비스)를 통합 실행 및 관리
사용 방식 docker build → docker run docker-compose up, down으로 전체 서비스 컨트롤
주요 기능 OS, 종속성, 코드 복사, CMD 설정 여러 컨테이너 연결, 네트워크, 볼륨, 환경 변수 설정
장점 이식성, 이미지 버전관리, CI/CD 연동 마이크로서비스 또는 개발환경 전반 구성 자동화
단점 네트워크, DB, 연동 구성은 따로 필요 복잡한 빌드 옵션은 Dockerfile에 위임 필요

🐳 예제: Spring Boot + PostgreSQL

📁 폴더 구조

spring-boot-app/
├── Dockerfile
├── docker-compose.yml
├── target/myapp.jar
└── application.yml

📌 Dockerfile (Spring Boot)

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/myapp.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

📌 docker-compose.yml

version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/mydb
      SPRING_DATASOURCE_USERNAME: user
      SPRING_DATASOURCE_PASSWORD: pass

  db:
    image: postgres:15
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

🟣 예제: NestJS + Redis

📁 폴더 구조

nestjs-app/
├── Dockerfile
├── docker-compose.yml
├── src/
└── package.json

📌 Dockerfile (NestJS)

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "run", "start:prod"]

📌 docker-compose.yml

version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - redis
    environment:
      REDIS_HOST: redis
      REDIS_PORT: 6379

  redis:
    image: redis:7

🔧 예제: Kotlin + MySQL

dockerfile
 
# Dockerfile (Ktor)
FROM openjdk:17
COPY build/libs/app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
# docker-compose.yml
version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - mysql
    environment:
      DB_HOST: mysql
      DB_USER: user
      DB_PASS: pass

  mysql:
    image: mysql:8
    environment:
      MYSQL_DATABASE: mydb
      MYSQL_ROOT_PASSWORD: pass

✅ 정리 요약


 

용도 Dockerfile docker-compose
개별 이미지 정의 ❌ (Dockerfile 필요)
멀티 컨테이너 구성 ❌ (직접 명령어로 연결) ✅ 여러 서비스 정의 및 실행 자동화
CI/CD 활용도 고정된 이미지 빌드 dev/test 환경 구성, 테스트 병렬화에 유리
대표 명령어 docker build, docker run docker-compose up -d, logs, down

 

728x90
반응형
728x90
반응형

★ 설치 환경 확인

1. 운영환경

$ cat /etc/issue
Ubuntu 22.04 LTS \n \l

2. jenkins 버전

 Jenkins 2.346.3

 

★ 설치 시작

1. jdk 설치

$ sudo apt update
$ sudo apt install openjdk-11-jre
$ java -version
openjdk version "11.0.16" 2022-07-19
OpenJDK Runtime Environment (build 11.0.16+8-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.16+8-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)

2. jenkins 패키지 설치

# 설치 및 업그레이드를 자동화하는 Jenkins의 데비안 패키지 저장소입니다.
# 이 저장소를 사용하려면 먼저 시스템에 키를 추가하십시오.
$ curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \
    /usr/share/keyrings/jenkins-keyring.asc > /dev/null

# 그런 다음 Jenkins apt 저장소 항목을 추가합니다.
$ echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
    https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
    /etc/apt/sources.list.d/jenkins.list > /dev/null

# 로컬 패키지 인덱스를 업데이트한 다음 마지막으로 Jenkins를 설치합니다.
$ sudo apt-get update
$ sudo apt-get install jenkins

3. 실행 (default port : 8080)

http://localhost:8080

# jenkins 최초 실행시 비밀번호를 복사해서 http://localhost:8080에 붙여넣는다
$ cat /var/lib/jenkins/secrets/initialAdminPassword
be6fd6c56af241a08abd2bad2b620418

 

4. 트러블슈팅

case. install 시 아래와 같은 에러 발생시 

 

● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/jenkins.service.d
             └─override.conf
     Active: activating (auto-restart) (Result: exit-code) since Tue 2022-08-16 02:27:35 EDT; 4ms ago
    Process: 1492738 ExecStart=/usr/bin/jenkins (code=exited, status=1/FAILURE)
   Main PID: 1492738 (code=exited, status=1/FAILURE)
        CPU: 4.886s
dpkg: error processing package jenkins (--configure):
 installed jenkins package post-installation script subprocess returned error exit status 1
Errors were encountered while processing:
 jenkins
E: Sub-process /usr/bin/dpkg returned an error code (1)

 

default 포트가 이미 리스닝상태라서 발생한 문제로 발생

포트 변경 필요

$ sudo vi /lib/systemd/system/jenkins.service
# Port to listen on for HTTP requests. Set to -1 to disable.
# To be able to listen on privileged ports (port numbers less than 1024),
# add the CAP_NET_BIND_SERVICE capability to the AmbientCapabilities
# directive below.
# 8080 -> 10100 으로 변경하고 저장 후 닫기(esc키 누른후 !wq 엔터)
# Environment="JENKINS_PORT=8080"
Environment="JENKINS_PORT=10100"
$ sudo systemctl restart jenkins.service

Warning: The unit file, source configuration file or drop-ins of jenkins.service 
changed on disk. Run 'systemctl daemon-reload' to reload units.
Job for jenkins.service failed because the control process exited with error code.
See "systemctl status jenkins.service" and "journalctl -xeu jenkins.service" for details.

$ systemctl daemon-reload

$ sudo systemctl restart jenkins.service

 

-> 다시 3번부터 진행

 

*참조(공식사이트)

https://www.jenkins.io/doc/book/installing/linux/

728x90
반응형

+ Recent posts