DOCS/troubleshooting/251021_nginx_gateway_ongoing_issues.md

5.8 KiB

2025-10-21 nginx / gateway 로그 점검

작성일: 2025-10-21
작성자: codex
상태: 진행 중 (여러 항목 해결, 잔여 과제 점검 중)

문서 상태

  • 헬스체크 주기(30→60초) 조정과 적용 내역은 본 문서에 반영 완료되었으며, 문서 외 추가 파일 변경이나 Pull Request는 없습니다.

요약

  • 최신 점검 결과, 일부 항목은 해결되었고 나머지 핵심 이슈만 남아 있음.
  • 현재 집중 대상: Slack 인터랙티브 이벤트 간헐 500, 헬스체크 요청 과다, Slack 사용자 매핑 누락, SSL Handshake 오류 추적.

상세 진단

서버 식별 참고: 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. 헬스체크 요청 과다

  • 증상: 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/DockerfileHEALTHCHECK 주기를 30s → 60s로 완화, 타임아웃 5s로 조정.
    • scripts/health_check.sh의 엔드포인트를 /health/healthz로 정합화.
    • 모니터링/오케스트레이션 레벨의 별도 핑 간격 조정은 추가 수행 필요.
    • 운영 확인(51123 서버): orchestrator 헬스체크 간격이 60s로 설정됨을 확인.
      • 명령: docker inspect --format 'Health interval: {{.Config.Healthcheck.Interval}}' robeing-gateway1m0s.
    • 코드 반영(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
      • 적용에는 서비스 재배포가 필요함(현재 리포 변경만 반영됨)

3. Slack 사용자 매핑 누락

  • 증상: 특정 워크스페이스 사용자 이벤트 처리 실패.
  • 로그 근거:
    • docker logs robeing-gateway | grep 'User not registered' → 2025-10-13~14 계속 발생 (team_id=T09C98KB933).
  • 조치 제안: Slack 사용자-UUID 동기화 런북 점검, 신규 워크스페이스 온보딩 절차 확립.

4. 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_ciphersssl_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)으로 확인되었습니다.

해결됨(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/nginxcreate 0640 nginx adm 적용 및 강제 로테이션 수행.
  • 검증: 최신 오류 로그 비어 있음, 신규 [emerg] 재발 없음.

조치 요약(2025-10-21)

  • [적용] Nginx /api, /adminhttp://localhost:8100 (gateway) 라우팅 정정.
  • [적용] TLS 정책 강화: TLS1.2/1.3만 허용, 안전한 cipher/curve 지정.
  • [부분] Gateway HEALTHCHECK 빈도 완화 및 /healthz 정합화.
  • [보류] Slack 사용자 매핑 누락 및 rb8001 연결 안정화(별도 서비스 측 조치 필요).

다음 단계

  1. [모니터링] 외부 모니터(예: Slack 워크플로/써드파티 프로브)에서 /healthz 폴링 주기를 60s 이상으로 조정.
  2. [서비스] Slack 사용자-UUID 동기화 런북 실행, 미등록 사용자 온보딩.
  3. [rb8001] 연결 안정화·재시도/타임아웃 강화 및 장애 알람 설정.
  4. [보안] TLS 핸드셰이크 오류 추적 및 필요 시 fail2ban 등 차단 정책 도입.