Icinga是一款继承自Nagios思想的开源监控系统,核心由Icinga2引擎和Icinga Web 2管理界面两部分组成。引擎负责调度检查任务、记录状态变更,Web界面则提供主机视图、服务视图和告警历史。默认情况下Icinga Web 2通常搭配Apache运行,但如果你所在的环境已经在使用Nginx,或者希望获得更好的静态资源处理性能,完全可以把Nginx作为前端Web服务器来承接Icinga Web 2的页面请求。本文以CentOS/Ubuntu通用流程为例,完整讲解这套监控框架的搭建与配置过程。

一、安装Icinga2核心与数据层组件
Icinga2是整个监控系统的心脏,它本身不依赖任何Web服务器,独立以守护进程方式运行。在CentOS上需要先安装EPEL仓库以及Icinga官方仓库,Ubuntu则可以直接使用官方提供的软件源。安装完成后,Icinga2自带一个命令行工具icinga2,可用于功能启用、配置校验和节点注册。
只有Icinga2还不够,Icinga Web 2的运行依赖IDO模块把监控数据写入数据库,因此MySQL或PostgreSQL是必装项。以MySQL为例,安装Icinga2的ido-mysql模块后,需要创建数据库并导入结构,再启用模块:
# 安装核心与模块 yum install -y icinga2 icinga2-ido-mysql icingaweb2 icingacli mariadb-server # 创建数据库并导入结构 mysql -e "CREATE DATABASE icinga CHARACTER SET utf8mb4;" mysql -e "GRANT ALL ON icinga.* TO icinga@localhost IDENTIFIED BY 'your_password';" mysql icinga < /usr/share/icinga2-idomysql/schema/mysql.sql # 启用IDO模块并重启服务 icinga2 feature enable ido-mysql command systemctl restart icinga2 systemctl enable icinga2 mariadb
启用command特性非常关键,它会让Icinga2在/var/run/icinga2/cmd/live路径下生成命令管道,Icinga Web 2正是通过这个管道向监控引擎发送主动命令,例如立即执行一次检查或者手动确认告警。如果忘记启用,Web界面上这些操作按钮会全部失效,这也是新手最常见的坑之一。
二、配置Nginx与PHP-FPM对接Icinga Web 2
Icinga Web 2是基于PHP的应用,所以Nginx这边需要做两件事:一是把PHP请求交给PHP-FPM处理,二是正确传递路径重写规则。Icinga官方仓库里自带了一份Nginx配置片段,通常位于/etc/nginx/conf.d/icingaweb2.conf,安装后可以直接使用,也可以手动编写。手动配置时重点在于fastcgi_split_path_info与SCRIPT_FILENAME的设置:
server {
listen 80;
server_name monitor.ipipp.com;
root /usr/share/icingaweb2/public;
index index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ ^/index\.php(.*)$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/share/icingaweb2/public/index.php;
fastcgi_param ICINGAWEB_CONFIGDIR /etc/icingaweb2;
fastcgi_param REMOTE_USER $remote_user;
}
}几个细节值得注意。首先是fastcgi_param ICINGAWEB_CONFIGDIR这一行,它告诉Icinga Web 2去哪里读取配置,如果Nginx以非root的普通用户运行且配置目录在/etc/icingaweb2,务必确认该目录对PHP-FPM进程可读。其次是PHP-FPM的socket路径,不同发行版默认路径不一样,CentOS多为/run/php-fpm/www.sock,Ubuntu则可能是/run/php/php8.1-fpm.sock,需要按实际情况调整。最后记得确认SELinux策略,CentOS环境下若SELinux处于Enforcing状态,Nginx连接PHP-FPM socket会被拦截,可临时用setenforce 0验证,确认后通过semanage和setsebool httpd_can_network_connect on做长期放行。
配置完成后,通过nginx -t检查语法并systemctl reload nginx平滑加载。首次访问http://monitor.ipipp.com/会进入Icinga Web 2的安装向导,向导会检测PHP模块、数据库连接、命令管道权限等前置条件,全部通过后设置管理员账号即可完成初始化。如果向导提示token缺失,在服务器上执行icingacli setup token create即可生成。
三、编写监控配置:主机与服务定义
Icinga2的配置语法与老式Nagios的扁平键值对完全不同,它采用对象化的DSL。监控目标通过object Host和object Service来声明,并且支持模板继承和apply规则批量生成服务,这也是它比Nagios灵活得多的地方。主机配置一般放在/etc/icinga2/conf.d/hosts.conf中:
object Host "web-server-01" {
import "generic-host"
address = "192.168.0.10"
check_command = "hostalive"
vars.os = "Linux"
vars.http_vhosts["app"] = {
http_uri = "/health"
}
vars.disks["disk /"] = {
disk_partition = "/"
}
}服务部分推荐用apply规则统一管理,写法更简洁。下面这条规则会为所有设置了http_vhosts变量的主机自动生成HTTP检测服务:
apply Service for (http_vhost => config in host.vars.http_vhosts) {
import "generic-service"
check_command = "http"
vars += config
assign where host.vars.http_vhosts
}
apply Service for (disk_name => config in host.vars.disks) {
import "generic-service"
check_command = "disk"
vars += config
assign where host.vars.disks
}每次修改配置后,必须先执行icinga2 daemon -C做语法校验,确认没有错误再执行systemctl reload icinga2。直接restart会在校验失败时导致服务彻底起不来,而reload即使配置有问题,旧配置仍在运行,风险更小。对于被监控节点较多的情况,还可以启用Icinga2的Agent模式,通过主节点与子节点之间的TLS证书通信实现分布式监控,避免主节点直接向所有内网机器发起检查带来的网络压力。
四、常见问题排查思路
搭建过程中问题集中在几个典型场景。第一类是页面打开报502错误,多数是PHP-FPM没有运行或者socket路径写错,检查systemctl status php-fpm和Nginx错误日志/var/log/nginx/error.log即可定位。第二类是页面显示但显示空白或500,通常是PHP缺少模块,Icinga Web 2至少需要pdo_mysql、gettext、intl等扩展,通过php -m逐项核对。
第三类是监控数据不出图或状态一直PENDING,先确认IDO模块是否启用成功,查看/var/log/icinga2/icinga2.log中有没有数据库连接报错;再检查时间同步,Icinga2对时钟漂移很敏感,建议所有节点统一配置NTP。第四类是Web界面上的操作按钮无反应,回到前面提到的命令管道,确认command特性已启用,且/var/run/icinga2/cmd目录的属组包含Web进程用户。
整套框架跑通之后,建议再补充告警通知配置。Icinga2内置了邮件通知模板,在conf.d/users.conf中定义object User并绑定通知规则,主机宕机或服务异常时就能收到邮件。如果团队使用钉钉或企业微信,也可以编写自定义NotificationCommand调用Webhook脚本实现。Nginx端则可以进一步加上HTTPS证书与访问控制,把监控平台本身的入口保护起来,毕竟监控数据本身就是一份完整的服务器资产清单。