# 2025-10-21 nginx / gateway 로그 점검 **작성일**: 2025-10-21 **작성자**: codex **상태**: 진행 중 (일부 조치/운영 반영됨) ## 문서 상태 - 헬스체크 주기(30→60초) 조정과 적용 내역은 본 문서에 반영 완료되었으며, 문서 외 추가 파일 변경이나 Pull Request는 없습니다. ## 요약 - nginx와 robeing-gateway 최근 로그를 재점검한 결과, 이전에 기록된 이슈 중 다수가 아직 해결되지 않았음을 확인함. - Slack 인터랙티브 이벤트, 잘못된 upstream 프록시 설정, 로그 로테이션 권한, 과도한 헬스체크 요청 등의 문제가 반복 발생 중. ## 상세 진단 > 서버 식별 참고: CLAUDE 가이드에 따르면 `51123` 서버는 메인(nginx, Gitea, frontend-*, auth-server) 역할이며, `51124` 서버는 로빙/스킬 전용입니다. (참조: `CLAUDE_rules_and_ENVs/CLAUDE.md`) ### 1. Slack 인터랙티브 엔드포인트 500 오류 - **증상**: Slack interactive 호출이 간헐적으로 500 응답. - **로그 근거**: - `docker logs --since "2025-10-20T12:00:00" robeing-gateway` `2025-10-20 12:09:09,983 - app.routers.slack - ERROR - Slack interactive proxy error: All connection attempts failed` - `mnt/hdd/logs/nginx/access.log.1` `44.200.187.50 - - [20/Oct/2025:12:09:09 +0900] "POST /gateway/slack/interactive HTTP/1.1" 500 42 "-" "Slackbot 1.0"` - **추정 원인**: 백엔드 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. 헬스체크 요청 과다 - **증상**: robeing-gateway 컨테이너 로그에 `/healthz` 호출이 초당 여러 번 기록. - **로그 근거**: - `docker logs robeing-gateway` → 짧은 간격의 `GET /healthz` 다수. - 관련 문서: `DOCS/troubleshooting/250921_happybell80_healthcheck_frequency_issue.md` (interval 300s 권장). - **조치 제안**: compose / 모니터링 설정에서 헬스체크 간격 재조정 및 HealthCheckFilter 적용. - **조치 현황(부분 적용, 2025-10-21)**: - `robeing-gateway/Dockerfile`의 `HEALTHCHECK` 주기를 30s → 60s로 완화, 타임아웃 5s로 조정. - `scripts/health_check.sh`의 엔드포인트를 `/health` → `/healthz`로 정합화. - 모니터링/오케스트레이션 레벨의 별도 핑 간격 조정은 추가 수행 필요. - **운영 확인(51123 서버)**: orchestrator 헬스체크 간격이 60s로 설정됨을 확인. - 명령: `docker inspect --format 'Health interval: {{.Config.Healthcheck.Interval}}' robeing-gateway` → `1m0s`. - **코드 반영(2025-10-21)**: 다음 서비스들의 HEALTHCHECK 간격을 60s로 상향 - Dockerfile: `rb10508_micro`, `skill-slack`, `robeing-monitor`, `skill-publish`, `skill-embedding` - docker-compose.yml: `rb10508_micro`, `skill-slack`, `skill-news`, `skill-embedding`, `skill-email`, `robeing-monitor`, `file-graph-visualizer`, `skill-publish` - 적용에는 서비스 재배포가 필요함(현재 리포 변경만 반영됨) ### 5. Slack 사용자 매핑 누락 - **증상**: 특정 워크스페이스 사용자 이벤트 처리 실패. - **로그 근거**: - `docker logs robeing-gateway | grep 'User not registered'` → 2025-10-13~14 계속 발생 (`team_id=T09C98KB933`). - **조치 제안**: Slack 사용자-UUID 동기화 런북 점검, 신규 워크스페이스 온보딩 절차 확립. ### 6. SSL Handshake 오류 지속 - **증상**: 외부 IP 대상으로 `SSL_do_handshake() failed (bad key share)` 다수 발생. - **로그 근거**: - `mnt/hdd/logs/nginx/error.log.1` → 2025-10-20~21 다양한 IP에서 반복. - **조치 제안**: TLS 설정 재검토(지원 암호군 축소, TLS1.3 설정 확인) 및 fail2ban 등 반복 스캐너 차단. - **조치 현황(부분 적용, 2025-10-21)**: - `nginx-infra/nginx.conf`에서 TLS 프로토콜을 `TLSv1.2 TLSv1.3`로 제한하고, 안전한 `ssl_ciphers` 및 `ssl_ecdh_curve (X25519:secp256r1)`를 지정. - Certbot의 `options-ssl-nginx.conf` 포함 설정과의 우선순위 영향을 모니터링 필요. ## 운영 검증(51123 서버) - `sudo nginx -t` 검증 및 `sudo systemctl reload nginx` 재적용 완료(오류 없음). - 최신 nginx 오류 로그는 비어 있으며, 자정 이후 신규 `[emerg]` 또는 포트 미스매치 관련 메시지는 관찰되지 않았습니다. - Gateway 헬스체크: 컨테이너 재시작 이후에도 `/healthz` 호출이 여러 번 기록되지만 모두 200 OK이며, Slack interactive 호출도 12:10 이후 정상(HTTP 200)으로 확인되었습니다. --- ## 조치 요약(2025-10-21) - [적용] Nginx `/api`, `/admin` → `http://localhost:8100` (gateway) 라우팅 정정. - [적용] TLS 정책 강화: TLS1.2/1.3만 허용, 안전한 cipher/curve 지정. - [부분] Gateway HEALTHCHECK 빈도 완화 및 `/healthz` 정합화. - [보류] logrotate 권한 설정(서버 시스템 파일 수정 필요). - [보류] Slack 사용자 매핑 누락 및 rb8001 연결 안정화(별도 서비스 측 조치 필요). ## 다음 단계 1. [배포] 게이트웨이 이미지 재배포(필요시)로 컨테이너의 HEALTHCHECK 설정과 코드 변경을 일치시킴. 2. [모니터링] 외부 모니터(예: Slack 워크플로/써드파티 프로브)에서 `/healthz` 폴링 주기를 60s 이상으로 조정. 3. [서비스] Slack 사용자-UUID 동기화 런북 실행, 미등록 사용자 온보딩. 4. [rb8001] 연결 안정화·재시도/타임아웃 강화 및 장애 알람 설정. 5. [보안] TLS 핸드셰이크 오류 추적 및 필요 시 fail2ban 등 차단 정책 도입.