[카테고리:] DevOps

  • OCI 클라우드 원격 피어링(RPC)을 통한 다른 리전 VCN 간 통신 설정하기

    OCI 클라우드 원격 피어링(RPC)을 통한 다른 리전 VCN 간 통신 설정하기

    ⚠️ 상황

    OCI(Oracle Cloud Infrastructure)에서는 기본적으로 한 리전 내에서만 VCN(Virtual Cloud Network) 간의 통신이 가능합니다.

    하지만 기업 환경에서는 서울 리전과 미국 리전처럼 서로 다른 리전에 있는 VCN을 연결해야 하는 경우가 많습니다.

    이럴 때 사용하는 방법이 바로 Remote VCN Peering(원격 VCN 피어링)입니다.


    🧱 원격 피어링(Remote Peering)이란.

    OCI 네트워킹에서 다른 리전 간 VCN을 연결할 때 사용하는 주요 리소스는 다음과 같습니다:

    • VCN (Virtual Cloud Network): 가상 네트워크
    • DRG (Dynamic Routing Gateway): 외부 네트워크와 VCN을 연결하는 게이트웨이
    • RPC (Remote Peering Connection): DRG 안에서 다른 리전 DRG와 연결하기 위한 논리적 링크

    즉, 원격 피어링은 각 리전에 DRG를 만들고 → DRG 안에 RPC를 만들고 → 두 RPC를 연결하는 방식입니다.

    연결이 완료되면 양쪽 VCN의 프라이빗 IP로 직접 통신할 수 있습니다.


    🔗 사전준비

    • 두 개의 VCN이 서로 다른 리전에 존재해야 함 (예: 서울, 미국 애시번).
    • 각 리전에 DRG(Dynamic Routing Gateway)를 생성해야 함.
    • 동일한 테넌시(계정) 내에 있으면 가장 간단하며, 서로 다른 테넌시 간에도 가능.

    🔗 DRG 생성 및 VCN 연결

    • 리전 A (예: 서울) → DRG 생성 → VCN에 Attach
    • 리전 B (예: 미국) → DRG 생성 → VCN에 Attach

    🔗 RPC(Remote Peering Connnection) 생성

    • 리전 A의 DRG에서 RPC-Korea 생성
    • 리전 B의 DRG에서 RPC-US-East 생성

    🔗 RPC 피어링 연결

    • 리전 A RPC-Korea “피어링 시작” 선택
      • 대상 RPC OCID 입력 (리전 B의 RPC-US)
      • 피어 리전(us-ashburn-1 등) 선택
    • 리전 B 피어링 상태 확인

    ⚙️ 라우팅 설정

    VCN이 상대방 네트워크로 갈 수 있도록 라우팅 규칙을 설정해야 합니다.

    • 리전 A VCN ➡️ Route Table에 10.20.0.0/16 ➡️ DRG
    • 리전 B VCN ➡️ Route Table에 10.10.0.0/16 ➡️ DRG

    ⚙️ 보안 설정

    VCN 내의 Subnet 그룹의 Security List에 VCN CIDR 대역을 허용해야 합니다.

  • Ubuntu22.04: Docker 설치

    Ubuntu22.04: Docker 설치


    패키지 업데이트 & 필수 패키지 설치

    sudo apt update
    sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

    Docker 공식 GPG 키 추가

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

    Docker 저장소 추가

    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" \
      | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

    Docker 설치

    sudo apt update
    sudo apt install -y docker-ce docker-ce-cli containerd.io

    (선택) sudo 없이 docker 명령어 사용하기

    sudo usermod -aG docker $USER
    newgrp docker

  • Nginx: 마이크로캐싱(Micro-Caching) 적용하기

    Nginx: 마이크로캐싱(Micro-Caching) 적용하기

    마이크로 캐싱이란?

    마이크로 캐싱은 아주 짧은 TTL(보통 1~10초) 동안 응답을 캐시에 저장해 두고, 같은 요청이 들어오면 백엔드 대신 캐시에서 바로 응답하는 기법입니다. 짧은 TTL이라 실시간성은 유지하면서도, 순간 트래픽 폭주(새로고침, 인기 API 호출 등)를 효과적으로 흡수할 수 있습니다.

    필요한 이유

    • 사용자가 새로고침을 여러 번 하거나, 다수 유저가 동시에 동일 API를 호출하면 백엔드(DB, 애플리케이션)에 부하가 급증합니다.
    • 대부분의 API/페이지는 몇 초 단위로 변경되지 않기 때문에 짧게라도 캐시하면 부하를 크게 줄일 수 있습니다.

    ⚙️ 동작원리

    1. 첫 요청 → 캐시에 없음 → 백엔드 호출 → 응답 저장
    2. TTL(예: 3초) 안의 동일 요청 → 캐시에서 바로 응답
    3. TTL 만료 → 백엔드 재호출 후 캐시 갱신

    Nginx는 $upstream_cache_status 값으로 캐시 상태를 알려줍니다.

    $upstream_cache_status 값과 의미

    의미
    MISS캐시에 없음, 백엔드 호출
    HIT캐시에서 응답
    EXPIRED캐시 있었지만 TTL 만료, 백엔드 호출 후 갱신
    BYPASS캐시 우회 조건에 해당(Authorization, Cookie 등)
    STALETTL 지났지만 오래된 캐시로 응답(갱신 중)

    기본 설정 예시 (API)

    • /etc/nginx/nginx.conf ➡️ http{} 블록
    # 캐시 저장소
    proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:50m max_size=1g inactive=10m use_temp_path=off;
    
    # 인증 헤더 감지(개인화 요청은 캐시 제외)
    map $http_authorization $auth_cache_bypass {
        default 1;
        ""      0;
    }
    • server{} 블록
    # API만 마이크로 캐싱
    location ^~ /api/ {
        proxy_pass http://localhost:port;
    
        proxy_cache my_cache;
        proxy_cache_key "$scheme$host$request_uri";
        proxy_cache_valid 200 3s;          # TTL 3초
        proxy_cache_lock on;               # 동시 폭주 방지
        proxy_cache_use_stale updating;    # 갱신 중에는 이전 캐시 사용
    
        # 안전장치: 인증 요청/쿠키 발행 응답은 캐시 제외
        proxy_no_cache       $auth_cache_bypass $upstream_http_set_cookie;
        proxy_cache_bypass   $auth_cache_bypass $upstream_http_set_cookie;
    
        add_header X-Cache-Status $upstream_cache_status always;
    }

    🧱 테스트 방법

    # 첫 호출 → MISS
    curl -I https://example.com/api/data | grep -i x-cache-status
    
    # TTL 내 재호출 → HIT
    curl -I https://example.com/api/data | grep -i x-cache-status

    🚨 주의

    • 개인화 데이터(로그인 사용자별 데이터)는 절대 캐시하면 안 됨 → Authorization/Cookie 조건으로 캐시 우회
    • POST, PUT 요청은 Nginx 기본 설정상 캐시되지 않음
    • TTL이 너무 길면 데이터 최신성이 떨어지고, 너무 짧으면 효과가 적음 → 2~3초부터 시작해서 조정
    • 쿼리스트링이 다르면 별도 캐시로 저장되므로, 불필요한 랜덤 파라미터는 제거

    ⛺️ 확장: 정적 파일 + 마이크로 캐싱

    왜 정적 파일에도 마이크로 캐싱을 걸까?

    • 백엔드가 정적 파일(JS, CSS, 이미지 등)을 직접 서빙하는 경우, 많은 유저가 동시에 요청하면 백엔드 리소스를 불필요하게 소모합니다.
    • 특히 빌드 시 해시(app.abc123.js)가 붙은 파일은 변경 시 파일명이 바뀌므로 오래 캐시해도 안전합니다.
    • Nginx가 서버 앞단 캐시(프록시 캐시)로 한 번만 백엔드에 요청하게 하면, 다수의 요청을 빠르게 처리할 수 있습니다.

    🧱 설계 원칙

    1. 요청에 쿠키가 있어도 캐시 허용
      • 정적 파일에는 보통 개인화 데이터가 없음.
    2. 응답에 Set-Cookie가 있으면 캐시 금지
      • 혹시라도 백엔드가 정적 파일 응답에 세션 쿠키를 발행하는 경우 안전하게 우회.
    3. 브라우저 캐시도 함께 설정
      • 해시가 있는 파일은 1년 + immutable 권장.
    4. 서버 캐시 TTL은 짧게
      • 마이크로 캐싱 용도로 1분~10분 정도가 적당.


    ⚙️ Nginx 설정 예시

    # 정적 파일(해시 포함) + 마이크로 캐싱
    location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff2?)$ {
        proxy_pass http://localhost:port;                # 백엔드 서빙 유지
    
        # --- 서버 앞단 캐시(Nginx 프록시 캐시) ---
        proxy_cache my_cache;
        proxy_cache_key "$scheme$host$request_uri";
        proxy_cache_valid 200 10m;                        # TTL: 10분 (해시 없는 파일은 더 짧게)
        proxy_cache_lock on;                              # 동시 폭주 방지
        proxy_cache_use_stale updating;
    
        # 요청 쿠키는 허용, 응답 Set-Cookie 시 캐시 제외
        proxy_no_cache       $auth_cache_bypass $upstream_http_set_cookie;
        proxy_cache_bypass   $auth_cache_bypass $upstream_http_set_cookie;
    
        # --- 브라우저 캐시 ---
        expires 1y;
        add_header Cache-Control "public, max-age=31536000, immutable" always;
    
        # 상태 확인용 헤더
        add_header X-Cache-Status $upstream_cache_status always;
    }

    ⚠️ 해시 없는 파일(예: /styles/main.css)이라면 proxy_cache_valid를 더 짧게(예: 1~5분) 두고, 브라우저 캐시도 max-age=300 정도로 조정하세요.


    🧱 테스트 방법

    # 첫 요청: MISS
    curl -I https://example.com/_next/static/chunks/app.abc123.js | grep -i x-cache-status
    
    # TTL 내 재요청: HIT
    curl -I https://example.com/_next/static/chunks/app.abc123.js | grep -i x-cache-status
    
    # 브라우저 캐시 헤더 확인
    curl -I https://example.com/_next/static/chunks/app.abc123.js | egrep -i 'cache-control|expires'

    🧤 운영 TIP

    • 정적 전용 서브도메인(예: static.example.com)을 사용하면 브라우저가 쿠키를 아예 붙이지 않아 캐시 효율 ↑.
    • 빌드 툴(Next.js, React, Vue 등)의 filename hashing을 켜두면 캐시 무효화 걱정 없이 TTL을 길게 가져갈 수 있음.
    • Nginx 프록시 캐시 + 브라우저 캐시를 동시에 쓰면 최초 1회만 백엔드 요청, 그 이후는 대부분 브라우저 또는 Nginx에서 응답.

    🧤 알아두어야 할 것

    🖥 서버 캐싱 (서버 단 캐시)

    • 위치: Nginx(리버스 프록시)나 CDN, API Gateway 같은 서버 측
    • 동작:
      1. 첫 요청 → 서버가 백엔드에 요청해 응답 저장
      2. TTL 안의 재요청 → 서버 캐시에서 바로 응답
      3. TTL 지나면 백엔드 재요청
    • 장점:
      • 백엔드 부하 감소 (API·정적 파일 모두 가능)
      • TTL 내에 여러 유저 요청을 합쳐서 처리 가능
      • 브라우저 캐시를 무시하고도 동작 가능 (모든 클라이언트 공통)
    • 단점:
      • TTL 안에서는 변경된 데이터가 바로 반영 안 될 수 있음
      • 서버 디스크/메모리 사용

    예시: proxy_cache (Nginx), CloudFront, Varnish, Redis 기반 캐시

    🌐 브라우저 캐싱 (클라이언트 단 캐시)

    • 위치: 사용자의 웹 브라우저 로컬 저장소
    • 동작:
      1. 첫 요청 시 응답을 브라우저가 저장
      2. TTL 또는 조건부 요청(ETag, Last-Modified) 안에서는 서버에 재요청 없이 바로 로컬에서 로드
      3. TTL 지나면 서버에 새로 요청
    • 장점:
      • 요청 자체를 줄여 네트워크 속도 향상
      • 서버에 트래픽이 아예 가지 않음
    • 단점:
      • 브라우저별·사용자별로 캐시가 따로 있음
      • TTL 안에 새 버전 배포 시 즉시 반영 안 됨
      • 캐시 무효화(무효화 정책, 파일명 변경) 필요

    예시: Cache-Control: max-age=31536000, immutable, ETag + If-None-Match


    🔥 빌드할때 왜 해시 기반 파일명으로 할까?

    📌 해시 기반 파일명의 핵심 목적: 

    캐시 무효화(Cache Busting)

    • 브라우저 캐싱은 빠른 로딩을 위해 오래 저장하지만, 이게 변경 반영에는 치명적일 수 있음.
    • 파일명이 고정이면 (app.js), 브라우저는 TTL 동안 절대 새로 다운로드 안 함.
    • 그래서 파일 내용이 바뀔 때마다 내용 기반 해시(MD5/SHA1 등)를 파일명에 포함시켜 버전처럼 사용.
    빌드 전빌드 후
    /static/app.js/static/app.9fceb3d2.js
    /static/style.css/static/style.ae3d9c9f.css

    🛠 동작 방식

    1. 빌드 시 JS/CSS 내용의 해시를 계산
    2. 해시를 파일명에 삽입
    3. HTML에서 그 새 파일명을 참조
    4. 브라우저는 이름이 다르면 다른 파일로 인식 → 즉시 새로 다운로드

    ✅ 장점

    1. 1년 캐시 가능
      • 파일명이 바뀌면 브라우저는 무조건 새로 받음 → TTL 무시
    2. 불필요한 네트워크 요청 제거
      • 내용이 안 바뀌면 계속 기존 캐시 사용
    3. CDN/프록시 캐시 효율 극대화
      • 전 세계 캐시 서버에 동일한 파일명이 유지

    ⚠️ 단점

    • 빌드 과정에서 HTML/JS 내부의 파일 경로를 전부 갱신해야 함
    • 해시 값이 조금이라도 달라지면 완전히 새 파일로 인식 → 캐시 100% 무효화 (좋기도 하고, 비효율일 수도 있음)

    📍 정리

    • 해시 기반 파일명 덕분에 Cache-Control: max-age=31536000, immutable 같은 1년 브라우저 캐싱 정책을 안전하게 쓸 수 있음.
    • 해시 없이 고정 파일명이라면, 이렇게 길게 캐싱하면 배포 때 문제 생김.

  • 하나의 서버에서 두 도메인 SSL 설정 방법

    하나의 서버에서 두 도메인 SSL 설정 방법

    하나의 서버에서 2개의 웹 프론트 서버가 서로 다른 도메인으로 SSL(443포트) 사용 가능하다. 단, 아래 조건을 만족해야 한다.


    ✅ 전제 조건

    1. 도메인이 서로 다름
      • 예: a.example.com, b.example.com
    2. 각 도메인에 대해 유효한 SSL 인증서
      • Let’s Encrypt 등에서 도메인 별 인증서 발급
    3. 리버스 프록시(Web 서버)가 하나만 443 포트를 바인딩
      • Nginx나 Apache 같은 리버스 프록시를 사용해 도메인에 따라 백엔드 서버로 트래픽 분기

    🧱 구조 예시

    [Client]
       |
    443 포트 요청 (도메인 A 또는 B)
       ↓
    [Nginx Reverse Proxy]  (SSL 인증서 설정, 443 포트 점유)
       ├──> http://localhost:3001 (도메인 A용 웹 앱)
       └──> http://localhost:3002 (도메인 B용 웹 앱)
    # nginx conf 예시
    
    # a.example.com에 대한 설정
    server {
        listen 443 ssl;
        server_name a.example.com;
    
        ssl_certificate     /etc/ssl/certs/a_cert.pem;
        ssl_certificate_key /etc/ssl/private/a_key.pem;
    
        location / {
            proxy_pass http://localhost:3001;
        }
    }
    
    # b.example.com에 대한 설정
    server {
        listen 443 ssl;
        server_name b.example.com;
    
        ssl_certificate     /etc/ssl/certs/b_cert.pem;
        ssl_certificate_key /etc/ssl/private/b_key.pem;
    
        location / {
            proxy_pass http://localhost:3002;
        }
    }

    📝 요약

    항목가능 여부설명
    443 포트 공유 가능Nginx나 Apache 하나만 점유하고 도메인 분기로 분리
    서로 다른 도메인 사용server_name으로 분기 가능
    SSL 인증서 동시 적용도메인별 인증서 각각 설정 필요

    📌 SSL 없이도 가능? (HTTP:80)

    SSL 인증서를 사용하지 않고 하나의 서버에서 두 개의 웹 프론트 서버를 서로 다른 도메인으로 띄우는 것도 가능하다. 이 경우엔 443 포트가 아니라 80포트로 사용하게 된다.

    ✅ 요약: SSL 없이 가능한가?

    조건가능 여부설명
    SSL 없이 HTTP만 사용할 경우80 포트는 여러 도메인에서 공유 가능
    도메인 별로 서비스 가능server_name으로 도메인 분기 가능
    보안 (HTTPS) 없음모든 트래픽이 암호화되지 않음 (보안 취약)

    ⚠️ 주의할 점

    • 중간자 공격(MITM)에 취약 → 로그인, 개인정보 송수신이 있다면 반드시 SSL 사용 권장
    • 일부 브라우저에서는 HTTPS 필수로 요구 → 특히 PWA, 모바일 앱, OAuth, API 연동 등에서 문제 발생 가능

    💬 결론

    도메인이 있다면 포트를 나눌 필요 없음. Nginx 같은 리버스 프록시로 하나의 포트(80/443)에서 라우팅 가능

    도메인이 없으면 포트를 나눠야 함. 각 서비스가 독립된 포트를 차지해야 하므로

  • PostgreSQL DB Dump 방식으로 다운그레이드 가이드

    PostgreSQL DB Dump 방식으로 다운그레이드 가이드

    ✅ 1단계: PostgreSQL 17 클라이언트 설치

    sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    sudo dnf -qy module disable postgresql
    sudo dnf install -y postgresql17

    ✅ 2단계: 백업 (pg_dump 사용) – 17버전

    export PGPASSWORD='password'
    
    /usr/pgsql-17/bin/pg_dump \
      -h 192.168.3.72 \
      -p 5432 \
      -U DB-User \
      -d NineMemos_Dev_BC_01 \
      -Fc \
      -v \
      -f ~/NineMemos_Dev_BC_01_pg17.dump

    ✅ -Fc 뜻

    옵션설명
    -Fpg_dump의 output format(출력 형식) 지정 옵션
    c**custom format (커스텀 형식)**의 약자입니다.

    ✅ 왜 Fc를 써?


    커스텀 형식은 다음과 같은 장점이 있어서 실무에서 가장 많이 사용되는 방식입니다.

    장점설명
    ✅ pg_restore로 복원 가능백업 중 일부 테이블만 복원하거나 병렬 복원(–jobs) 가능
    ✅ 압축 지원기본적으로 압축된 상태로 저장됨
    ✅ 유연한 복원특정 스키마, 테이블, 함수만 선택적으로 복원 가능

    ✅ 3단계: PostgreSQL 14 클라이언트 설치

    sudo dnf install -y postgresql14

    ✅ 4단계: 복원 (pg_restore 사용)

    백업을 17버전으로 했다면, 복원도 17버전으로 하는게 좋다(권장)

    export PGPASSWORD='password'
    
    /usr/pgsql-14/bin/pg_restore \
      -h [14.17-RDS-엔드포인트] \
      -p 5432 \
      -U DB-User \
      -d NineMemos_Dev_BC_01 \
      ~/NineMemos_Dev_BC_01_pg17.dump
  • CentOS7 에서 Metricbeat 설치 및 활용 가이드

    CentOS7 에서 Metricbeat 설치 및 활용 가이드

    metricbeat 란?

    Metricbeat를 이용하면 시스템과 서비스에서 메트릭 정보를 손쉽게 수집할 수 있다.

    Cpu, Memory, File system, Disk IO, Network IO 등과 시스템에서 실행되는 모든 프로세스에 대한 통계를 수집하여 전송한다.

    또한 기본적으로 내장되어 있는 모듈은 Apache, Jolokia, NGINX, MongoDB, MySQL, PostgreSQL, Prometheus 등의 다양한 서비스로부터 메트릭을 수집하며, 원하는 모듈이 없다면 Go Language로 새로운 모듈을 간단하게 생성할 수도 있다.

    metricbeat 설치

    yum으로 ELK stack을 설치했지만 이번에는 download 받아서 설치함.

    $ curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.10.2-x86_64.rpm
    
    $ sudo rpm -vi metricbeat-7.10.2-x86_64.rpm
    vi /etc/matricbeat/metricbeat.yml

    Kibana

    elasticsearch Output

    kibana Dashboard 설정

    $ metricbeat setup --dashboards

    Metricbeat 실행

    $ metricbeat setup -e

    서비스활성화

    $ sudo systemctl enable metricbeat
    $ sudo chkconfig --add metricbeat
    $ sudo systemctl start metricbeat

    elasticsearch Index 확인

    $ curl localhost:9200/_cat/indices?v

    Kibana 확인

    우선 metricbeat-* Index Pattern을 만들어야 함.

    Kibana Dashboard

    metricbeat의 kibana dashboard template를 다운받았기 때문에 Dashboard에 들어가면 수많은 템플릿이 기본적으로 제공됨.

  • CentOS7 에서 Java 및 Elasticsearch 설치 가이드

    CentOS7 에서 Java 및 Elasticsearch 설치 가이드

    java설치

    java 버전 확인

    java -version

    java 설치할 수 있는 버전 확인

    yum list java*jdk-devel

    java가 설치 되지 않았다면 — java 설치

    yum install java-1.8.0-openjdk-devel.x86_64

    Java 설치 확인

    javac -version
    java -version

    환경변수 등록

    readlink -f /usr/bin/java

    JAVA_HOME = 복사한 경로(/jre/bin/java 빼고)

    ‘vi /etc/profile’

    JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64 
    PATH=$PATH:$JAVA_HOME/bin 
    CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar 
    export JAVA_HOME PATH CLASSPATH

    ‘source /etc/profile 명령어로 활성화.’

    환경변수 등록 테스트

    echo $JAVA_HOME
    echo $PATH
    echo $CLASSPATH

    elasticsearch GPG key 다운

    rpm — import https://artifacts.elastic.co/GPG-KEY-elasticsearch

    repo 파일 추가하기.
    vi /etc/yum.repos.d/elasticsearch.repo

    [elasticsearch]
    name=Elasticsearch repository for 7.x packages
    baseurl=https://artifacts.elastic.co/packages/8.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=0
    autorefresh=1
    type=rpm-md

    elasticsearch 설치

    yum install --enablerepo=elasticsearch elasticsearch

    elasticsearch 파일 편집.
    ‘vi /etc/elasticsearch/elasticsearch.yml’

    • 수정 할 부분.
      – node.name: 주석제거
      – network.host : 0.0.0.0 : 주석제거 및 변경
      – http.port : 9200 주석제거
      – discovery.seed_hosts : [“127.0.0.1”]
      – cluster.initial_master_nodes : [“node-1”]

    +++ secure 부분 설정 추가

    사진과 같이 주석처리 및 변경처리

    ES 재시작 및 설치 확인

    systemctl restart elasticsearch
    curl http://127.0.0.1:9200

    만약, 위와 같이 안나올경우, JAVA 환경변수 다시 확인

    Kibana 설치

    rpm — import https://artifacts.elastic.co/GPG-KEY-elasticsearch

    kibana.repo 수정

    vi /etc/yum.repos.d/kibana.repo

    [kibana-7.x]
    name=Kibana repository for 7.x packages
    baseurl=https://artifacts.elastic.co/packages/7.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md

    install

    yum install kibana

    kibana.yml 수정

    vi /etc/kibana/kibana.yml

    제거해야할 부분

    • server.port : 5601
    • server.host : “0.0.0.0”
    • elasticsearch.hosts: [“http://localhost:9200″]

    Kibana 재시작 및 설치 확인

    systemctl restart kibana

    브라우저에 http://해당 ip : 5601

    만약 브라우저에 뜨지 않는다면,

    • 로컬디스크 C > Window > System32 > drivers > etc > hosts 파일에 등록.
    • 방화벽 확인.
    iptables -nL
    systemctl stop firewalld
    systemctl disable firewalld

    참고

    ip addr # ip 설치 확인.

    logstash 설치

    rpm 설치

    rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

    logstash.repo 수정

    vi /etc/yum.repos.d/logstash.repo
    
    ---
    
    [logstash-7.x]
    name=Elastic repository for 7.x packages
    baseurl=https://artifacts.elastic.co/packages/7.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md

    install

    yum install logstash

    pipeline.conf 설정

    cd /etc/logstash/conf.d

    conf파일 생성 => 이름은 아무거나 입력해도 됨. (ex -> demo-pipeline.conf) 생성

    # Sample Logstash configuration for creating a simple
    # Beats -> Logstash -> Elasticsearch pipeline.
    
    input {
    #  beats {
    #    port => 5044
    #    host => "0.0.0.0"
    #  }
      tcp {
        codec => json
        #iformat => json_event
        port => 5044
        host => "localhost(자기자신 IP 넣기)"
        #type => 'stucco-tcp'
      }
    }
    output {
      elasticsearch {
        hosts => ["http://0.0.0.0:9200"]
        #hosts => ["http://localhost:9200"]
        index => "crawler-%{+YYYY.MM.dd}"
    #    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #    #user => "elastic"
    #    #password => "changeme"
      }
      stdout{codec => rubydebug}
    }

    logstash 재실행

    systemctl restart logstash

    filebeat 설치

    rpm 설치

    rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

    install

    yum install filebeat

    filebeat.yml 수정

    vi /etc/filebeat/filebeat.yml

    system 활성화 및 modules 리스트 확인

    filebeat modules enable system
    filebeat modules list

    시스템 재가동

    systemctl restart elasticsearch
    systemctl restart logstash
    systemctl restart kibana
    systemctl restart filebeat
  • Prometheus Node Exporter 설치가이드

    Prometheus Node Exporter 설치가이드

    node exporter 설치

    wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz

    파일 압축 풀기

    tar xzvf node_exporter-1.7.0.linux-amd64.tar.gz

    Node exporter 실행

    node_exporter를 이용해서 서버의 리소스를 메트릭으로 전달한다. 서버 모니터링을 할 서버에 설치해야 한다.

    설치하는 서버 방화벽 9100 해제해야 한다.

    ./node_exporter
    ./node_exporter & # 백그라운드 실행.

    Prometheus — node_exporter 사이에 metric 전송 방식은 prometheus가 node_exporter가 설치된 서버에 정보를 당겨오는 방식(Pull방식.)

    ✅ 따라서, node_exporter가 설치된 서버에서 Prometheus 서버에 대해 9100 포트를 열어야 한다.

    📌 systemd 서비스 등록

    [Unit]
    Description=Node Exporter
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    User=root
    Group=root
    Type=simple
    ExecStart=/usr/local/bin/node_exporter
    Restart=always
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
  • Prometheus Alertmanager Curl로 Silence 요청하는 법

    Prometheus Alertmanager Curl로 Silence 요청하는 법

    • 해당 기능: Jenkins 사용해서 shell schedule로 돌림.

    먼저, 프로메테우스 — alertmanager 서버 방화벽이 뚫려 있어야 함.

    curl -XPOST -H "Content-Type: application/json" \
      -d '{
            "matchers": [
              {
                "name": "instance",
                "value": "서버_IP:9100",
                "isRegex": false
              },
              {
                "name": "job",
                "value": "서버JOB이름",
                "isRegex": false
              }
            ],
            "startsAt": "'$(date -u -d "16:00 tomorrow" +"%Y-%m-%dT%H:%M:%SZ")'",
            "endsAt": "'$(date -u -d "21:00 tomorrow" +"%Y-%m-%dT%H:%M:%SZ")'",
            "createdBy": "Jenkins",
            "comment": "Scheduled silence from Jenkins for SS-API-03"
          }' \
      http://alertmanager서버_IP:9093/api/v2/silences

    해당 명령어를 실행하면 alertmanager에 내가 설정한 시간에 Silence가 생김

  • Prometheus 설치가이드

    Prometheus 설치가이드

    prometheus 설치

    Prometheus wget으로 설치

    wget https://github.com/prometheus/prometheus/releases/download/v2.42.0/prometheus-2.42.0.linux-amd64.tar.gz

    Prometheus 압축풀기

    tar -xzvf prometheus-2.42.0.linux-amd64.tar.gz

    prometheus 실행

    ./prometheus--config.file=/파일경로/prometheus.yml

    Prometheus 접속하는 법

    프로메테우스 default 포트 : 9090
    http://localhost:9090

    접속이 된다면, 정상.

    prometheus.yml 파일설정

    # my global config
    global:
      scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
      evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
      # scrape_timeout is set to the global default (10s).
    
    # Alertmanager configuration
    alerting:
      alertmanagers:
        - static_configs:
            - targets: ["localhost:9093"]
              # - alertmanager:9093
    # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
    rule_files: ["alert.rules.yml"]
      # - "first_rules.yml"
      # - "second_rules.yml"
    # A scrape configuration containing exactly one endpoint to scrape:
    # Here it's Prometheus itself.
    scrape_configs:
      # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
      - job_name: "node"
        # metrics_path defaults to '/metrics'
        # scheme defaults to 'http'.
        static_configs:
         - targets: ["ip:9100"]