반응형

Nginx in Docker Container

 

이 글에서는 Docker 환경에서 Nginx 컨테이너를 통해 SSL을 적용하고,
`localhost:8000` 에서 동작 중인 백엔드 서버와 연결하는 방법을 소개합니다.

 

🧱 1. 프로젝트 디렉토리 구조

my-nginx-setup/
├── docker-compose.yml
├── nginx/
│   ├── nginx.conf			# Nginx Configuration
│   └── ssl/
│       ├── cert.pem		# SSL 인증서
│       └── privkey.pem		# SSL 키
└── log/				# Log 저장
  • 프로젝트 디렉토리를 하나 만듭니다.
  • `docker-compose.yml` 파일을 통해 설정합니다.
  • 볼륨 마운트를 할 `nginx` 및 `log` 디렉토리를 만듭니다.
  • `nginx/ssl` 경로에는 설정할 SSL 인증서/키 파일을 세팅합니다.

 

🐳 2. docker-compose.yml

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    network_mode: "host"
    volumes:
      - ./nginx:/etc/nginx
      - ./log:/var/log/nginx
    restart: always
  • `network_mode=host` 로 설정하여, Nginx가 `localhost` 에 접근할 수 있도록 합니다.
  • 로컬의 `nginx` 디렉토리와 `log` 디렉토리를 컨테이너 내부 각 영역과 볼륨 마운트 합니다.

 

⚙️ 3. Nginx 설정파일: nginx/nginx.conf

events {
    worker_connections 1024;
}

http {
    # Default: 404
    server {
        listen 443 ssl default_server;
        server_name _;
        
        ssl_certificate     /etc/nginx/ssl/your_all_cert.pem;
        ssl_certificate_key /etc/nginx/ssl/your_key.pem;

        return 404;
    }

    # To Backend
    server {
        listen 443 ssl;
        server_name your.domain.io;

        ssl_certificate     /etc/nginx/ssl/your_all_cert.pem;
        ssl_certificate_key /etc/nginx/ssl/your_key.pem;

        location / {
            proxy_pass http://localhost:8000;
        }
    }
    
    # Redirect to 443
    server {
        listen 80;
        server_name your.domain.io;
        
        return 301 https://$host$request_uri;
    }
}
Linux(Ubuntu) 환경에서는 로컬호스트(localhost)에 접근하기 위해 `network_mode`를 설정하여 접근할 수 있습니다. 반면, Mac 등의 기타 OS에서는 `host.docker.internal` 값을 통해 로컬호스트 및 기타 컨테이너에 접근할 수 있게 됩니다.

위는 `nginx.conf` 파일의 예시입니다. 필요한 구성 및 환경설정에 따라 다른 값들을 입력해야 합니다.

 

🔒 4. SSL 인증서 준비

인증서는 다음과 같은 방식들로 준비할 수 있습니다.

 

(1) 테스트용 Self-signed 인증서 생성

mkdir -p nginx/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout nginx/ssl/privkey.pem \
  -out nginx/ssl/cert.pem \
  -subj "/CN=your.domain.io"

이 인증서는 브라우저에서 신뢰되지 않음 경고가 뜰 수 있습니다.

 

(2) Let's Encrypt로 실제 인증서 발급

도메인이 실제로 존재해야 하며, `certbot` 등으로 발급할 수 있습니다. 아래 글을 참조하세요!

 

가비아 & letsencrypt & Nginx 로 개인서버에 도메인 붙여보기

개요최근에 구하게 된 PC를 개인서버로 만들어서 이것저것 개발하다보니, 도메인을 붙이고 싶다는 생각이 들었다.원래 AWS를 이용해서는, Route 53에서 도메인을 구매하고, SSL을 먹이기 위해서 ACM

ts01.tistory.com

 

혹시 인증서 갱신을 원한다면, 아래 글을 참조하세요.

 

Let's Encrypt 의 이미 만료된 인증서를 갱신하기

✅ 개요HTTPS 를 위한 무료 SSL 인증서 발급 서비스인 Let's Encrypt 는 일반적으로 90일의 유효기간을 제공합니다. 보통은 자동 갱신을 설정해 두지만, 가끔 예상치 못하게 인증서가 만료된 후 이를 갱

ts01.tistory.com

 

(3) 실제 인증서 구매 및 발급

SecureSign 등의 다양한 사이트에서 SSL 인증서를 구매하고 발급할 수 있습니다.

 

🚀 5. 컨테이너 실행

docker compose up -d

# 강제 재실행
docker compose up -d --force-recreate

 

🏁 마무리

SSL 등록이 완료되고 서버도 올바르게 실행되어 있다고 가정한다면, 설정한 도메인을 통해 접속할 수 있습니다. 정상적으로 연결되었다면, Nginx 컨테이너가 요청을 수립하고, SSL 처리하여, `localhost:8000` 백엔드로 요청이 프록시됩니다.

누적되는 Nginx 로그는 아래 경로에서 확인 가능합니다:

  • 일반 로그: `./log/access.log`
  • 에러 로그: `./log/error.log`

 

이렇게 설정하면 Nginx가 SSL 터미네이션을 담당하면서, Docker 내부에서 외부 요청을 안전하게 백엔드로 전달할 수 있습니다. 실서비스에 적용할 경우 로드밸런싱, CORS 설정, 리버스 프록시 보안 헤더 등 추가 구성도 고려할 수 있습니다.

감사합니다.

반응형

+ Recent posts