서버 배포 구성

Nginx, DNS, SSL, Docker 실무 설정

DNS 레코드 등록, Nginx 리버스 프록시 설정, SSL 인증서 발급, Docker 포트 관리까지 서비스 배포에 필요한 실무 구성 정리.

DevOps

개념

서비스 하나를 인터넷에 올리는 데 필요한 실무 구성 전체를 정리한 노트다. 도메인 구매부터 시작해서 DNS → Nginx 리버스 프록시 → SSL 인증서 → Docker 포트 매핑까지 이어지는 한 덩어리 흐름이다. 각 단계는 독립적으로 설명해도 되지만 실무에선 순서와 의존 관계가 중요해서 한 노트에 묶어 둔다.

전체 요청 흐름

사용자 → talk.datco-sb.kr (443)
  → 공유기 (포트포워딩)
    → 서버 nginx (도메인으로 판단)
      → localhost:9006 (Docker 컨테이너)

각 단계에서 뭘 설정해야 하는지 아래에서 하나씩.

DNS

  • A 레코드 — 도메인 → IP 직접 연결
  • CNAME — 도메인 → 다른 도메인 (iptime DDNS 쓸 때)
  • 서브도메인은 각각 등록해야 함 (mail, talk 별개)
  • 확인: dig talk.datco-sb.kr

DNS 변경은 TTL 때문에 즉시 반영되지 않는다. DNS에서 다룬 대로 이전 전에 TTL을 줄여놓는 게 기본.

Nginx

sites-available vs sites-enabled

  • sites-available/ = 설정 파일 보관
  • sites-enabled/ = 심볼릭 링크로 활성화된 것만
  • 끄고 싶으면 링크만 삭제, 파일은 보존
# 활성화
sudo ln -s /etc/nginx/sites-available/talk.conf /etc/nginx/sites-enabled/
# 비활성화
sudo rm /etc/nginx/sites-enabled/talk.conf

리버스 프록시

  • nginx가 **도메인(Host 헤더)**으로 요청을 구분해서 내부 서비스로 분배
  • 외부 포트(80/443)는 하나의 nginx가 잡고, 도메인별로 다른 proxy_pass
server {
    server_name talk.datco-sb.kr;
    location / {
        proxy_pass http://localhost:9006;
    }
}
  • Mattermost처럼 WebSocket을 쓰는 서비스는 Upgrade, Connection 헤더를 추가로 넘겨야 한다

더 넓은 Nginx 사용법은 Nginx 참고.

SSL (certbot / Let's Encrypt)

  • webroot 방식 — sudo certbot certonly --webroot -w /var/www/_letsencrypt -d 도메인
  • nginx 설정에 아직 없는 인증서 경로를 참조하면 에러남 → 443 블록 주석 처리 → 발급 → 해제 순서
  • 90일 유효, 자동 갱신

Docker 포트

  • 같은 서버에서 두 프로세스가 같은 포트를 동시에 쓸 수 없음
  • 컨테이너 내부 포트는 같아도 호스트 노출 포트는 달라야 함 — 9006:9005 (호스트:컨테이너)
  • docker-compose.override.yml은 포트를 교체가 아니라 추가함 → 포트 변경 용도로는 부적합
  • 환경변수 방식이 나음 — ${WEBAPP_PORT:-9005}:9005 + .env에서 관리

더 보기

  • DNS — A/CNAME 레코드 상세
  • Nginx — 리버스 프록시·로드밸런싱 개념
  • Sandbox — Docker 격리의 보안 측면

Related

sunshinemoon · 2026