# LPS 관리자 UI — 정적 SPA 서빙 + LPS API 동일출처 프록시. # 브라우저는 이 오리진(:3400)만 보고, /v1·/healthz·/readyz 는 여기서 lps-api:9600 으로 넘긴다. # (vite dev 서버의 proxy 설정과 동일한 대상·경로 — 개발/운영 동작 일치) server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; # gzip — 번들·JSON 응답 전송량 절감 gzip on; gzip_types text/css application/javascript application/json image/svg+xml; gzip_min_length 1024; # ── API 프록시 (lps-api:9600) ── # 도커 임베디드 DNS(127.0.0.11)로 매 요청 재해석 → lps-api 재시작(새 IP)에도 502 없이 따라간다. # proxy_pass 에 경로를 두지 않아 원본 요청 URI 를 그대로 전달한다(/v1/lps/ops → 동일 경로). resolver 127.0.0.11 valid=30s ipv6=off; location /v1/ { set $lps_api http://lps-api:9600; proxy_pass $lps_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; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 120s; # 테스트 검색 등 긴 폴링 여유 } location = /healthz { set $lps_api http://lps-api:9600; proxy_pass $lps_api; } location = /readyz { set $lps_api http://lps-api:9600; proxy_pass $lps_api; } # ── SPA 라우팅 — 정적 파일 없으면 index.html 로 폴백 ── location / { try_files $uri $uri/ /index.html; } # 정적 자산 캐시(해시 파일명이라 장기 캐시 안전). index.html 은 캐시 안 함. location /assets/ { expires 1y; add_header Cache-Control "public, immutable"; } }