
이 글에서는 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 기반 설정도 함께 구성할 수 있습니다.
댓글