본문 바로가기
카테고리 없음

Docker 환경에서 Nginx 설치 및 설정하기

by Hoft 2025. 10. 21.
728x90
반응형

이 글에서는 Docker 환경에서 Nginx를 실행하여 리버스 프록시와 정적 HTML 서비스, 그리고 CORS 오픈 환경을 모두 구성하는 방법을 단계별로 설명합니다. 설정 예시에서는 다음과 같은 요구 사항을 모두 충족합니다.

  • 포트 80으로 들어오는 요청 → 10.77.0.99:8080으로 프록시
  • 포트 80/api/ 요청 → 10.77.0.99:8080/api로 프록시
  • 포트 8040으로 들어오는 요청 → Docker 컨테이너 내 정적 HTML 제공
  • CORS (Cross-Origin Resource Sharing) 완전 개방

1. Docker로 Nginx 이미지 다운로드

먼저 Docker Hub의 공식 Nginx 이미지를 가져옵니다.

sudo docker pull nginx:latest

이미지가 성공적으로 내려받아졌는지 확인합니다.

sudo docker images | grep nginx

2. Nginx 설정 파일 작성 (default.conf)

이제 리버스 프록시 + 정적 파일 + CORS를 모두 포함한 설정 파일을 작성합니다. 이전에 언급된 구조에 따라 /etc/nginx/conf.d/default.conf 파일을 다음과 같이 구성합니다.

server {
    listen 80;
    server_name _;

    # 기본 프록시 - / → 10.77.0.99:8080
    location / {
        proxy_pass http://10.77.0.99:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # CORS 허용
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization' always;

        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization';
            return 204;
        }
    }

    # /api 경로 전용 프록시
    location /api/ {
        proxy_pass http://10.77.0.99:8080/api/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

# 8040 포트로 정적 HTML 제공
server {
    listen 8040;
    server_name _;

    root /usr/share/nginx/html;
    index index.html index.htm;

    # CORS 완전 허용
    location / {
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization' always;

        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization';
            return 204;
        }
    }
}

이 설정은 2개의 server 블록을 정의합니다. 첫 번째는 포트 80 프록시 서버, 두 번째는 포트 8040 정적 콘텐츠 서버입니다.


3. 정적 HTML 콘텐츠 준비

Docker 호스트의 디렉터리(예: ~/site-content)에 정적 HTML 파일을 배치합니다.

mkdir -p ~/site-content
cd ~/site-content
echo "<h1>Welcome to Nginx HTML Server</h1>" > index.html

4. Docker 컨테이너 실행 명령어

이제 위에서 작성한 설정 파일과 정적 폴더를 마운트하여 Nginx 컨테이너를 실행합니다.

sudo docker run -d \
  --name my-nginx \
  -p 80:80 \
  -p 8040:8040 \
  -v ~/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro \
  -v ~/site-content:/usr/share/nginx/html:ro \
  nginx:latest

🟢 참고: 설정 파일이 다른 경로에 저장되었다면 해당 경로에 맞게 -v 옵션을 수정하세요.


5. 설정 검증 및 Nginx 리로드

컨테이너 내부 설정 테스트:

sudo docker exec my-nginx nginx -t

정상이라면 설정을 반영합니다.

sudo docker exec my-nginx nginx -s reload

이제 다음을 확인합니다:

  • http://localhost/ → 10.77.0.99:8080 서비스로 프록시됨
  • http://localhost/api/ → 10.77.0.99:8080/api로 프록시됨
  • http://localhost:8040/ → 정적 HTML 페이지 표시

6. 추가로 설정 가능한 부분들

✅ 로깅 강화

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

✅ HTTP → HTTPS 리다이렉션

server {
    listen 80;
    return 301 https://$host$request_uri;
}

✅ gzip 압축 활성화

gzip on;
gzip_types text/plain text/css application/json application/javascript;

✅ 캐시 제어 헤더 설정

location /static/ {
    expires 7d;
    add_header Cache-Control "public, max-age=604800";
}

✅ 사용자 정의 50x 에러 페이지

error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /usr/share/nginx/html;
}

마무리

이 구성을 통해 하나의 Docker 기반 Nginx 컨테이너 안에서 프록시 서버와 정적 HTML 서버를 동시에 운영할 수 있습니다. 모든 요청에 CORS를 개방하여 로컬 개발이나 테스트 API 환경에서 Cross-Origin 문제 없이 클라이언트 요청을 처리할 수 있습니다.

원하신다면 이후 단계로 Let's Encrypt SSL 인증서 적용이나 nginx-proxy-manager 같은 GUI 기반 설정도 함께 구성할 수 있습니다.

728x90
반응형

댓글