强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Nagios 监控运维完整教程 / 第1章:Nagios 简介与架构

第1章:Nagios 简介与架构

Nagios 是业界最成熟、最广泛使用的开源监控系统之一。本章将深入介绍 Nagios 的历史演变、核心架构、组件模型以及与其他监控系统的对比,帮助你全面理解 Nagios 的定位和适用场景。


一、Nagios 历史与发展

1.1 起源(1999年)

Nagios 最初由 Ethan Galstad 于 1999 年开发,最初名为 NetSaint,是一个用 C 语言编写的网络监控工具。

时间线:
1999 - NetSaint 诞生
2002 - 更名为 Nagios(Nagios Ain't Gonna Insist On Sainthood)
2005 - 发布 Nagios 2.0
2009 - 发布 Nagios 3.0
2013 - 发布 Nagios 4.0(重大架构改进)
2016 - 发布 Nagios Core 4.2.0
2020 - 发布 Nagios Core 4.4.x
2024 - 发布 Nagios Core 4.5.x

1.2 名称由来

Nagios 的全称是 “Nagios Ain’t Gonna Insist On Sainthood”,这是一个递归缩写,体现了开源社区的幽默风格。

1.3 版本演进

版本 发布时间 主要特性
NetSaint 1999 最初版本,基础监控功能
Nagios 1.x 2002 更名,社区化发展
Nagios 2.x 2005 改进插件系统,增加被动检查
Nagios 3.x 2009 引入模板继承、宏扩展、分布式监控
Nagios 4.x 2013 事件循环重写、性能提升、并行化检查
Nagios Core 4.4+ 2018+ 稳定性改进、安全增强

1.4 生态系统

Nagios 的成功不仅在于核心系统,更在于其庞大的生态系统:

┌─────────────────────────────────────────────────────────────┐
│                    Nagios 生态系统                           │
├─────────────────────────────────────────────────────────────┤
│  核心层                                                       │
│  ├── Nagios Core          - 开源核心监控引擎                   │
│  ├── Nagios XI             - 商业企业版(含 Web 界面)          │
│  └── Nagios Fusion         - 多实例聚合视图                    │
├─────────────────────────────────────────────────────────────┤
│  插件层                                                       │
│  ├── Official Plugins      - 60+ 官方检查插件                 │
│  ├── Nagios Exchange       - 3000+ 社区贡献插件               │
│  └── NRPE/NSCA             - 远程检查代理                     │
├─────────────────────────────────────────────────────────────┤
│  扩展层                                                       │
│  ├── PNP4Nagios            - 性能数据图表                     │
│  ├── Thruk                 - 替代 Web 界面                    │
│  ├── Grafana               - 通用可视化                       │
│  └── Naemon                - Nagios 分支                     │
└─────────────────────────────────────────────────────────────┘

二、Nagios Core 架构

2.1 整体架构

Nagios Core 采用模块化、事件驱动的架构设计:

┌─────────────────────────────────────────────────────────────┐
│                     Nagios Core 架构                         │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐      │
│  │  配置文件    │    │  对象定义    │    │  模板继承    │      │
│  │ (nagios.cfg)│    │ (objects/)  │    │  (templates) │      │
│  └─────────────┘    └─────────────┘    └─────────────┘      │
│         │                  │                  │               │
│         └──────────────────┼──────────────────┘               │
│                            ▼                                 │
│  ┌──────────────────────────────────────────────────────┐   │
│  │              配置解析器 (Config Parser)                │   │
│  │    解析配置文件,构建内存中的对象模型                    │   │
│  └──────────────────────────────────────────────────────┘   │
│                            │                                 │
│                            ▼                                 │
│  ┌──────────────────────────────────────────────────────┐   │
│  │              事件调度器 (Event Scheduler)              │   │
│  │    管理检查调度、通知、事件处理的时序控制                │   │
│  └──────────────────────────────────────────────────────┘   │
│                            │                                 │
│         ┌─────────────────┼─────────────────┐                │
│         ▼                 ▼                 ▼                │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │  检查引擎    │  │  通知引擎    │  │  事件处理器  │          │
│  │ (Check)     │  │ (Notify)    │  │ (EventHandler)│        │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
│         │                 │                 │                 │
│         ▼                 ▼                 ▼                │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │  插件执行    │  │  通知命令    │  │  外部脚本    │          │
│  │ (Plugins)   │  │ (Commands)  │  │ (Scripts)   │          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
│                                                               │
└─────────────────────────────────────────────────────────────┘

2.2 核心组件

2.2.1 事件循环(Event Loop)

Nagios 4.x 引入了新的事件循环机制,采用非阻塞 I/O 和并行化处理:

// 简化的事件循环伪代码
while (nagios_running) {
    // 处理定时事件
    process_timed_events();
    
    // 并行执行检查
    run_parallel_checks();
    
    // 处理被动检查结果
    process_passive_checks();
    
    // 发送通知
    send_notifications();
    
    // 处理外部命令
    process_external_commands();
    
    // 短暂休眠,避免 CPU 空转
    sleep(microseconds);
}

2.2.2 检查调度器(Check Scheduler)

检查调度器负责按照配置的时间间隔执行各种检查:

检查类型 说明 调度方式
主机检查 检查主机是否可达 按 check_interval 调度
服务检查 检查服务状态 按 check_interval 调度
被动检查 外部提交的结果 实时处理
重试检查 状态异常时的重试 按 retry_interval 调度

2.2.3 通知引擎(Notification Engine)

通知引擎根据检查结果和配置规则决定是否发送告警:

检查结果 → 状态变化?
            ├─ 否 → 忽略
            └─ 是 → 是否在通知时段?
                      ├─ 否 → 记录日志
                      └─ 是 → 是否需要通知?
                                ├─ 否 → 忽略
                                └─ 是 → 联系人筛选
                                          ├─ 无联系人 → 忽略
                                          └─ 有联系人 → 发送通知

2.3 进程模型

Nagios Core 作为守护进程运行,主进程负责调度和协调:

nagios (主进程)
├── 配置加载
├── 对象初始化
├── 事件循环
│   ├── 检查执行(fork 子进程)
│   ├── 通知发送(fork 子进程)
│   └── 事件处理(fork 子进程)
├── 状态文件写入
└── 日志记录

三、Web 界面

3.1 原生 Web 界面

Nagios Core 自带一个基于 CGI 的 Web 界面,需要配合 Apache 或 Nginx 使用:

┌─────────────────────────────────────────────────────────────┐
│                    Web 界面架构                              │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│  浏览器 ←── HTTP ──→ Web 服务器(Apache/Nginx)               │
│                            │                                  │
│                            ▼                                  │
│                     ┌─────────────┐                          │
│                     │  CGI 程序   │                          │
│                     │ (status.cgi │                          │
│                     │  tac.cgi    │                          │
│                     │  cmd.cgi    │                          │
│                     │  ...)       │                          │
│                     └─────────────┘                          │
│                            │                                  │
│                            ▼                                  │
│                     ┌─────────────┐                          │
│                     │ Nagios Core │                          │
│                     │  状态数据    │                          │
│                     └─────────────┘                          │
│                                                               │
└─────────────────────────────────────────────────────────────┘

3.2 常用 CGI 页面

CGI 程序 功能 访问路径
status.cgi 主机/服务状态总览 /nagios/cgi-bin/status.cgi
tac.cgi 战术概览(Tactical Overview) /nagios/cgi-bin/tac.cgi
extinfo.cgi 详细信息页面 /nagios/cgi-bin/extinfo.cgi
cmd.cgi 外部命令接口 /nagios/cgi-bin/cmd.cgi
history.cgi 历史事件日志 /nagios/cgi-bin/history.cgi
notifications.cgi 通知历史 /nagios/cgi-bin/notifications.cgi
config.cgi 配置查看 /nagios/cgi-bin/config.cgi

3.3 替代 Web 界面

界面 特点 安装复杂度
原生 CGI 轻量、无需额外依赖
Thruk 功能丰富、支持多后端
Nagios XI 商业版完整界面 高(需购买授权)
Grafana 专注可视化、插件丰富

四、插件模型

4.1 插件架构

Nagios 的核心设计理念是插件化,所有检查逻辑都通过插件实现:

┌─────────────────────────────────────────────────────────────┐
│                      插件模型                                │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│  Nagios Core                                                  │
│      │                                                        │
│      │ 执行插件命令                                           │
│      ▼                                                        │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐      │
│  │ check_ping  │    │ check_http  │    │ check_disk  │      │
│  │ (主机检查)   │    │ (Web检查)   │    │ (磁盘检查)  │      │
│  └─────────────┘    └─────────────┘    └─────────────┘      │
│         │                  │                  │               │
│         ▼                  ▼                  ▼               │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐      │
│  │ 系统 ping   │    │ HTTP 请求   │    │ df 命令     │      │
│  └─────────────┘    └─────────────┘    └─────────────┘      │
│                                                               │
└─────────────────────────────────────────────────────────────┘

4.2 插件执行流程

# 1. Nagios 根据配置构造命令行
/usr/lib64/nagios/plugins/check_ping -H 192.168.1.1 -w 100,20% -c 200,50%

# 2. 插件执行检查逻辑
# 3. 插件返回退出码和输出

# 返回码含义:
# 0 = OK
# 1 = WARNING
# 2 = CRITICAL
# 3 = UNKNOWN

# 标准输出格式:
# "PING OK - Packet Loss = 0%, RTA = 10.50ms"

# 4. Nagios 解析返回码和输出
# 5. 更新主机/服务状态
# 6. 根据状态决定是否通知

4.3 插件返回值规范

返回码 状态 含义 典型场景
0 OK 正常 所有指标在阈值内
1 WARNING 警告 指标接近阈值,需要关注
2 CRITICAL 严重 指标超过阈值,需要立即处理
3 UNKNOWN 未知 插件执行异常或无法判断状态

4.4 插件输出格式

# 单行输出(简单格式)
PING OK - Packet Loss = 0%, RTA = 10.50ms

# 多行输出(详细信息)
PING OK - Packet Loss = 0%, RTA = 10.50ms
Packet Loss: 0% (sent: 5, recv: 5, lost: 0)
Round Trip Time: min=8.20ms, max=12.80ms, avg=10.50ms

# 带性能数据的输出
PING OK - Packet Loss = 0%, RTA = 10.50ms | rta=10.50ms;100.00;200.00;0; pl=0%;20;50;0;100

五、与 Zabbix 对比

5.1 架构对比

特性 Nagios Zabbix
架构模式 插件化、事件驱动 服务器-代理-Web 三层架构
数据存储 文件系统(状态文件) 关系型数据库(MySQL/PostgreSQL)
Web 界面 CGI(轻量) 内置(功能丰富)
扩展方式 插件脚本 内置模板和外部检查
分布式监控 需要额外配置(NRPE/NSCA) 原生支持(Proxy/Agent)
学习曲线 中等(配置文件复杂) 中等(Web 界面友好)

5.2 功能对比

功能 Nagios Zabbix
主机监控
服务监控
网络监控
应用监控
性能数据 需要插件(PNP4Nagios) 内置图表
告警通知 ✅(灵活配置) ✅(内置)
自动发现 有限支持 ✅(自动注册)
API 支持 CGI 接口 REST API
高可用 需要额外配置 原生支持

5.3 适用场景对比

场景 推荐方案 原因
小型环境(<50 主机) Nagios Core 轻量、配置灵活
中型环境(50-500 主机) Zabbix Web 界面友好、自动发现
大型环境(>500 主机) Zabbix 或 Nagios XI 需要分布式架构和企业功能
需要深度定制 Nagios Core 插件化架构,完全可控
快速上手 Zabbix Web 配置,学习成本低
已有 Nagios 生态 Nagios 避免迁移成本

六、与 Prometheus 对比

6.1 架构理念对比

特性 Nagios Prometheus
数据模型 状态检查(Check-based) 指标采集(Metrics-based)
存储方式 文件系统 时序数据库(TSDB)
查询语言 无(插件逻辑) PromQL
告警方式 状态变化触发 基于表达式的规则
可视化 PNP4Nagios / Grafana Grafana(原生集成)
云原生支持 有限 原生支持(Kubernetes)

6.2 数据流对比

Nagios 数据流:
  插件 → 检查结果 → 状态判断 → 命令执行(通知/事件处理)

Prometheus 数据流:
  Exporter → Pull 采集 → 时序存储 → PromQL 查询 → AlertManager → 通知

6.3 适用场景对比

场景 推荐方案 原因
传统 IT 基础设施 Nagios 成熟的检查插件,稳定的监控逻辑
云原生/Kubernetes Prometheus 原生支持服务发现和指标采集
应用性能监控(APM) Prometheus 丰富的指标采集和查询能力
混合环境 两者结合 Nagios 监控基础设施,Prometheus 监控应用
需要精确状态监控 Nagios 明确的 UP/DOWN 状态
需要趋势分析 Prometheus 时序数据和 PromQL 查询

6.4 结合使用方案

在实际运维中,Nagios 和 Prometheus 可以互补使用:

┌─────────────────────────────────────────────────────────────┐
│                    混合监控架构                              │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│  ┌─────────────┐          ┌─────────────┐                   │
│  │ Nagios Core │          │ Prometheus  │                   │
│  │ (基础设施)   │          │ (应用指标)   │                   │
│  └─────────────┘          └─────────────┘                   │
│         │                        │                           │
│         │                        │                           │
│         ▼                        ▼                           │
│  ┌─────────────┐          ┌─────────────┐                   │
│  │ 服务器状态  │          │ 应用指标    │                   │
│  │ 网络设备    │          │ 性能数据    │                   │
│  │ 存储设备    │          │ 业务指标    │                   │
│  └─────────────┘          └─────────────┘                   │
│         │                        │                           │
│         └───────────┬────────────┘                           │
│                     ▼                                        │
│              ┌─────────────┐                                │
│              │   Grafana   │                                │
│              │ (统一可视化) │                                │
│              └─────────────┘                                │
│                                                               │
└─────────────────────────────────────────────────────────────┘

七、适用场景分析

7.1 最佳适用场景

7.1.1 传统 IT 基础设施监控

Nagios 最适合监控传统的 IT 基础设施:

监控对象 检查方式 典型插件
服务器 SSH/Telnet/NRPE check_nrpe, check_ssh
网络设备 SNMP check_snmp, check_ifoperstatus
存储设备 SNMP/厂商插件 check_snmp_storage
数据库 专用插件 check_mysql, check_pgsql
Web 应用 HTTP/HTTPS check_http, check_url
邮件服务 SMTP/IMAP/POP3 check_smtp, check_imap

7.1.2 中小规模环境

规模 主机数量 服务数量 推荐方案
小型 1-50 100-500 Nagios Core
中型 50-200 500-2000 Nagios Core + NRPE 分布式
大型 200-500 2000-5000 Nagios Core + 分布式架构
超大型 >500 >5000 Nagios XI 或考虑 Zabbix

7.1.3 需要精确状态监控

Nagios 的二元状态模型(UP/DOWN, OK/CRITICAL)非常适合:

  • 网络设备监控:设备在线/离线
  • 服务可用性:HTTP 200/非200
  • 硬件状态:温度正常/过热,电源正常/故障
  • 存储状态:磁盘正常/故障,RAID 正常/降级

7.2 不太适用的场景

7.2.1 云原生环境

场景 挑战 更好选择
Kubernetes 监控 Pod 动态变化、服务发现 Prometheus + Grafana
微服务架构 服务间依赖复杂 Jaeger + Prometheus
容器化部署 容器生命周期短 cAdvisor + Prometheus

7.2.2 大规模指标采集

场景 挑战 更好选择
高频指标采集 插件执行开销大 Prometheus Pull 模式
海量时序数据 文件存储性能瓶颈 InfluxDB / VictoriaMetrics
复杂查询分析 缺乏查询语言 PromQL / InfluxQL

7.2.3 APM(应用性能监控)

场景 挑战 更好选择
分布式追踪 需要请求链路 Jaeger / Zipkin
应用代码级监控 需要代码插桩 SkyWalking / Pinpoint
用户体验监控 需要 RUM 数据 New Relic / Datadog

7.3 行业应用案例

7.3.1 金融行业

典型场景:银行核心系统监控
├── 服务器监控:小型机、x86 服务器
├── 网络监控:交换机、路由器、防火墙
├── 存储监控:SAN、NAS
├── 数据库监控:Oracle、DB2
├── 中间件监控:WebSphere、Tuxedo
└── 应用监控:核心交易系统

7.3.2 电信行业

典型场景:运营商网络设备监控
├── 网络设备:路由器、交换机、基站
├── 服务器监控:业务服务器、计费服务器
├── 存储监控:大容量存储设备
├── 应用监控:BOSS 系统、CRM 系统
└── 服务质量监控:网络延迟、丢包率

7.3.3 互联网行业

典型场景:Web 服务可用性监控
├── 服务器监控:云服务器、物理服务器
├── 网络监控:负载均衡、CDN
├── 应用监控:Web 服务、API 服务
├── 数据库监控:MySQL、Redis、MongoDB
└── 业务监控:交易量、错误率、响应时间

八、Nagios 4.x 新特性

8.1 性能改进

Nagios 4.x 相比 3.x 有显著的性能提升:

改进点 说明 效果
事件循环重写 非阻塞 I/O 减少延迟,提高响应速度
并行检查执行 多进程并行 大幅提升检查吞吐量
内存优化 对象内存管理 减少内存占用
配置加载优化 增量加载 启动速度更快

8.2 新功能

8.2.1 OCSP/OCHP 命令

# OCSP (Obsessive Compulsive Service Processor)
# 在每次服务检查后执行的命令
ocsp_command=process-service-perfdata

# OCHP (Obsessive Compulsive Host Processor)
# 在每次主机检查后执行的命令
ochp_command=process-host-perfdata

8.2.2 增强的日志功能

# 支持日志级别配置
log_level=LOG_ALL

# 支持日志轮转
log_rotation_method=d

8.2.3 改进的通知系统

# 通知间隔自定义
notification_interval=30

# 通知升级支持
first_notification=3
last_notification=0
notification_interval=60

8.3 配置兼容性

Nagios 4.x 与 3.x 配置基本兼容,主要差异:

配置项 3.x 4.x 说明
event_broker_options 必须 可选 4.x 默认禁用
ocsp_command 不支持 支持 新增特性
ochp_command 不支持 支持 新增特性
log_level 有限支持 完整支持 增强日志控制

九、安装方式概览

Nagios 提供多种安装方式,适用于不同场景:

9.1 编译安装

# 优势:最新版本、完全可控
# 劣势:步骤较多、依赖手动处理

# 1. 安装依赖
yum install -y gcc glibc glibc-common gd gd-devel openssl-devel

# 2. 下载源码
wget https://github.com/NagiosEnterprises/nagioscore/releases/download/nagios-4.5.0/nagios-4.5.0.tar.gz

# 3. 编译安装
tar xzf nagios-4.5.0.tar.gz
cd nagios-4.5.0
./configure --with-command-group=nagcmd
make all
make install
make install-init
make install-config
make install-commandmode
make install-webconf

9.2 包管理器安装

# CentOS/RHEL
yum install -y epel-release
yum install -y nagios

# Ubuntu/Debian
apt-get update
apt-get install -y nagios4

# 优势:简单快捷、依赖自动处理
# 劣势:版本可能较旧、定制受限

9.3 Docker 部署

# 优势:环境隔离、部署快速、易于扩展
# 劣势:需要 Docker 环境、网络配置复杂

docker run -d \
  --name nagios \
  -p 8080:80 \
  -v /path/to/config:/opt/nagios/etc \
  jasonrivers/nagios:latest

十、快速上手示例

10.1 最小配置示例

以下是一个最小的 Nagios 配置,用于监控一台主机:

# /etc/nagios/nagios.cfg - 主配置文件
cfg_file=/etc/nagios/objects/commands.cfg
cfg_file=/etc/nagios/objects/contacts.cfg
cfg_file=/etc/nagios/objects/timeperiods.cfg
cfg_file=/etc/nagios/objects/templates.cfg
cfg_file=/etc/nagios/objects/localhost.cfg
cfg_file=/etc/nagios/objects/myhost.cfg

# 其他配置保持默认...
# /etc/nagios/objects/myhost.cfg - 自定义主机配置
define host {
    use                     linux-server
    host_name               web-server-01
    alias                   Web Server 01
    address                 192.168.1.100
    check_command           check_ping!100.0,20%!500.0,60%
}

define service {
    use                     generic-service
    host_name               web-server-01
    service_description     HTTP
    check_command           check_http
}

define service {
    use                     generic-service
    host_name               web-server-01
    service_description     SSH
    check_command           check_ssh
}

10.2 验证并启动

# 验证配置
nagios -v /etc/nagios/nagios.cfg

# 输出示例:
# Nagios Core 4.5.0
# Copyright (c) 2009-present Nagios Core Development Team
# ...
# Total Warnings: 0
# Total Errors:   0
# Things look okay - No serious problems were detected during the pre-flight check

# 启动服务
systemctl start nagios
systemctl enable nagios

# 访问 Web 界面
# http://your-server-ip/nagios/

十一、注意事项

11.1 常见误区

误区 正确认识
Nagios 已经过时 Nagios 仍在积极维护,适合传统 IT 环境
Nagios 配置很复杂 熟悉后配置逻辑清晰,模板机制灵活
Nagios 不能做分布式 通过 NRPE/NSCA 可以实现分布式监控
Nagios 性能很差 4.x 版本性能大幅提升,适合中等规模环境

11.2 选择建议

场景 建议
学习监控原理 从 Nagios Core 开始
生产环境快速部署 考虑 Zabbix 或 Nagios XI
云原生环境 直接使用 Prometheus
已有 Nagios 环境 继续使用,逐步优化

十二、扩展阅读

12.1 官方文档

12.2 社区资源

12.3 相关教程


十三、本章小结

本章介绍了 Nagios 的历史背景、核心架构、Web 界面、插件模型以及与其他监控系统的对比。关键要点:

  1. Nagios 是成熟的开源监控系统,适合传统 IT 基础设施监控
  2. 插件化架构是其核心设计理念,所有检查通过插件实现
  3. 与 Zabbix 相比,Nagios 更轻量、配置更灵活,但 Web 界面较弱
  4. 与 Prometheus 相比,Nagios 适合状态监控,Prometheus 适合指标采集
  5. Nagios 4.x 带来了显著的性能改进和新特性
  6. 选择监控方案需要根据实际场景和需求综合考虑

下一章第2章:安装与部署 - 学习如何在 Linux 系统上安装和配置 Nagios。