Prometheus와 Grafana로 NGINX Plus를 시각화하는 방법

NGINX | 2021년 9월 23일

앞서 Kubernetes에서 가시성을 개선하는 방법에서 살펴본 것처럼, 앱 개발 및 배포 팀이 직면하는 가장 큰 과제 중 하나는 앱의 성능, 보안 및 가용성에 대한 인사이트를 확보하는 것입니다. 이러한 인사이트는 팀이 문제를 신속하게 해결하고 트래픽 급증에 선제적으로 대비하는 데 도움이 됩니다.

로드 밸런서, 리버스 프록시, API 게이트웨이, Ingress 컨트롤러와 같은 트래픽 관리 도구는 애플리케이션과 인프라의 상태에 관한 풍부한 정보를 제공합니다. 이러한 유용한 메트릭은 NGINX Plus 대시보드에서 실시간으로 추적할 수 있으며, NGINX Plus는 메트릭을 타사 모니터링 도구로 전송하여 시간 경과에 따른 성능을 시각화하고 더 심층적인 인사이트를 제공할 수도 있습니다. 가장 널리 사용되는 도구 중 다음 두 가지를 함께 사용하면 이러한 시계열 그래프를 확인할 수 있습니다.

  • Prometheus – 모니터링 및 알림을 위한 CNCF(Cloud Native Computing Foundation)의 오픈 소스 프로젝트
  • Grafana – Prometheus와 같은 시계열 데이터베이스에서 그래프 및 기타 시각화 자료를 생성하는 오픈 소스 시각화 및 분석 도구

The Prometheus-njs 모듈을 사용하면 NGINX Plus 메트릭을 Prometheus와 Grafana에 손쉽게 제공할 수 있습니다. 이 모듈은 NGINX JavaScript 모듈(NJS)과 NGINX Plus API를 사용하여 NGINX Plus의 메트릭을 Prometheus 서버로 내보냅니다.

이 동영상 데모에서는 NGINX Plus, Prometheus 및 Grafana를 설정하고 Grafana 그래프를 만드는 전체 과정을 다룹니다.

 

자체 구현을 설정하는 데 도움이 되도록, 다음 섹션에서는 동영상의 타임포인트에 맞춰 각 단계를 요약합니다:

참고:

  • 이 지침은 NGINX Plus API를 사용하므로 NGINX Open Source에서는 작동하지 않습니다.
  • NGINX Ingress Controller에서 Prometheus와 Grafana를 사용하려면 다음 설명서를 참조하세요.

사전 요구 사항

데모를 시작하기 전에 다음 사전 요구 사항을 충족했습니다.

  1. NGINX Plus 설치를 NGINX Plus 서버에 설치합니다. 이 데모에서는 초기 설치를 새로 진행합니다. 기존 NGINX Plus 서버를 사용하는 경우 데모 중 구성 파일에 적용하는 변경 사항을 수정해야 할 수도 있습니다.
  2. NGINX JavaScript(njs) 모듈을 설치합니다(NGINX Plus 서버에서).
  3. 최신 버전의 Docker를 설치합니다 Prometheus 서버에 설치합니다. 이 데모에서는 일반적인 관행에 따라 NGINX Plus와 별도의 두 번째 서버에서 Prometheus를 실행합니다.
  4. Grafana 서버(데모에서는 세 번째 서버)에 최신 버전의 Docker를 설치합니다.

NGINX Plus 서버 설정(1:20)

  1. Prometheus-njs 모듈을 설치합니다. 이 데모에서는 Ubuntu 20.04를 사용하므로 다음 명령어를 실행합니다. 다른 운영 체제의 경우 설명서를 참조하세요.
$ sudo apt-get install nginx-plus-module-prometheus
  1. 선호하는 텍스트 편집기를 사용하여 /etc/nginx/nginx.conf 파일을 열고 다음 load_module 지시문을 http 블록 외부의 최상위 컨텍스트에 추가합니다.
load_module modules/ngx_http_js_module.so;
# existing top-level directives

http {
    #...
}
  1. (선택 사항) 하위 요청의 응답 본문을 저장하는 버퍼의 크기를 늘립니다(기본 크기는 플랫폼에 따라 4KB 또는 8KB임). 이렇게 하면 too big subrequest response 오류가 발생하지 않습니다. 이 오류는 NGINX 오류 로그에 표시됩니다. subrequest_output_buffer_size 지시어를 http 블록에 추가합니다.
http {    #...
    subrequest_output_buffer_size 32k;
}

  1. Save nginx.conf을 저장하고 다음 명령을 실행하여 NGINX 구성의 구문이 올바른지 확인합니다.
$ sudo nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  1. 디렉터리를 conf.d로 변경하고 파일 목록을 확인합니다.
$ cd conf.d$ ls
default.conf
  1. The default.conf 파일은 포트 80에서 수신 대기하는 가상 서버를 정의합니다. Prometheus용 가상 서버가 해당 포트에서 수신 대기해야 하므로, 포트를 사용할 수 있도록 default.conf 파일을 삭제합니다.
$ sudo rm default.conf
  1. 선호하는 텍스트 편집기를 사용하여 prometheus.conf라는 새 파일을 만들고 다음 내용을 입력합니다.
js_import /usr/share/nginx-plus-module-prometheus/prometheus.js;

server {
    location = /metrics {
        js_content prometheus.metrics;
    }
 
    location /api {
        api;
    } 
}
  1. js_import 지시문은 NGINX Plus API에서 생성된 메트릭을 Prometheus에 필요한 형식으로 변환하는 NGINX JavaScript 코드의 위치를 지정합니다. (Prometheus-njs용 load_module 지시문을 별도로 추가할 필요는 없습니다.) 첫 번째 location 블록은 Prometheus 형식의 메트릭에 대한 액세스를 제공합니다. 두 번째 location 블록은 원시 메트릭을 생성하여 Prometheus에 노출하는 NGINX Plus API를 활성화합니다. 참고: 프로덕션 환경에서는 설명서에 안내된 대로 NGINX Plus API에 대한 액세스를 제한할 것을 강력히 권장합니다. Prometheus-njs 모듈에 대한 자세한 내용은 설명서를 참조하세요.
  2. Save prometheus.conf을 저장하고 4단계와 같이 구문이 올바른지 확인한 다음, 다음 명령을 실행하여 NGINX Plus를 시작합니다.
$ sudo nginx

Prometheus 서버 설정하기 (5:30)

  1. YAML 형식의 새 Prometheus 구성 파일을 prometheus.yml이라는 이름으로 /etc/prometheus 디렉터리에 만들고, 다음 내용을 입력합니다(Prometheus 웹사이트의 기본 구성 파일을 기반으로 함). 아래와 같이 targets 필드에 NGINX Plus 서버의 IP 주소와 포트를 추가하기만 하면 됩니다.
global:
  scrape_interval: 15s 
  
  external_labels:
    monitor: 'codelab-monitor'
 
scrape_configs:  
  - job_name: 'prometheus'
    
    scrape_interval: 5s
 
    static_configs:
      - targets: ['NGINX_Plus_IP_address:80']
  1. 구성 파일에 포함할 수 있는 추가 옵션을 비롯한 Prometheus 구성에 대한 자세한 내용은 Prometheus 설명서를 참조하세요.
  2. Save prometheus.yml을 저장한 후 다음 명령을 실행합니다. 이 명령은 Docker Hub에서 Prometheus를 가져와 포트 9090에서 액세스할 수 있도록 합니다.
$ sudo docker run --network="host" -d -p 9090:9090 -v ~/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
  1. 브라우저에서 새 Prometheus 서버의 IP 주소와 포트로 이동합니다. 다음과 같은 페이지가 표시되면 서버가 정상적으로 작동하는 것입니다.
  2. Prometheus가 NGINX Plus 메트릭 피드에 액세스하고 있는지 확인합니다. 창 오른쪽 상단에 있는 실행 버튼 왼쪽의 지구본 아이콘을 클릭합니다. 다음과 같은 메트릭 목록이 표시됩니다.

Grafana 서버 설정(9:15)

  1. 다음 명령어를 실행하여 Docker Hub에서 Grafana 이미지를 가져오고 포트 3000으로 노출합니다:
[terminal]$ sudo docker run -d -p 3000:3000 grafana/grafana
  1. 다른 설치 방법은 Grafana 문서를 참조하세요.
  2. 브라우저에서 새 Grafana 서버의 IP 주소와 포트로 이동합니다. Grafana 로그인 페이지가 표시되면 서버가 정상적으로 작동하는 것입니다.
  3. Log in by entering admin을(를) 이메일 또는 사용자 이름 및 비밀번호 필드에 모두 입력하여 로그인합니다. 메시지가 표시되면 안전한 새 비밀번호를 설정할 것을 강력히 권장하지만, 데모에서는 시간 관계상 이 단계를 건너뜁니다.

  1. 표시되는 Grafana 홈페이지에서 데이터 소스로 Prometheus를 등록하려면 Grafana 설명서의 지침을 따르세요. 동영상에서는 Grafana GUI에서 수행하는 단계를 보여 줍니다. 참고: Grafana 지침의 5단계에서 예시로 표시된 URL(http://localhost:9090) 대신 Prometheus 서버의 IP 주소(및 포트 9090)를 입력하세요.
    Grafana 지침의 7단계에서 저장 및 테스트 버튼을 클릭하면 체크 표시가 있는 녹색 상자와 데이터 소스가 작동 중입니다라는 메시지가 표시됩니다. 이는 Grafana가 Prometheus 서버에 성공적으로 연결되었음을 의미합니다.

Grafana에서 NGINX Plus 그래프 만들기(11:15)

Prometheus는 단일 메트릭을 살펴보는 데 유용하지만, Grafana를 사용하면 여러 메트릭을 하나의 그래프에서 쉽게 확인할 수 있습니다.

Grafana 그래프를 만들려면:

  1. 페이지 왼쪽의 탐색 모음에서 더하기 기호(+)를 클릭합니다(이전 섹션의 4단계에 있는 스크린샷 참조). 만들기 드롭다운 메뉴에서 대시보드를 선택합니다.
  2. Click the 빈 패널 추가 상자를 클릭합니다.
  3. 표시되는 새 대시보드/패널 편집 페이지에서 페이지 하단에 있는 데이터 소스 탭의 쿼리 필드에 Prometheus가 표시되는지 확인합니다. 표시되지 않으면 드롭다운 메뉴에서 Prometheus를 선택합니다.
  4. Enter nginx를  메트릭 브라우저 > 필드에 입력합니다. NGINX Plus 메트릭 목록이 표시됩니다.
    다음은 각 메트릭이 제공하는 정보를 파악하는 데 도움이 되는 간략한 설명입니다.
    • nginxplus_connections_accepted – 허용된 클라이언트 연결
    • nginxplus_connections_active – 활성 클라이언트 연결
    • nginxplus_connections_dropped – 삭제된 클라이언트 연결
    • nginxplus_connections_idle – 유휴 클라이언트 연결
    • nginxplus_http_requests_current – 현재 HTTP 요청
    • nginxplus_http_requests_total – 총 HTTP 요청 수
    • nginxplus_nginx_meta – NGINX 메타 정보
    • nginxplus_processes_respawned – 비정상적으로 종료된 후 다시 생성된 자식 프로세스의 총수
    • nginxplus_ssl_handshakes – 성공한 SSL 핸드셰이크 수
    • nginxplus_ssl_handshakes_failed – 실패한 SSL 핸드셰이크
    • nginxplus_ssl_session_reuses – SSL 핸드셰이크 중 세션 재사용
    • nginxplus_workers_mem_private – NGINX 워커가 사용하는 전용 메모리이며, 공유 라이브러리는 포함하지 않음
    • nginxplus_workers_mem_rss – NGINX 워커 프로세스가 사용하는 메모리
  5. 목록에서 메트릭을 선택합니다(데모에서는 nginxplus_connections_active를 선택합니다). 다른 메트릭을 선택하려면 + Query 버튼을 클릭한 다음 새 Metrics browser > 필드에서 다른 메트릭을 선택합니다(데모에서는 nginxplus_connections_idle을 선택합니다).
  6. 페이지 상단 절반에 있는 그래프 위의 "새로 고침"(원을 이루는 두 개의 화살표) 아이콘을 클릭하면 그래프에 결과가 표시되기 시작합니다.

보너스: 모든 NGINX Plus 배포 환경을 위한 통합 인사이트 및 분석

“NGINX Plus 인스턴스가 많이 포함된 대규모 NGINX 배포 환경을 운영하고 있다면 어떻게 해야 할까?” 또는 “Prometheus와 Grafana에서 얻은 인사이트와 분석 결과를 바탕으로 인스턴스 구성을 어떻게 업데이트할 수 있을까?”라는 의문이 들 수 있습니다. NGINX Controller는 NGINX 배포를 위한 제어 및 관리 플레인 솔루션으로, 이러한 질문을 비롯한 다양한 문제를 해결하는 데 도움을 줍니다.

Prometheus와 Grafana는 모니터링, 알림 및 시각화를 위한 탁월한 솔루션이지만 구성과 정책을 업데이트하는 기능은 제공하지 않습니다. 이러한 인사이트를 바탕으로 조치를 취하려면 여전히 개별 NGINX Plus 인스턴스에 로그인하여 변경해야 하므로, 특히 규모가 크고 복잡한 NGINX Plus 배포 환경에서는 시간이 많이 걸리고 오류가 발생하기 쉽습니다.

NGINX Controller는 초당 요청 수, CPU 사용량, 4xx 및 5xx 오류, 상태 확인 실패 등 200개가 넘는 NGINX Plus 메트릭에 대한 심층적인 인사이트와 분석을 앱 중심의 직관적인 통합 플랫폼에서 제공합니다. 데이터를 심층적으로 분석하고 보고서로 내보낼 수 있으며, NGINX 전문가가 복잡성을 추상화하도록 설계한 자동화된 역할별 워크플로를 활용하여 필요한 구성 및 정책을 변경할 수 있습니다.

NGINX Controller를 사용하면 앱 배포 상태를 지속적으로 파악하고 NGINX Plus 인스턴스와 구성 객체(예: 환경, 게이트웨이, 앱)를 대규모로 제어할 수 있습니다. 또한 선호하는 모니터링 및 알림 솔루션을 포기할 필요도 없습니다. Controller는 API 우선 설계 방식을 채택하여 타사 솔루션과 매우 쉽고 간편하게 통합할 수 있습니다.

 

NGINX Plus 및 NGINX Controller 시작하기

아직 NGINX Plus를 사용해 보지 않으셨다면 로드 밸런서, 리버스 프록시, API 게이트웨이로 활용하거나 향상된 모니터링 및 관리 API와 완전한 기술 지원을 제공하는 웹 서버로 사용해 보시기 바랍니다. 지금 30일 무료 평가판을 시작하거나 사용 사례에 대해 논의하려면 문의해 주세요.

또한 NGINX Plus 환경을 시각화하고 모니터링하는 데 NGINX Controller가 적합하다고 생각하신다면, Controller App Security와 함께 Application Delivery 및 API Management 모듈을 모두 이용할 수 있는 30일 무료 평가판을 확인해 보세요.


공유

관련 블로그 게시물

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
NGINX | 2023. 11. 30.

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric

이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
NGINX | 2023. 03. 23.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법

앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
NGINX | 2021. 09. 27.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션

개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX | 2021. 07. 06.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법

NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX | 2021. 06. 30.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리

NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
NGINX | 2015. 03. 25.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유

Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.