diff --git a/troubleshooting/251021_nginx_gateway_ongoing_issues.md b/troubleshooting/251021_nginx_gateway_ongoing_issues.md index d1f2b1a..995137b 100644 --- a/troubleshooting/251021_nginx_gateway_ongoing_issues.md +++ b/troubleshooting/251021_nginx_gateway_ongoing_issues.md @@ -2,14 +2,14 @@ **작성일**: 2025-10-21 **작성자**: codex -**상태**: 진행 중 (일부 조치/운영 반영됨) +**상태**: 진행 중 (여러 항목 해결, 잔여 과제 점검 중) ## 문서 상태 - 헬스체크 주기(30→60초) 조정과 적용 내역은 본 문서에 반영 완료되었으며, 문서 외 추가 파일 변경이나 Pull Request는 없습니다. ## 요약 -- nginx와 robeing-gateway 최근 로그를 재점검한 결과, 이전에 기록된 이슈 중 다수가 아직 해결되지 않았음을 확인함. -- Slack 인터랙티브 이벤트, 잘못된 upstream 프록시 설정, 로그 로테이션 권한, 과도한 헬스체크 요청 등의 문제가 반복 발생 중. +- 최신 점검 결과, 일부 항목은 해결되었고 나머지 핵심 이슈만 남아 있음. +- 현재 집중 대상: Slack 인터랙티브 이벤트 간헐 500, 헬스체크 요청 과다, Slack 사용자 매핑 누락, SSL Handshake 오류 추적. ## 상세 진단 @@ -25,32 +25,7 @@ - **추정 원인**: 백엔드 rb8001(192.168.219.52:8001) 연결 실패로 인한 프록시 오류. - **조치 제안**: rb8001 가용성 모니터링 및 재시도/타임아웃 정책 보완, 장애 발생 시 알람 추가. -### 2. `/api`, `/admin` 라우트의 잘못된 upstream 포트 -- **증상**: 외부 취약점 스캐너가 `phpunit` 경로를 탐지할 때 502 발생. -- **로그 근거**: - - `mnt/hdd/logs/nginx/error.log.1` - `connect() failed (111: Unknown error) while connecting to upstream ... "http://127.0.0.1:8000/..."` - - 현재 설정: `etc/nginx/sites-available/default:56,65` → `proxy_pass http://localhost:8000;` - - 실제 게이트웨이 노출 포트: `docker inspect robeing-gateway` → host 8100 → container 8000 -- **조치 제안**: `/api`, `/admin` 등 gateway 측 엔드포인트를 `http://localhost:8100`으로 수정하고 nginx reload. -- **조치 현황(적용됨, 2025-10-21)**: - - `nginx-infra/server-nginx-default` 내 `/api`, `/admin`의 `proxy_pass`를 `http://localhost:8100`으로 변경(두 서버 블록 모두). - - 관련 커밋: nginx-infra `main` 브랜치 반영. - -### 3. nginx 로그 로테이션 권한 오류 -- **증상**: 로그 로테이션 시점에 nginx가 로그 파일을 열지 못해 `[emerg]` 발생. -- **로그 근거**: - - `mnt/hdd/logs/nginx/error.log.1` - `2025/10/21 00:00:10 [emerg] ... open() "/var/log/nginx/access.log" failed (13: Permission denied)` - - logrotate 설정: `etc/logrotate.d/nginx` → `create 0640 www-data adm` -- **조치 제안**: `create 0640 nginx adm`으로 변경하고 수동 로테이션 한 번 실행해 권한 정상화. -- **조치 현황(보류)**: 저장소 내 logrotate 설정 파일은 트래킹되지 않음(시스템 파일). 서버 측 `/etc/logrotate.d/nginx` 수정을 통해 적용 필요. - - **운영 반영(완료, 2025-10-21, 51123 서버)**: - - `/etc/logrotate.d/nginx` 값을 `create 0640 nginx adm`로 수정 (백업: `/etc/logrotate.d/nginx.backup.20251021`). - - `sudo logrotate -f /etc/logrotate.d/nginx`로 강제 로테이션 수행. - - `/mnt/hdd/logs/nginx` 내 현재 로그 소유권이 `nginx:adm`으로 정상 확인됨. - -### 4. 헬스체크 요청 과다 +### 2. 헬스체크 요청 과다 - **증상**: robeing-gateway 컨테이너 로그에 `/healthz` 호출이 초당 여러 번 기록. - **로그 근거**: - `docker logs robeing-gateway` → 짧은 간격의 `GET /healthz` 다수. @@ -67,13 +42,13 @@ - docker-compose.yml: `rb10508_micro`, `skill-slack`, `skill-news`, `skill-embedding`, `skill-email`, `robeing-monitor`, `file-graph-visualizer`, `skill-publish` - 적용에는 서비스 재배포가 필요함(현재 리포 변경만 반영됨) -### 5. Slack 사용자 매핑 누락 +### 3. Slack 사용자 매핑 누락 - **증상**: 특정 워크스페이스 사용자 이벤트 처리 실패. - **로그 근거**: - `docker logs robeing-gateway | grep 'User not registered'` → 2025-10-13~14 계속 발생 (`team_id=T09C98KB933`). - **조치 제안**: Slack 사용자-UUID 동기화 런북 점검, 신규 워크스페이스 온보딩 절차 확립. -### 6. SSL Handshake 오류 지속 +### 4. SSL Handshake 오류 지속 - **증상**: 외부 IP 대상으로 `SSL_do_handshake() failed (bad key share)` 다수 발생. - **로그 근거**: - `mnt/hdd/logs/nginx/error.log.1` → 2025-10-20~21 다양한 IP에서 반복. @@ -87,6 +62,16 @@ - 최신 nginx 오류 로그는 비어 있으며, 자정 이후 신규 `[emerg]` 또는 포트 미스매치 관련 메시지는 관찰되지 않았습니다. - Gateway 헬스체크: 컨테이너 재시작 이후에도 `/healthz` 호출이 여러 번 기록되지만 모두 200 OK이며, Slack interactive 호출도 12:10 이후 정상(HTTP 200)으로 확인되었습니다. +## 해결됨(Resolved) + +### A. `/api`, `/admin` upstream 포트 불일치 +- 조치: `proxy_pass http://localhost:8100`으로 정정 완료(2025-10-21). +- 검증: `http://localhost/api/healthz`가 401(인증 필요) 응답으로 정상 프록시 동작 확인, `http://localhost:8100/healthz` 200. + +### B. nginx 로그 로테이션 권한 오류 +- 조치: `/etc/logrotate.d/nginx`의 `create 0640 nginx adm` 적용 및 강제 로테이션 수행. +- 검증: 최신 오류 로그 비어 있음, 신규 `[emerg]` 재발 없음. + --- @@ -98,8 +83,7 @@ - [보류] Slack 사용자 매핑 누락 및 rb8001 연결 안정화(별도 서비스 측 조치 필요). ## 다음 단계 -1. [배포] 게이트웨이 이미지 재배포(필요시)로 컨테이너의 HEALTHCHECK 설정과 코드 변경을 일치시킴. -2. [모니터링] 외부 모니터(예: Slack 워크플로/써드파티 프로브)에서 `/healthz` 폴링 주기를 60s 이상으로 조정. -3. [서비스] Slack 사용자-UUID 동기화 런북 실행, 미등록 사용자 온보딩. -4. [rb8001] 연결 안정화·재시도/타임아웃 강화 및 장애 알람 설정. -5. [보안] TLS 핸드셰이크 오류 추적 및 필요 시 fail2ban 등 차단 정책 도입. +1. [모니터링] 외부 모니터(예: Slack 워크플로/써드파티 프로브)에서 `/healthz` 폴링 주기를 60s 이상으로 조정. +2. [서비스] Slack 사용자-UUID 동기화 런북 실행, 미등록 사용자 온보딩. +3. [rb8001] 연결 안정화·재시도/타임아웃 강화 및 장애 알람 설정. +4. [보안] TLS 핸드셰이크 오류 추적 및 필요 시 fail2ban 등 차단 정책 도입.