카페에서 작업하면서 “내 맥북 메모리 부족해지면 메일로 알람 오게” 만들려고 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/tcpzbx-server:0.0.0.0:10051->10051/tcpzbx-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 GBAvailable 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는 뜨는데 메일이 안 왔다” 원인 요약 (진짜 핵심)
내가 겪은 흐름을 딱 정리하면 이거였다.
-
데이터 수집이 안 됨
- 템플릿 선택 UI(필터), host 설정/interface 혼선, 템플릿(active) 방향 수정하면서 해결
-
데이터는 뜨는데 트리거가 안 만들어짐
max()같은 함수에 기간 파라미터를 안 넣어서 에러 → 기간(T) 지정해서 해결
-
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) 이 흐름이 모두 맞아야 알람이 온다.