개요 — 무엇을 하나
Service ▸ Web(/service/web)은 조직이 운영하는 웹사이트를 하나씩 등록하고, 각 사이트의 트래픽·품질·가용성을 라이브로 관제하는 화면입니다. 두 종류의 신호를 결합합니다.
- 수동(passive) vts 카운터 — 각 노드의
nginx-vts모듈이 누적한 zone별 카운터를 수집기가 중앙infr_web_metric에 적재합니다. 앱은 연속 두 샘플의 delta로 RPS·대역폭·에러율·평균 응답시간·캐시 적중률을 계산합니다. - 능동(active) 합성 프로브 —
infr:probe-web커맨드가 매분 각 사이트의 URL을 직접 HTTP GET해infr_web_check에 적재합니다. 방문자 트래픽과 무관하게 진짜 도달성을 판정하므로, 트래픽이 전혀 없는 다운·3xx 뒤에 숨은 5xx·카운터 리셋을 모두 잡아냅니다.
서비스 건강(up/degraded/down) 판정의 권위는 능동 프로브에 있습니다. 수동 vts의 5xx·에러율은 봇/스캐너가 "존재하지 않는 경로"를 두드려 발생하는 노이즈가 지배하므로, 그것으로 서비스를 다운으로 세지 않습니다. 응답코드·에러율은 카드에 정보로만 표시하고, 상태 도트는 프로브 결과가 덮어씁니다(2026-08-11 설계 결정).
여기서 "도메인"은 오직 웹 TLD(aaa.bbb.com)를 뜻합니다. 한 웹 서비스는 여러 도메인(주 도메인 + 별칭)을 가질 수 있고, 그 전 도메인의 트래픽이 하나의 카드로 합산됩니다.
언제 쓰나
- 운영 중인 사이트의 초당 요청 수(RPS)·에러율·응답시간·캐시 적중률을 실시간으로 보고 싶을 때.
- 가동율(SLA)·다운타임을 24시간 기준으로 확인하고, 어느 시간대에 몇 분 다운됐는지 에피소드로 되짚을 때.
- TLS 인증서 만료가 임박한 도메인을 조기에 발견할 때(자동 갱신 실패 조기 경보).
- 특정 사이트에 몰리는 상위 호출 IP·최근 열린 페이지를 보고 이상 트래픽을 조사할 때.
- 신규 사이트를 등록·수정·삭제하거나, 여러 도메인을 한 서비스로 통합할 때.
화면 구성
상단 KPI
| KPI | 의미 |
|---|---|
| 웹사이트 | 등록된 총 사이트 수 |
| 정상 / 저하 / 다운 | 카드 상태 집계(능동 프로브 오버레이 결과) |
| 24h 가동율 | 24시간 가동율(%) — 합성 또는 트래픽 배지로 신호 출처 표시 |
| 24h 다운타임 | 24시간 누적 다운 분 + 에피소드 [사이트 HH:MM~HH:MM] (hover popover) |
| 총 RPS / 대역폭 | 전 사이트 초당 요청·수신+송신 대역폭 합 |
| 순 방문자 / 요청 | 접속 인텔(nginx_meta_ct) 최근 창 집계 |
24h 가동율/다운타임 KPI의
합성배지는 능동 프로브(infr_web_check) 데이터로 산출됐음을,트래픽배지는 아직 프로브 데이터가 없어 vts 카운터 근사(passive)로 표시 중임을 뜻합니다. 프로버가 몇 분 돌면 자동으로합성으로 전환됩니다.
사이트 카드 (서비스 도메인 탭)
각 카드는 한 웹 서비스(= 주 도메인 + 별칭 도메인 묶음)를 나타내며 2개 지표군을 보여줍니다.
- 트래픽: RPS(
req/s), 수신/송신 대역폭, 노드 커넥션(active/reading/writing/waiting), RPS 스파크라인. - 품질: 에러율, 응답코드 스택바(2xx/3xx/4xx/5xx), 평균 응답시간(ms), 캐시 적중률.
- 접속 인텔 스트립: 순 방문자·요청·평균지연·서빙 서버(scheme/dest_ip).
- 인증서 배지: 가장 임박한 도메인의 잔여일 + 톤(good/warn/crit).
- 프로브 배지: 최근 능동 프로브 결과(HTTP 코드·지연).
- 접이식 상세: 응답코드 카운트, 최근 열린 페이지 URI, 상위 호출 IP(→ Infrastructure 조사 딥링크).
카드는 masonry 배치이며 드래그로 순서 변경(SortableJS), 화면은 30초 폴링으로 갱신됩니다.
로컬 호스트 탭
노드별 nginx 업스트림 백엔드(127.0.0.1:PORT → docker 등 내부 프록시 대상)를 자동 나열합니다. '*' 집계행의 upstream JSON에서 포트 위주로 뽑으며, 등록이 필요 없습니다. down 백엔드 우선·포트 오름차순 정렬. (업스트림은 사용자 요청으로 서비스 카드에서 제거되어 이 탭 전용입니다.)
웹사이트 관리 모달
- 탭: [등록된 웹사이트](3열 그리드) | 동적 [추가/편집] 탭.
- 도메인 입력은 typeahead 검색(수집된 vts zone 목록에서 축차 필터 · Tab=첫 항목 자동완성 · 직접 입력 가능). zone 선택 시
node_alias·instance_id·URL(https://)·포트(443)가 자동 프리필됩니다(vts에 스킴 신호가 없어 https/443 기본). - 추가 도메인:
[+ 도메인 추가]→ draft 카드에 입력 → ✓로 확정. 이미 선택된 도메인은 자동 제외됩니다. 저장 시 전체 반영되고, 카드 부제에+N배지가 붙습니다.
사용법
지표 계산 규칙
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개만, 스파크라인은 주 도메인 시리즈).
카드 상태가 정해지는 순서
- 수동 vts 신선도 (
WebMetricService::statusOf) — 최근 창에 샘플이 없으면pending(no_data), 마지막 샘플이web_stale_min(기본 5분)을 넘으면pending(stale · 무트래픽 ≠ 다운), 그 외up. 건강 판정이 아니다. - 능동 프로브 오버레이 (
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한 전 도메인을 대상으로 인증서를 확인합니다.
- stale만·실행당 8건 순환(오래된 것 우선, 첫 실행 폭주 방지), 6시간 주기로 재확인.
ssl://host:port단일 소켓 핸드셰이크로 peer 인증서를 캡처(SNI 지정·검증 off) → 만료일·발급자 추출 → 도메인 단위infr_web_cert(UNIQUE(web_service_id, domain))에 적재.- 확인 후 서비스 대표 요약(가장 임박한 도메인)을
infr_web_service.cert_*에 재계산해 카드 배지로 씁니다. - 확인 포트: 주 도메인의 URL이 https 커스텀 포트를 쓰면 그 포트, 아니면 443.
| 배지 톤 | 조건(기본) |
|---|---|
| good | 잔여 > web_cert_warn_days(21일) |
| warn | 잔여 ≤ 21일, 또는 확인 실패(도달 불가·미파싱) |
| crit | 잔여 ≤ web_cert_crit_days(7일) — 만료(음수) 포함 |
인증서 임박은 Infrastructure ▸ Alerts 정책의 web 영역 "인증서 임박" 조건으로 SMS/메일 경보를 걸 수 있습니다. 그 조건은 URL과 무관하게 등록 웹서비스의 전 도메인을 전역 스캔합니다.
웹사이트 등록·수정·삭제
- 우상단 [웹사이트 관리] → [추가] 탭.
- 이름 입력, 도메인 검색/선택(또는 직접 입력), 필요 시 추가 도메인·인스턴스·URL·포트·모니터링 여부·메모 지정.
- [저장](
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초 |
권한
- 조회: 로그인(
infr.auth) — 레벨 ≥ 1(demo 포함). - 쓰기(저장/삭제):
user_level >= 2(self-gatecanWrite). demo(1)는 등록/수정/삭제 불가, staff(5)·admin(10) 가능. 위반 시 403. - 모든 저장·삭제는
infr_audit_log(web_service.create|update|delete)에 기록됩니다.
문제해결 · FAQ
- 카드가 계속
대기(pending)— 수집기가 아직 해당 zone을 적재하지 않았거나 최근 15분 창에 샘플이 없습니다. 수집기(infr_redis_vts_collector.cjs) 가동과 도메인이 vts zone으로 잡히는지 확인하세요. 정상 트래픽이 없으면 stale로 pending일 수 있으나, 능동 프로브가 실제 다운을 판정합니다. - RPS·에러율이
null/빈칸 — 카운터가 리셋됐거나(nginx 재시작) delta 계산용 두 번째 샘플이 아직 없습니다. 다음 수집 주기에 회복됩니다. - 에러율은 높은데 프로브는
up— 정상입니다. 봇/스캐너가 없는 경로로 발생시킨 4xx/5xx는 vts에만 섞이며, 루트 URL만 치는 능동 프로브가 서비스 건강의 권위입니다. - KPI가
트래픽배지로만 표시 —infr:probe-web이 아직 돌지 않았습니다. 스케줄러 가동 후 몇 분 뒤합성으로 전환됩니다. - 인증서 배지가 안 뜹니다 — 아직 확인 전(6시간 주기·실행당 8건 순환)이거나 사이트가 http-only입니다.
infr_web_cert가 채워지면 배지가 나타납니다. - 접속 인텔(순 방문자·URI)이 비어 있습니다 —
legacy_glory가 미가용이거나 최근 10분 창에 로그 행이 없습니다. 카드는 vts 지표만으로 graceful하게 유지됩니다. - 다운타임 에피소드에 nginx 전체 다운이 안 잡힙니다 — 수동 요약은 5xx로 표출되는 백엔드/앱 장애만 셉니다(행 결측은 수집기 중단과 구분 불가). 능동 프로브 기반 다운타임이 트래픽 0 다운까지 잡습니다.
관련 항목
- 방문자·검색 유입 분석 — 카드의 사람·돋보기 아이콘(GA4 방문자 · Search Console 키워드)
- Service ▸ Overview — 큐레이션 라이브 서비스 보드(웹 가용성 게이지 공유)
- Service ▸ Database · Service ▸ Sessions — 같은 라이브 관제 패턴의 DB·Redis
- Infrastructure ▸ Alerts — 웹 프로브·인증서 임박 경보 정책
- Admin ▸ Operations Policy — 웹 상태·프로브·인증서 임계값(
web_*) - Admin ▸ Collectors — nginx-vts 수집기 등록·설정
- Infrastructure ▸ IP Connections — 상위 호출 IP 조사 딥링크

