- Published on
Nginx
533 words3 min read
프론트 개발환경에서 nginx.local.conf 생성
worker_processes 1;
error_log /tmp/nginx_error.log debug;
pid /tmp/nginx.pid;
events {
worker_connections 1024;
}
http {
# 로그 설정
access_log /tmp/nginx_access.log;
# 내부 DNS 사용 (hosts 파일 우회)
# proxy_pass에서 도메인 주소를 사용할 경우 필수
# valid=30s → DNS 결과를 30초 동안 캐싱
resolver [ip addr] valid=30s;
server {
# Nginx가 수신할 포트
# 외부에서 접근하려면 포트포워딩과 방화벽(ufw, security group)에서 80 허용 필요
listen 80;
server_name [...].com; # 외부에서 호출하면 이동시킬 도메인 or IP
# API 요청 → 원격 서버 (로그인/로그아웃/OAuth2 포함)
# Spring context-path가 /api이므로 모든 백엔드 요청은 /api/로 시작
location /api/ {
set $backend "[...].com";
proxy_pass http://$backend$request_uri; # 클라이언트가 요청한 전체 URI(/api/xxx?query)를 백엔드로 전달
proxy_http_version 1.1; # keep-alive, WebSocket, chunked response 등을 위해 1.1 명시
proxy_set_header Host [...].com; # 백엔드 서버가 인식할 Host 헤더. Spring Security, OAuth redirect_uri, CORS 판단에 중요
proxy_set_header X-Real-IP $remote_addr; # 실제 클라이언트 IP. 로그, 보안 필터, rate-limit 용도
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 프록시 체인을 거친 모든 클라이언트 IP 기록
proxy_set_header X-Forwarded-Proto $scheme; # http/https 구분. Spring에서 request.isSecure(), redirect 판단에 사용
}
# 프론트 요청 → Vite 개발 서버 (localhost:5173)
location / {
proxy_pass http://127.0.0.1:5173; # 로컬에서 실행 중인 Vite dev server로 전달
proxy_http_version 1.1; # Vite HMR(WebSocket) 사용을 위해 필수
proxy_set_header Host $host; # 클라이언트가 요청한 원래 도메인을 유지. 이 설정이 없으면 Vite HMR, WebSocket, absolute URL 기반 동작에서 문제 발생 가능
proxy_set_header Upgrade $http_upgrade; # HTTP → WebSocket 업그레이드 요청 전달. Vite HMR, code-server, live reload에 필수
proxy_set_header Connection "upgrade"; # Upgrade 헤더와 함께 동작. 없으면 WebSocket 1006 오류 발생
proxy_set_header X-Real-IP $remote_addr; # 프론트에서도 클라이언트 실제 IP 추적 가능
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 프록시 체인 IP 기록
proxy_set_header X-Forwarded-Proto $scheme; # 프론트에서 현재 프로토콜 인식 필요할 경우 대비
}
}
}
Nginx 실행
sudo nginx -c $(pwd)/nginx.local.conf
Nginx 중지
sudo pkill nginx
로그 확인
# 에러 로그
tail -f /tmp/nginx_error.log
# 접근 로그
tail -f /tmp/nginx_access.log