카페에서 작업하면서 “내 맥북 메모리 부족해지면 메일로 알람 오게” 만들려고 Zabbix를 붙였다. Zabbix 서버는 AWS Lightsail(우분투) 위에 Docker, 모니터링 대상은 맥북(Zabbix agent).

결론부터 말하면:

  • 데이터 수집은 성공 (Latest data에서 메모리 값 뜸)
  • 트리거 생성도 성공 (조건식 만들기 삽질 있음)
  • 메일 발송도 성공 (SMTP/Gmail 설정 삽질 있음)
  • 하지만 Problems는 뜨는데 메일이 안 오는 경우는 대부분 “Action에 Operation이 없거나(진짜 흔함)” “이미 떠 있던 Problem에 소급 적용 안 됨” 이슈였다.

1. 구성도

  • Zabbix Server

    • AWS Lightsail (Ubuntu)
    • Docker 컨테이너

      • zbx-server (10051)
      • zbx-web (8080)
      • zbx-postgres
  • Agent

    • 맥북 (카페 Wi-Fi)
    • zabbix_agentd 실행

2. Zabbix 서버(Docker) 확인

서버에서 컨테이너/포트 확인:

docker ps --format "table \t"

예시 출력:

  • zbx-web : 0.0.0.0:8080->8080/tcp
  • zbx-server : 0.0.0.0:10051->10051/tcp
  • zbx-postgres : 5432/tcp

여기서 중요한 포인트:

  • 10051은 “Zabbix Server 포트”
  • 에이전트(Agent)가 Listen 하는 포트는 보통 10050
  • “active check” 방식이면 구조가 더 다름(아래에서 설명).

3. 네트워크 체크: 포트가 열려있는지 (카페에서)

처음엔 카페에서 nc가 타임아웃 났다가, 나중엔 성공했다. 이건 보통 Lightsail 방화벽(네트워킹) / UFW / 보안 그룹 중 하나가 막고 있다가 열렸다는 시그널.

맥에서 테스트:

nc -vz 52.78.189.119 10051
  • Operation timed out → 막혀있음
  • succeeded! → 열려있음 ✅

4. Zabbix UI에서 Host 만들기

(1) Templates / Groups / Interface 의미

  • Templates

    • “어떤 지표(Items)를 수집할지 + 어떤 트리거(Triggers)를 쓸지”가 들어있는 패키지
    • 예) CPU, Memory, Disk, Network 등을 자동으로 만들어줌
  • Host groups

    • 호스트를 분류하는 태그/폴더 같은 개념
    • 예) Linux servers, Mac, DB 등등
  • Interfaces

    • Zabbix가 “어떤 주소/포트로 수집하러 갈지” 정의하는 곳
    • Agent / SNMP / JMX / IPMI 같은 타입이 있음
    • 주의: 템플릿이 “active check” 기반이면 interface 개념이 다르게 느껴질 수 있음(아래 참고)

5. 왜 Latest data가 처음엔 안 떴는가? (핵심 원인 정리)

5-1) “Templates 창에 안 보임” 이슈

Zabbix의 템플릿 선택 창은 필터가 설정되지 않으면 목록이 비어 보이는 UI가 있다. (“Filter is not set / Use the filter…” 같은 메시지)

➡️ 해결: 템플릿 선택 창에서 검색/필터로 템플릿 이름을 직접 쳐서 찾아 선택.


5-2) Host Interface가 이상하게 잡혀있던 문제

Host 설정 화면에서 Interface가 0.0.0.0 + 10051 같은 형태로 들어가 있으면 거의 100% 이상하다.

  • 10051은 서버 포트지 “에이전트 포트”가 아님
  • 에이전트 방식이면 보통 10050
  • active check면 아예 “서버가 에이전트로 연결”하는 방식이 아니라 “에이전트가 서버로 연결”한다

5-3) 결국 뜨게 만든 결정적 해결

내 케이스는 최종적으로 템플릿을 Linux by Zabbix agent active 쪽으로 맞추고, 데이터가 뜨기 시작했다.

Latest data에서 아래처럼 값이 뜨면 성공:

  • Available memory : 4.04 GB
  • Available memory in % : 25.2499 %

추가로 로컬 에이전트가 동작하는지도 확인:

zabbix_agentd -t system.uptime
# system.uptime [u|312327]

이 출력이 나오면 에이전트는 정상이다.


6. 트리거(Trigger) 만들기: “메모리 10% 이하 3분 지속이면 알람”

6-1) 트리거는 “조건식”이다

트리거는 결국:

  • 특정 Item(예: Available memory in %)이
  • 특정 조건(예: < 10)을
  • 특정 시간동안(예: 3m) 만족하면
  • Problem 이벤트를 만든다

6-2) Expression에서 삽질한 포인트: max() 에러

트리거 조건 만들다가 이런 에러가 떴다:

Invalid condition: mandatory parameter is missing in function “max”.

즉, max() 같은 함수는 “기간 T” 같은 파라미터가 반드시 들어가야 한다.


6-3) Condition 창에서 Last of(T), Time shift, Result 넣는 법

  • Last of (T)

    • “최근 얼마 기간을 볼 건지”
    • 예: 3m (최근 3분)
  • Time shift

    • 과거 구간을 당겨서 볼 때 쓰는 옵션 (보통 비움)
    • 기본은 빈칸으로 두면 됨
  • Result

    • 함수 결과를 어떤 값과 비교할지
    • 하지만 여기 UI는 좀 헷갈릴 수 있음 → 더 쉬운 방법은 Expression constructor에서 “threshold 비교”를 직접 넣는 방식

내가 최종적으로 만들었던 목표는 이거:

  • “Available memory in % 가 10% 미만이 3분 지속

7. 이메일 알림(Alerts) 설정

7-1) “Media types disabled in Alerts” 에러

User의 Media(이메일) 추가하려는데 다음 오류:

Media types disabled in Alerts.

대개는 Email media type이 비활성화되어 있거나 미디어 타입 설정이 미완성이라서 발생한다.


7-2) SMTP 기본값 때문에 난 오류

이메일 테스트에서 이런 오류도 봤다:

cannot connect to SMTP server “mail.example.com”: getaddrinfo() failed

이건 설정이 실제 메일 서버가 아니라 예시 도메인(mail.example.com)로 되어 있어서 DNS 조회부터 실패한 것.


7-3) Gmail로 보낼 때 “Incomplete configuration: Gmail”

Cannot enable media type Incomplete configuration: Gmail

Gmail을 쓰려면 Zabbix의 Gmail 미디어 타입 설정(인증 정보/필수값)이 완성돼야 enable이 된다.


7-4) 최종 상태: 테스트 메일 성공 ✅

SMTP/Gmail 설정 마치고 나서 Test mail이 성공적으로 발송됨 (이 단계까지 오면 “메일 발송 기능 자체”는 정상)

그리고 User profile에서도 Email Media가 이렇게 붙어있는 상태:

  • Type: Email
  • Send to: 내 Gmail
  • Status: Enabled

8. Action 설정: “Problem이 뜰 때 메일 보내라”

여기서 많이들 헷갈리는데:

  • Trigger는 “문제를 만들기”
  • Action은 “문제가 생겼을 때 뭘 할지(메일 보내기)”다

즉, Problem이 떠도 Action이 없으면 메일이 안 간다.

8-1) Operation details 체크 포인트

Operation details에서 보통 이렇게 둔다:

  • Steps: 1 - 1 (한 번만 보내기)
  • Send to users: Admin (Zabbix Administrator)
  • Send to media type: Email

중요: Action에 Operation이 실제로 존재해야 한다. (Operation이 없으면 화면에 “At least one operation must exist” 같은 경고가 뜨고, 당연히 메일도 안 감)


9. 테스트는 어떻게 했나? (메모리 강제로 먹여서 트리거 발동)

메모리 부족 알람을 테스트하려고 파이썬으로 메모리를 인위적으로 점유했다:

python3 - <<'PY'
import time
a=[]
for _ in range(120):
    a.append(bytearray(50*1024*1024))  # 50MB
    time.sleep(0.2)
print("allocated", len(a)*50, "MB")
time.sleep(600)  # 10분 유지
PY

이 코드의 동작 방식

  • 이건 내 맥 터미널에서 실행되는 1회성 프로세스
  • time.sleep(600) 동안 메모리 점유 유지
  • 내가 Ctrl + C 하면 즉시 종료되고,
  • 프로세스가 죽으면 점유 메모리는 OS가 회수함 → 흔적 남지 않음

10. “Problems는 뜨는데 메일이 안 왔다” 원인 요약 (진짜 핵심)

내가 겪은 흐름을 딱 정리하면 이거였다.

  1. 데이터 수집이 안 됨

    • 템플릿 선택 UI(필터), host 설정/interface 혼선, 템플릿(active) 방향 수정하면서 해결
  2. 데이터는 뜨는데 트리거가 안 만들어짐

    • max() 같은 함수에 기간 파라미터를 안 넣어서 에러 → 기간(T) 지정해서 해결
  3. Problem은 뜨는데 메일이 안 옴

    • 메일 미디어 타입이 disabled / SMTP 예시값 / Gmail 설정 미완성 → SMTP/Gmail 설정 완료
    • Action에 Operation이 없거나, 조건이 특정 트리거만 대상으로 걸려있으면 다른 Problem엔 메일이 안 감

11. 다음에 확장할 것들

  • CPU 사용률/디스크/네트워크도 트리거 추가
  • “카페 Wi-Fi에서 끊김” 같은 상황 감지용 트리거(Active checks unavailable)도 별도 알림으로
  • Slack/Telegram 같은 채널로도 동일 알림 분기

마무리

Zabbix는 “Problem 뜨는 것”과 “메일이 가는 것”이 완전히 분리되어 있어서, Trigger만 만들고 끝내면 메일이 안 오는 게 정상이다.

  • Item 수집 → Trigger → Action(Operation) → Media type(SMTP) 이 흐름이 모두 맞아야 알람이 온다.