# 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 옵션으로 자체 서명 인증서 테스트 가능