diff --git a/docs/troubleshooting/250727_happybell80_nginx프록시설정문제.md b/docs/troubleshooting/250727_happybell80_nginx프록시설정문제.md new file mode 100644 index 0000000..96a9290 --- /dev/null +++ b/docs/troubleshooting/250727_happybell80_nginx프록시설정문제.md @@ -0,0 +1,80 @@ +# Nginx 프록시 설정 관련 상황 공유 + +**날짜**: 2025-07-27 +**작업자**: happybell80 & Claude + +## 오전 1시 38분 + +### 문제 발생 배경 + +* 물리 서버 1번(포트 51123)에서 Nginx가 리버스 프록시 역할을 수행하고 있습니다. +* 물리 서버 2번(포트 51124)에는 로빙 컨테이너가 자동 배포되며, 컨테이너 내부 서비스가 `10508` 포트에서 `/health` 엔드포인트를 제공합니다. +* Nginx 설정에는 `location ^~ /rb10508/` 블록이 정의되어 있으나, **HTTP(포트 80)로 `localhost`에 요청**할 때는 첫 번째 `server` 블록(default_server)이 처리하여 React 정적 HTML을 반환하고 있습니다. +* **HTTPS(포트 443)** 로 접근할 때는 올바르게 프록시되어 `{"status":"healthy"}` 응답이 반환됩니다. + +### 현재 동작 상태 + +| 구분 | 요청 예시 | 결과 | +| --------------- | ------------------------------------------ | ---------------------- | +| HTTP localhost | `curl http://localhost/rb10508/health` | React 프론트엔드 HTML 반환 | +| HTTPS localhost | `curl -k https://localhost/rb10508/health` | `{"status":"healthy"}` | +| 도메인 HTTPS | `curl https://ro-being.com/rb10508/health` | `{"status":"healthy"}` | + +### 확인된 원인 + +1. `localhost`로 들어오는 HTTP 트래픽은 **첫 번째 `server` 블록(default_server)** 이 처리합니다. +2. 해당 블록에는 `location ^~ /rb10508/` 같은 프록시 설정이 없어서, `location /`의 `try_files`가 실행됩니다. +3. 그 결과 React 빌드 파일(HTML)이 반환됩니다. + +### 해결 방안 후보 + +| 옵션 | 개요 | 장점 | 단점 | +| -- | ---------------------------------------------------- | -------------------- | ------------------- | +| 1 | 첫 번째 `server` 블록에도 동일한 프록시 설정을 추가 | 로컬 HTTP 요청까지 동일 동작 | 설정 중복·유지보수 부담 | +| 2 | **모든 HTTP 트래픽을 HTTPS로 301 리다이렉트** | 보안 강화, 설정 단순화, 업계 표준 | 로컬 개발 시 셀프사인 인증서 필요 | +| 3 | default_server 최소화 후 실제 도메인용 `server` 블록에만 세부 설정 유지 | 설정 명확, 의도 분리 | 로컬 HTTP 테스트 불편 | + +#### 추가 고려 사항(로컬 개발 환경) + +* 로컬에서 HTTPS를 사용할 경우 셀프사인 인증서 설치 과정이 필요합니다. +* 기존 테스트 스크립트나 헬스 체크가 `http://localhost`로 하드코딩되어 있으면 수정이 필요합니다. +* 개발 편의를 위해 **로컬 전용 `server` 블록**(`server_name localhost;`)을 별도로 두고 HTTP를 허용하는 방법을 병행할 수 있습니다. + +### 제안 + +* **프로덕션(운영) 환경**: 옵션 2를 적용하여 HTTP 요청을 전면 HTTPS로 리다이렉트하는 것이 가장 안전하고 관리가 쉽습니다. +* **로컬 개발 환경**: + * 선택지 A: `server_name localhost;` 블록을 추가하여 HTTP 직접 프록시를 허용. + * 선택지 B: 셀프사인 인증서를 설치하고 로컬에서도 HTTPS로 통일. + +### 결정 필요 사항 + +1. 운영 환경에서 옵션 2를 채택할지 여부 +2. 로컬 개발 편의성을 위해 별도 `server` 블록을 둘지, 셀프사인 인증서를 배포할지에 대한 합의 +3. 기존 자동화 스크립트(`curl`, CI/CD 테스트 등) 수정 범위 검토 + +### 요청 사항 + +* 각 담당자께서는 **선호하는 옵션**과 **우려되는 점**을 댓글이나 슬랙 채널에 공유해 주시기 바랍니다. +* 특히 로컬 개발용 워크플로우 변경이 필요한 팀(백엔드, QA)은 추가 의견을 주시면 감사하겠습니다. +* 의견 수렴 후 최종 방안을 확정하고, Nginx 설정 변경 → 테스트 → 배포 순으로 진행하겠습니다. + +--- + +## 교훈 + +1. **Nginx location 매칭 우선순위 이해 필수** + - default_server가 먼저 매칭되면 후속 server 블록의 설정이 무시됨 + - `^~` 플래그를 사용해도 server 블록이 다르면 적용되지 않음 + +2. **HTTP/HTTPS 분리 설정 시 주의** + - 각 프로토콜별 server 블록에 동일한 설정이 필요할 수 있음 + - 프로덕션에서는 HTTP를 HTTPS로 리다이렉트하는 것이 표준 + +3. **로컬 개발 환경 고려 필요** + - 운영 환경과 개발 환경의 요구사항이 다를 수 있음 + - 보안과 편의성 사이의 균형점 찾기 중요 + +4. **테스트는 다양한 시나리오로** + - localhost와 도메인, HTTP와 HTTPS 모두 테스트 필요 + - curl의 -k 옵션으로 자체 서명 인증서 테스트 가능 \ No newline at end of file