InfraGuard

웹 서비스 관제

등록한 웹사이트를 nginx-vts 카운터로 라이브 관제하고, 능동 합성 프로브로 24시간 가동율·다운타임·TLS 인증서 만료를 추적합니다.

개요 — 무엇을 하나

Service ▸ Web(/service/web)은 조직이 운영하는 웹사이트를 하나씩 등록하고, 각 사이트의 트래픽·품질·가용성을 라이브로 관제하는 화면입니다. 두 종류의 신호를 결합합니다.

  1. 수동(passive) vts 카운터 — 각 노드의 nginx-vts 모듈이 누적한 zone별 카운터를 수집기가 중앙 infr_web_metric 에 적재합니다. 앱은 연속 두 샘플의 delta로 RPS·대역폭·에러율·평균 응답시간·캐시 적중률을 계산합니다.
  2. 능동(active) 합성 프로브 — infr:probe-web 커맨드가 매분 각 사이트의 URL을 직접 HTTP GET해 infr_web_check 에 적재합니다. 방문자 트래픽과 무관하게 진짜 도달성을 판정하므로, 트래픽이 전혀 없는 다운·3xx 뒤에 숨은 5xx·카운터 리셋을 모두 잡아냅니다.

서비스 건강(up/degraded/down) 판정의 권위는 능동 프로브에 있습니다. 수동 vts의 5xx·에러율은 봇/스캐너가 "존재하지 않는 경로"를 두드려 발생하는 노이즈가 지배하므로, 그것으로 서비스를 다운으로 세지 않습니다. 응답코드·에러율은 카드에 정보로만 표시하고, 상태 도트는 프로브 결과가 덮어씁니다(2026-08-11 설계 결정).

여기서 "도메인"은 오직 웹 TLD(aaa.bbb.com)를 뜻합니다. 한 웹 서비스는 여러 도메인(주 도메인 + 별칭)을 가질 수 있고, 그 전 도메인의 트래픽이 하나의 카드로 합산됩니다.

언제 쓰나

화면 구성

상단 KPI

KPI 의미
웹사이트 등록된 총 사이트 수
정상 / 저하 / 다운 카드 상태 집계(능동 프로브 오버레이 결과)
24h 가동율 24시간 가동율(%) — 합성 또는 트래픽 배지로 신호 출처 표시
24h 다운타임 24시간 누적 다운 분 + 에피소드 [사이트 HH:MM~HH:MM] (hover popover)
총 RPS / 대역폭 전 사이트 초당 요청·수신+송신 대역폭 합
순 방문자 / 요청 접속 인텔(nginx_meta_ct) 최근 창 집계

24h 가동율/다운타임 KPI의 합성 배지는 능동 프로브(infr_web_check) 데이터로 산출됐음을, 트래픽 배지는 아직 프로브 데이터가 없어 vts 카운터 근사(passive)로 표시 중임을 뜻합니다. 프로버가 몇 분 돌면 자동으로 합성으로 전환됩니다.

사이트 카드 (서비스 도메인 탭)

각 카드는 한 웹 서비스(= 주 도메인 + 별칭 도메인 묶음)를 나타내며 2개 지표군을 보여줍니다.

카드는 masonry 배치이며 드래그로 순서 변경(SortableJS), 화면은 30초 폴링으로 갱신됩니다.

로컬 호스트 탭

노드별 nginx 업스트림 백엔드(127.0.0.1:PORT → docker 등 내부 프록시 대상)를 자동 나열합니다. '*' 집계행의 upstream JSON에서 포트 위주로 뽑으며, 등록이 필요 없습니다. down 백엔드 우선·포트 오름차순 정렬. (업스트림은 사용자 요청으로 서비스 카드에서 제거되어 이 탭 전용입니다.)

웹사이트 관리 모달

사용법

지표 계산 규칙

vts 카운터는 누적값이므로 rate는 항상 delta로 만듭니다.

RPS         = Δrequest_counter / Δt
in/out bps  = Δ(in_bytes|out_bytes) / Δt
에러율      = (Δresp_4xx + Δresp_5xx) / Δ(2xx+3xx+4xx+5xx) × 100
평균 응답시간 = Σ Δrequest_msec_counter / Σ Δrequest_counter   (ms)
캐시 적중률 = Σ cache_hit / (Σ cache_hit + Σ cache_miss) × 100

카운터가 감소하면(nginx 재시작으로 리셋) 해당 구간의 rate는 null로 처리되어 잘못된 급증치가 표시되지 않습니다. 다도메인 서비스는 전 도메인 × 노드의 시리즈를 합산합니다(RPS·대역폭·응답코드·요청은 가법, 커넥션은 주 노드 대표 1개만, 스파크라인은 주 도메인 시리즈).

카드 상태가 정해지는 순서

  1. 수동 vts 신선도 (WebMetricService::statusOf) — 최근 창에 샘플이 없으면 pending(no_data), 마지막 샘플이 web_stale_min(기본 5분)을 넘으면 pending(stale · 무트래픽 ≠ 다운), 그 외 up. 건강 판정이 아니다.
  2. 능동 프로브 오버레이 (WebProbeService::overlayStatus) — 최근 10분 안에 프로브 결과가 있으면 위 상태를 덮어씁니다.
프로브 결과 카드 상태 사유
도달 실패(접속 장애·응답 없음) 또는 4xx/5xx down probe_down
성공(2xx/3xx)이지만 지연 ≥ web_probe_slow_ms(기본 5초) degraded probe_slow
성공 · 5초 미만 up —
프로브 미커버(프로버 정지) 수동 상태 유지 폴백

24시간 가동율·다운타임

두 경로가 같은 shape로 산출되며, 능동이 있으면 능동을 우선합니다(availabilityOrPassive).

능동 (WebProbeService::availability24h, infr_web_check 기준):

가동율   = Σok / Σtotal × 100        (전 모니터링 사이트의 체크 집계)
다운타임 = 사이트별 연속 실패 체크 구간 → [시작 … 마지막실패 + 1주기(60s)] 지속 합

수동 폴백 (WebMetricService::web24h, infr_web_metric 기준):

가동율   = (Σrequest − Σresp_5xx) / Σrequest × 100
평균지연 = Σ Δrequest_msec / Σ Δrequest   (요청 가중)
다운타임 = 창(연속 두 샘플) 내 요청 ≥ 5건이고 그중 99%↑ 가 5xx 인 "완전 다운" 구간
           → 사이트별 병합(인접 간격 ≤ 180초). nginx 자체 다운(행 결측)은 세지 않음

TLS 인증서 만료 추적

능동 프로브 실행 중, 등록 웹서비스가 hold한 전 도메인을 대상으로 인증서를 확인합니다.

배지 톤 조건(기본)
good 잔여 > web_cert_warn_days(21일)
warn 잔여 ≤ 21일, 또는 확인 실패(도달 불가·미파싱)
crit 잔여 ≤ web_cert_crit_days(7일) — 만료(음수) 포함

인증서 임박은 Infrastructure ▸ Alerts 정책의 web 영역 "인증서 임박" 조건으로 SMS/메일 경보를 걸 수 있습니다. 그 조건은 URL과 무관하게 등록 웹서비스의 전 도메인을 전역 스캔합니다.

웹사이트 등록·수정·삭제

  1. 우상단 [웹사이트 관리] → [추가] 탭.
  2. 이름 입력, 도메인 검색/선택(또는 직접 입력), 필요 시 추가 도메인·인스턴스·URL·포트·모니터링 여부·메모 지정.
  3. [저장](POST /service/web/save) → 성공 시 카드 즉시 반영(캐시 flush). 삭제는 [삭제](POST /service/web/delete).

데이터 소스

테이블 / 소스 커넥션 역할
infr_web_metric 기본(MySQL) zone별 nginx-vts 누적 카운터(수집기가 적재 · read-model, 마이그레이션 없음)
infr_web_service 기본 웹사이트 레지스트리(000711) + 다도메인 domains JSON(000713) + 인증서 요약 cert_*(000725)
infr_web_check 기본 능동 합성 프로브 결과 시계열(000724) — 가동율/다운타임
infr_web_cert 기본 도메인 단위 TLS 인증서 상태(000726 · UNIQUE(web_service_id, domain))
nginx_meta_ct legacy_glory 접속 인텔(src_ip·url·method·status·request_time · 약 1천만 행, idx_host_ts 레인지스캔)
infr_instance 기본 노드 라벨·alias 인리치

수집기: scripts/infr_redis_vts_collector.cjs(pm2 cron · 매분)가 nginx-vts를 읽어 중앙 infr_web_metric 에 적재합니다. 앱은 기본 커넥션에서 읽기만 하며 직접 원격 연결·수집 커맨드가 없습니다(Admin ▸ Collectors에서 등록·설정).

능동 프로버: infr:probe-web 단발 커맨드를 스케줄러가 매분 withoutOverlapping(1)(리더 게이팅)으로 발화합니다. Http::pool로 최대 12개 동시 요청(연결 4초·전체 10초 타임아웃·withoutVerifying), 리다이렉트 최종 상태 기준으로 판정합니다. 체크는 30일 보관(매시 분==7에 정리).

캐시 주기

대상 캐시
대시보드 카드 20초
접속 인텔(nginx_meta_ct 10분 창) 60초
수집 zone 콤보 60초
로컬 호스트(업스트림) 20초
24h 수동 요약(web24h) 120초
24h 능동 가동율 30초
최근 프로브 상태(오버레이) 20초

권한

문제해결 · FAQ

관련 항목

웹 서비스 관제
웹 서비스 관제
웹사이트 카드 한 장
웹사이트 카드 한 장