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

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 版本演进

版本发布时间主要特性
NetSaint1999最初版本,基础监控功能
Nagios 1.x2002更名,社区化发展
Nagios 2.x2005改进插件系统,增加被动检查
Nagios 3.x2009引入模板继承、宏扩展、分布式监控
Nagios 4.x2013事件循环重写、性能提升、并行化检查
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 插件返回值规范

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

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 架构对比

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

5.2 功能对比

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

5.3 适用场景对比

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

六、与 Prometheus 对比

6.1 架构理念对比

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

6.2 数据流对比

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

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

6.3 适用场景对比

场景推荐方案原因
传统 IT 基础设施Nagios成熟的检查插件,稳定的监控逻辑
云原生/KubernetesPrometheus原生支持服务发现和指标采集
应用性能监控(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/NRPEcheck_nrpe, check_ssh
网络设备SNMPcheck_snmp, check_ifoperstatus
存储设备SNMP/厂商插件check_snmp_storage
数据库专用插件check_mysql, check_pgsql
Web 应用HTTP/HTTPScheck_http, check_url
邮件服务SMTP/IMAP/POP3check_smtp, check_imap

7.1.2 中小规模环境

规模主机数量服务数量推荐方案
小型1-50100-500Nagios Core
中型50-200500-2000Nagios Core + NRPE 分布式
大型200-5002000-5000Nagios Core + 分布式架构
超大型>500>5000Nagios 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.x4.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。