CentOS7 已经停止维护,但很多机房和公司内网里它仍然是主力系统。我去年接手一台跑着旧业务的 CentOS7 服务器,要再塞进去一套网络监控平台,最终选型选了 LibreNMS。这篇文章就围绕 CentOS7 下 LibreNMS 部署、配置、中文界面设置展开,把我从空白系统到成功接入设备、再切到中文界面的完整过程拆开写,包括哪些坑值得绕开、哪些参数必须手动改。适合正要接手企业网络监控、又不想上太重方案的运维朋友。
1. 选型与规划:CentOS7 上这套监控栈的定位
1.1 为什么不是 Zabbix、Cacti,而是 LibreNMS
我最早给公司搭监控的时候,用的是 Cacti 加 RRDtool,画端口流量图确实顺手,但痛点也明显:新增设备要手工加模板、匹配 OID,图表数据量一上来处理就开始慢。后来评估过 Zabbix,功能强是强,但对中小规模网络来说部署和 Agent 维护都有点重,尤其是监控交换机、路由器这一层,SNMP 的接入体验还是不够爽利。
LibreNMS 的特点在于它主要面向网络设备监控,自动发现机制非常友好。你只要给它一个网段,配置好 SNMP community,它自己去扫描、识别设备型号、自动关联对应的 MIB 模板,省掉了很多手工活。而且它自带一套比较现代的 Web UI,支持多用户、告警规则、API 接口,还可以分布式轮询。对一台 CentOS7 机器来说,跑起来压力并不大。
另外一点很实用:LibreNMS 支持多语言,包括中文。这一点对团队里不想碰英文界面的同事非常关键。当时也是看中这一点,才决定把监控平台直接做成中文界面,减少上手成本。
1.2 部署前的资源与网络假设
如果是一台干净的 CentOS7 最小化安装,我建议至少给 2 核 CPU、2GB 内存、20GB 磁盘。监控设备在 100 台以内、轮询间隔 5 分钟的话,这个配置够用。如果后续要监控几百台设备或者缩短轮询周期,再把内存加到 4GB,并把数据库单独放一块盘。
网络方面要提前确认几件事:
- 监控服务器和目标设备之间能互通,UDP 161 是 SNMP 轮询的默认端口,不能挡。
- Web 管理界面需要放行 TCP 80 或 443。
- 如果要用邮件告警,还得保证服务器能访问外部邮件服务或内网 SMTP。
我当时用的是内网隔离环境,服务器没有外网访问权限,安装依赖包得先准备离线仓库,或者在一台能联网的机器上下载好 RPM 包再传进去。这里要给后来的人提个醒:如果环境离线,务必先确认 yum 源是否可用,否则后面每一步都会卡住。
1.3 理清核心组件再动手
LibreNMS 不是单个程序,它是一套组合,核心组件大概是这样:
| 组件 | 建议版本 | 作用 |
|---|---|---|
| CentOS 7 | 7.9 | 操作系统,内核 3.10 |
| MariaDB | 10.5 或 10.6 | 存储设备、用户、告警配置 |
| PHP | 7.4 或 8.1 | 运行 Web 和轮询调度 |
| PHP-FPM | 与 PHP 同版本 | 处理 PHP 动态请求 |
| Nginx | 1.20+ | 提供 Web 访问入口 |
| RRDtool | 系统自带即可 | 存储历史性能图 |
| Memcached | 1.5+ | 缓存会话和临时数据 |
| Python 3 | 3.6+ | 部分探测脚本依赖 |
刚开始部署时我对 PHP 版本不够重视,直接用了 CentOS7 自带仓库的 PHP 5.4,结果 LibreNMS 安装向导直接报版本过低。后来换了 REMI 仓库的 PHP 7.4 才顺利通过。如果你现在拉取的是 LibreNMS 最新代码,建议直接上 PHP 8.1,更接近官方当前测试环境。
2. 环境初始化:最小化系统装完后先做这三件事
2.1 把网络先稳下来:默认网关、DNS、网卡自启
CentOS7 最小化装完,我碰到最典型的问题是网卡默认没开自启。装完系统重启后发现ip addr里根本没有 IP,检查/etc/sysconfig/network-scripts/ifcfg-ens33,发现ONBOOT=no,这时候要改成yes,再配置静态 IP:
BOOTPROTO=static ONBOOT=yes IPADDR=192.168.10.20 NETMASK=255.255.255.0 GATEWAY=192.168.10.1 DNS1=114.114.114.114 DNS2=8.8.8.8改完执行systemctl restart network验证。那时候我还遇到过ping 不通百度的问题,排查方向就两个:一是默认网关没写对,二是 DNS 没配好。先用ip route看 default route 是否存在,再用nslookup www.baidu.com验证 DNS 是否可用。生产环境里 DNS 经常被安全策略限制,这时候优先确认内网 DNS 地址,而不是强行改公共 DNS。
2.2 换源与安装通用依赖
CentOS7 原版 yum 源在我这边经常速度慢,稳妥做法是先把 Base 源和 EPEL 源换成国内镜像源。换源的命令比较常规,但有一个细节容易被忽略:CentOS7 已经 EOL,很多老镜像源的目录结构可能不完整,建议优先使用仍然在维护的镜像源,并立刻执行:
yum clean all yum makecache接下来安装基础工具和扩展包:
yum install -y vim wget git curl net-tools policycoreutils-python-utilspolicycoreutils-python一定要装,后面如果要给 SELinux 单独开 SNMP 端口、设置 httpd 对特定目录的权限时,需要用到semanage。即使后面选择关闭 SELinux,这个包也建议提前装好,省得排查时缺命令。
2.3 防火墙和 SELinux 的处理方式
LibreNMS 部署文档里通常会建议临时关闭防火墙和 SELinux,但生产服务器不能想关就关。我的习惯是:先放行必要端口,再保持 SELinux 开启测试,如果实在出现目录读写被拒,再针对性地调整策略。
放行防火墙端口:
firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --permanent --add-port=161/udp firewall-cmd --reloadSELinux 如果一定要关,就把/etc/selinux/config里的SELINUX=enforcing改成permissive,然后重启。很多人直接改成disabled也能跑,但系统升级或装安全软件时容易出现状态不一致的问题。我自己调试时用的permissive,既能看到报错,又不会死挡进程。
3. 数据库与 PHP:版本匹配决定了后面的顺畅程度
3.1 升级 MariaDB 而不是用默认版本
这是整套部署里我最大的一个教训。CentOS7 自带的 MariaDB 版本是 5.5,LibreNMS 新版本在安装向导阶段就会提示数据库版本太旧,后面创建用户、导入表结构时更是各种报错。正确做法是先把系统自带的 mariadb 相关包卸载干净,然后从 MariaDB 官方仓库装 10.5 或 10.6。
安装方式我建议直接配官方 yum 源,选择 10.5:
cat > /etc/yum.repos.d/mariadb.repo <<EOF [mariadb] name = MariaDB baseurl = https://mirrors.aliyun.com/mariadb/yum/10.5/centos7-amd64/ gpgkey = https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck = 1 EOF装好后启动数据库并做安全初始化:
systemctl enable --now mariadb mysql_secure_installationmysql_secure_installation会要求设置 root 密码、移除匿名用户、禁止 root 远程登录。这步不要跳过,LibreNMS 的 Web Installer 后面要填数据库账号,提前建好 root 密码免得来回折腾。
3.2 PHP 7.4 的安装与扩展
CentOS7 默认 yum 源里的 PHP 版本太低,我建议使用 REMI 仓库,启用 PHP 7.4 模块:
yum install -y epel-release yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install -y yum-utils yum-config-manager --enable remi-php74启用之后安装 PHP-FPM 和常用扩展:
yum install -y php php-cli php-fpm php-mysql php-gd php-snmp php-curl php-mbstring php-xml php-zip php-process php-memcached这些扩展缺一个都会导致安装向导在“检查依赖”步骤卡住。特别提一下php-snmp,LibreNMS 的 SNMP 轮询虽然主要靠系统 net-snmp 工具完成,但 PHP 侧的 snmp 扩展会影响部分设备探测脚本,没有它会出现奇怪的函数未定义报错。
3.3 php.ini 必须改的几个参数
PHP 安装完之后,/etc/php.ini里有几个参数必须手动调,否则安装或后续使用中会遇到问题:
date.timezone = Asia/Shanghai memory_limit = 512M max_execution_time = 300date.timezone不设置,LibreNMS 在生成图表和日志时间戳时会差若干小时,中文界面上时间显示也不对。memory_limit太低,Web 页面加载大流量图时会看到空白图,查日志才发现是 PHP 内存耗尽。max_execution_time是给一些耗时较长的数据导入操作预留空间。
改完后启动 php-fpm:
systemctl enable --now php-fpm如果用的是 REMI 的 php74,服务名可能是php-fpm也可能是php74-php-fpm,取决于安装方式。我安装时直接用php-fpm,大家先执行systemctl list-units | grep php确认一下。
4. 主程序安装:从 git 拉源码到 Nginx 接管网页
4.1 创建专用用户、拉取源码、调整权限
LibreNMS 官方建议用独立系统用户运行,不推荐直接用 root。我按官方推荐创建一个librenms用户:
useradd -m -r -s /bin/bash librenms然后把源码放到/opt/librenms:
git clone https://github.com/librenms/librenms.git /opt/librenms chown -R librenms:librenms /opt/librenms如果内网环境不能直接访问 GitHub,可以在能联网的机器上先 clone,再用压缩包传到服务器。注意压缩包解压后目录权限要重新设置,否则编译依赖和日志写入都会因为权限问题报错。
4.2 Composer 依赖与数据库初始化
LibreNMS 用 Composer 管理 PHP 依赖,不能跳过。我用官方自带的 wrapper 脚本安装,这样它会自动匹配当前版本所需的 Composer 版本:
su - librenms -c '/opt/librenms/scripts/composer_wrapper.php install --no-dev'这个过程会比较长,耐心等。完成后直接操作数据库,为 LibreNMS 建库建账号:
mysql -uroot -p CREATE DATABASE librenms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'librenms'@'localhost' IDENTIFIED BY '这里填一个高强度密码'; GRANT ALL PRIVILEGES ON librenms.* TO 'librenms'@'localhost'; FLUSH PRIVILEGES; EXIT;字符集必须指定utf8mb4,否则后续中文字符在界面上可能出现乱码。我就因为看过一些老教程用了utf8,结果设备备注里的 emoji 和特殊符号直接报错。
4.3 走 Web Installer 而不是手改配置
新版本 LibreNMS 提供了 Web Installer,我强烈建议走向导而不是手写 config.php。先复制一份默认配置:
cp /opt/librenms/config.php.default /opt/librenms/config.php chown -R librenms:librenms /opt/librenms/config.php chmod 755 /opt/librenms/config.php然后让 Nginx 生效前,可以直接访问http://服务器IP/install.php进入向导。向导会检查 PHP 扩展、数据库配置、目录权限等,逐项打勾之后才能进入下一步。如果哪里不满足,页面会明确告诉你是缺扩展还是目录不可写,按照提示处理即可。
数据库信息填第 4.2 节建好的名称、用户和密码,再设置管理员的账号密码,配置文件会自动生成。这里有个坑:如果在执行向导之前没有复制config.php.default,向导可能会提示无法写入配置文件,所以复制这一步千万别省。
4.4 Nginx 与 PHP-FPM 联动配置
CentOS7 上安装 Nginx:
yum install -y nginx然后在/etc/nginx/conf.d/librenms.conf里写一个站点配置:
server { listen 80; server_name monitor.example.com; root /opt/librenms/html; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }注意fastcgi_pass的 socket 路径必须和 php-fpm 配置里的监听路径一致。我之前一直用默认/var/run/php-fpm/php-fpm.sock,但实际启动的是www.sock,导致访问页面直接 502。可以用ss -lx | grep php看当前 php-fpm 到底监听了哪个 socket 文件。
改完配置后测试语法并重启:
nginx -t systemctl enable --now nginx如果 PHP-FPM 是以librenms用户运行,还要确认 FPM 的 pool 配置里user和group是否指向正确,否则页面对/opt/librenms/html下的文件没有读取权限,前端会加载不出样式。
5. 中文界面设置:不只是一行 locale
5.1 系统语言包与中文 locale
LibreNMS 的界面语言读取的是运行环境下可用的 locale,而不是简单丢一个“中文包”进去。所以先确认系统有没有中文 locale:
locale -a | grep zh_CN如果没有任何输出,需要安装语言包:
yum install -y langpacks-zh_CN我用上面的仓库安装时报错过 “No package langpacks-zh_CN available”,这是因为系统 yum 源没更新完整,执行完yum makecache再装一次一般就好了。装完后可以执行:
localedef -f UTF-8 -i zh_CN zh_CN.UTF-8同时建议把系统默认语言改成中文:
cp /etc/locale.conf /etc/locale.conf.bak echo "LANG=zh_CN.UTF-8" > /etc/locale.conf source /etc/locale.conf但这里要提醒:系统语言切换成中文只影响系统命令和区域设置,对 LibreNMS 本身并不产生决定性影响,真正让 Web 界面变中文的,是下一步的 PHP 和用户设置。
5.2 PHP 时区与 LibreNMS 用户级语言切换
确认/etc/php.ini中date.timezone = Asia/Shanghai,然后重启 php-fpm:
systemctl restart php-fpm接着登录 LibreNMS Web 后台。语言切换入口不在“系统设置”里,而是在右上角用户头像菜单里的 Settings 下。进入User Settings / 用户设置后,找到语言选项,选择简体中文,保存后页面就会切换成中文界面。
如果你的 LibreNMS 版本较老,可能界面上没有语言选择项,那需要检查config.php中是否启用了多语言支持。有些版本需要手动加入:
$config['app']['locale'] = 'zh_CN';再加这一行时要注意不要破坏 config.php 末尾的 PHP 结束标签,很多生产事故都是尾标签后面多了一个空格导致会话头输出错误。
5.3 中文化之后可以顺带做的体验优化
中文界面切换完成后,我发现部分菜单仍然显示英文,这属于正常的,因为 LibreNMS 的翻译文件并没有覆盖全部模块。想要提高中文覆盖比例,可以去官方翻译平台提交词条,或者直接在安装目录下把对应语言的 JSON 文件补齐。但我的建议是,不必为此花太多时间,基础菜单和设备详情已经中文化了,剩下的英文术语反而有助于后续搜日志时对上号。
还可以在 User Settings 里把日期格式、默认页面、刷新时间一并调整。我一般把默认仪表盘每隔 5 分钟自动刷新,网络状况一栏扫过去很直观。
6. 接入设备与日常排障:上线后真正花时间的部分
6.1 添加第一台设备前的 SNMP 自检
很多人在 GUI 里添加设备失败,问题不在 LibreNMS,而是 SNMP 本来就不同。添加设备前,先在服务器上手动测试目标设备:
snmpwalk -v2c -c public -On 192.168.10.1 system能正常输出 OID 列表,说明 SNMP 通。如果命令卡住或 timeout,按下面顺序排查:
- 目标设备是否开启了 SNMP,并配置了正确的 community。
- 防火墙是否放行了 UDP 161。
- 是否有 ACL 把监控服务器的 IP 拦掉了。
- 设备 SNMP 版本是 v2c 还是 v3,如果只开 v3,那 GUI 添加时要切换协议。
我踩过最隐蔽的一个坑:设备开的是 SNMP v2c,但 community 里带着特殊字符#,命令里没加引号,一直报错。所以在 shell 里测试时,带特殊字符的 community 必须加单引号:
snmpwalk -v2c -c 'my#community' 192.168.10.1 system6.2 定时任务与轮询日志
LibreNMS 的轮询、发现、告警检查都依赖 cron。官方推荐的配置是使用librenms用户的 crontab,或者直接写一个/etc/cron.d/librenms文件。我用的是 crontab 方式:
su - librenms crontab -e写入如下任务:
*/5 * * * * /opt/librenms/librenms-nms.php poller > /dev/null 2>&1 */5 * * * * /opt/librenms/librenms-nms.php discovery > /dev/null 2>&1 */5 * * * * /opt/librenms/librenms-nms.php check-services > /dev/null 2>&1如果在 GUI 中看到设备状态一直是灰色或长时间不更新,先检查 cron 有没有执行。最直接的方式是手动跑一次:
su - librenms -c '/opt/librenms/librenms-nms.php poller -h all'看输出里有没有ERROR或WARNING。日志文件在/opt/librenms/logs/librenms.log,排查问题第一件事就是tail -f这个文件。
6.3 高频报错整理:从 RRD 权限到 memcached
部署完成、设备也接入后,我整理过几个高频问题,基本是部署时埋下的隐患:
| 报错现象 | 根因 | 解决办法 |
|---|---|---|
| 页面能打开,图表全是空白图 | RRD 目录不可写,或 php-fpm 用户没权限 | chown -R librenms:librenms /opt/librenms/rrd |
| 添加设备后永远 pending | poller 没执行,或 cron 没生效 | 手动跑 poller,检查 cron 文件权限 |
| 登录后很快掉线 | memcached 未启动,或 php-memcached 扩展缺失 | systemctl enable --now memcached |
| SNMP timeout | UDP 161 被防火墙挡 | firewall-cmd --add-port=161/udp |
| 数据库连接失败 | config.php 中 DB 信息错误,或 MariaDB 没开 | 核对 config.php 中db_user、db_pass、db_name |
| poller 运行很慢,每次超过5分钟 | 设备数量大且 PHP 内存不足 | 调大memory_limit,考虑分布式轮询 |
RRD 权限问题是新手最容易遇到的一类。LibreNMS 默认把流量数据写入/opt/librenms/rrd,每次 poller 运行时要创建和更新文件,如果这个目录不是librenms用户所有,就会出现部分设备有图、部分没图。建议安装完成后执行一次统一的权限修复:
chown -R librenms:librenms /opt/librenms find /opt/librenms -type d -exec chmod 775 {} \;最后再提一个常在群里看到的问题:为什么设备识别出来了,但部分端口流量取值明显不对。这个问题多半是设备开启了多个 SNMP community 或者网管接口太多,LibreNMS 默认会把所有可用接口都采集进来。你需要在设备详情页的 Settings 里把不需要监控的端口状态改为ignore,减少无效轮询,也能让流量图更清爽。
我在实际运维中最深的体会是,LibreNMS 部署本身不复杂,真正花时间的永远是环境基础——PHP 版本、数据库版本、权限、SNMP 连通性。把这些前置条件按顺序理干净,中文界面设置反而是整个流程里最轻松的一步。如果你接下来准备在 CentOS7 上搭这套系统,建议照着第 2 章到第 4 章的顺序走,基本可以一次通过。