ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CentOS 7上部署LibreNMS:开源网络监控平台完整搭建指南

CentOS 7上部署LibreNMS:开源网络监控平台完整搭建指南 在运维圈里网络设备一多监控就成了刚需。以前我为了盯住几十台交换机和服务器试了不少工具要么部署太折腾要么发现不了设备要么图表丑得没法看。后来换到LibreNMS算是彻底稳住了自动发现设备、开箱即用的流量和CPU内存图表、告警通知、还能直接出拓扑视图而且是纯开源、免费的。这篇东西就是我在CentOS 7上从零部署LibreNMS的完整过程包括数据库版本坑、PHP版本坑、SNMP配置还有很多人问的中文界面到底怎么弄出来的。不管你是刚入门的运维新手还是想把现有监控换成LibreNMS的老手按这个流程走一遍基本能在半天内把一套能用的监控平台跑起来。1. LibreNMS是谁为什么我盯上它1.1 项目定位与核心功能LibreNMS是一个基于PHP MySQL/MariaDB RRDtool的开源网络监控系统它的前身可以追溯到Observium社区版但是LibreNMS在它之上做了大量重构并且迭代非常活跃社区几乎每天都有代码合并。它的核心思路很简单以SNMP为采集协议通过自动发现机制把设备“拉”进系统然后周期性地采集CPU、内存、端口流量、丢包率、传感器温度等指标用RRDtool绘制长期趋势图在异常时触发告警。我最早用它的原因很朴素公司有二三十台网络设备和十来台Linux服务器Zabbix也可以干这活但每台设备都要手工加模板加监控项华为、H3C、思科这些设备还时不时不认模板。LibreNMS的自动发现解决问题的方式很直接给一台设备配上正确的SNMP读权限系统能自动扫描ARP表、CDP/LLDP邻居、OSPF/BGP路由信息把整个网络拓扑里的设备一串串拉出来。这种体验一旦习惯了真的回不去手工加监控的老路。1.2 和Zabbix、Cacti这些老牌方案怎么选Zabbix强在自定义监控项和告警策略非常灵活适合把服务器业务指标也深度纳管的场景。但网络设备的开箱即用程度不如LibreNMS思科、华为、H3C这类厂商的设备在LibreNMS里有专门的支持型号识别、传感器和端口状态解析基本不用写模板。Cacti则是老牌的RRD图形化方案上手简单但设备发现、自动添加这些能力基本等于零模板要手工做更新频率也不如LibreNMS。对比维度LibreNMSZabbixCacti自动发现网络设备很强一般弱网络设备型号覆盖500平台依赖模板依赖模板配置成本免AgentSNMP即可需装Agent可选需手动建模板图形展示内置且丰富需自定义核心能力告警规则内置且灵活很强较弱社区活跃度高高较低如果你是“监控网络设备 基础服务器指标”为主要目标LibreNMS是能最快见效的方案如果是要深挖应用层指标Zabbix可能更合适。这里不是引战只是给一个选型参考。我目前的生产环境是LibreNMS管网络设备Zabbix管应用层两者各司其职互补得很好。2. 部署前躲不开的版本选择题2.1 CentOS 7的现状与yum源开始前先把环境说清楚我这边用的是CentOS 7.9 x86_64最小化安装内存4G磁盘100G这台机器同时装数据库和LibreNMS本体。CentOS 7主流更新早就停了所以新装系统时不要指望默认的mirrorlist还能正常拉包。我的做法是先把/etc/yum.repos.d/CentOS-Base.repo里的baseurl指向可用的本地镜像或vault.centos.org归档源先确认yum repolist有数据输出再继续。很多从CentOS 7时代走过来的老运维会直接yum install -y epel-release然后开干实际上在EOL状态下这一步经常直接卡死。我的建议是要么在规划新环境时直接换成Rocky Linux或AlmaLinux要么就把CentOS 7当成一个版本固定的专用监控服务器来对待装完就不再随便动系统包只作为LibreNMS的运行基底。这不算最优解但在现有存量环境里这是最稳妥的一条路。2.2 PHP用Remi源升到8.2LibreNMS官方要求PHP 8.1以上CentOS 7默认自带的PHP还是5.4不升级装不上而且大概率跑起来后各种弃用警告刷屏。这里有一个非常成熟的方案通过Remi仓库给CentOS 7提供高版本PHP。具体做法是安装remi-release-7的rpm包然后启用remi-php82这样yum里的php就指向PHP 8.2。yum install -y epel-release rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install -y yum-utils yum-config-manager --enable remi-php82 yum install -y php php-cli php-fpm php-common注意启用remi-php82后系统中的其他php相关包也必须统一走这个仓库否则容易出现PHP主程序是8.2但扩展还停在5.4、装一半报依赖冲突的问题。首次装完用php -v验证一下版本号在8.1以上再继续这一步不能跳过。2.3 数据库原装MariaDB 5.5根本不够用LibreNMS要求MySQL 5.7以上或MariaDB 10.2以上CentOS 7默认源里给的还是MariaDB 5.5这个版本连utf8mb4的支持都不完整直接拿它建库后面放入中文设备名或中文描述会出现字符截断或者乱码。我踩过一次很深的坑所以这一版直接说结论别怕麻烦装数据库前先确认版本。推荐的方式是用MariaDB官方仓库装10.5cat /etc/yum.repos.d/MariaDB.repo EOF [mariadb] name MariaDB baseurl https://mirror.mariadb.org/yum/10.5/centos7-amd64/ gpgkey https://mirror.mariadb.org/yum/RPM-GPG-KEY-MariaDB gpgcheck 1 EOF如果系统里已经装了默认的mariadb包需要先移除冲突的默认库文件再装新版。具体顺序是备份现有数据、卸载mariadb-libs、安装新repo、然后安装MariaDB-server。卸载时可以加--noautoremove避免连带卸载掉依赖它的组件如果有依赖报错说明这台机器上已经有软件依赖旧库了这种情况我更建议单独搞一台数据库服务器远程连接过来而不是硬挤在同一台机器上。2.4 硬件与安全策略再聊资源占用。LibreNMS本体对CPU要求不高真正吃资源的是poller进程和rrd文件的IO。网络设备少的话2核4G的机器足够支撑几十台设备设备上千台时就要考虑分布式轮询了。磁盘方面RRD文件数量多且小文件密集SSD对比机械盘的优势非常大建议至少给/opt/librenms/rrd单独留一块空间。SELinux如果你不打算细调我建议在测试环境直接设为permissive生产环境也要先评估再决定。很多入门用户被卡的“页面能打开但图片不显示”“无法写入rrd目录”问题追根溯源都是SELinux在拦。后面我会给出基本的SELinux配置但如果你不想在这上面花时间测试阶段直接setenforce 0并修改/etc/selinux/config里的模式为permissive是最省心的。3. 从一台空机器到LibreNMS启动成功3.1 依赖安装命令一条条敲先把系统更新到干净状态然后装基础仓库和工具。这里我建议分两批装第一批是仓库和编译类基础包第二批是LibreNMS运行时依赖。yum update -y yum install -y epel-release rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install -y yum-utils yum-config-manager --enable remi-php82然后装运行依赖。这里一次性把PHP扩展、Web服务、SNMP工具和Python3都带上yum install -y git nginx yum install -y php php-cli php-fpm php-common php-curl php-gd php-json \ php-mbstring php-process php-snmp php-xml php-zip php-mysqlnd \ php-intl php-pcntl php-posix php-sqlite3 php-gmp php-bcmath \ php-ldap php-opcache yum install -y rrdtool net-snmp net-snmp-utils python3 python3-pip python3-devel这些包缺一不可缺了后面跑validate.php都会给你列出来。尤其提醒下php-process它提供posix和pcntl扩展LibreNMS并发轮询要用到php-ldap则是为了接LDAP认证用不到可以先装装错也不影响。装完记得确认版本php -v看到PHP 8.2的字样就没问题了。3.2 数据库替换与初始化按前面的MariaDB仓库配置好之后先卸载默认的旧库文件再装新版yum remove -y mariadb-libs yum install -y MariaDB-server MariaDB-client systemctl enable --now mariadb新装完建议跑一下初始化安全脚本删除默认匿名用户和测试库mysql_secure_installation然后创建LibreNMS使用的数据库和账号。库名随意我习惯叫librenms字符集一定要用utf8mb4否则中文界面和设备中文描述会有后患mysql -u root -pCREATE DATABASE librenms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER librenmslocalhost IDENTIFIED BY 这里改成你自己的密码; GRANT ALL PRIVILEGES ON librenms.* TO librenmslocalhost; FLUSH PRIVILEGES; EXIT;这里有个容易被忽略的点如果你打算让LibreNMS连接远程数据库librenms用户的host部分不要写localhost而要改成%或指定IP。我为了省事一开始全用localhost后面迁库时又单独建了一次用户属于不必要的重复劳动。3.3 拉取代码、设置权限、配置PHP-FPM代码目录我放在/opt/librenms这也是官方默认路径。用git拉取官方仓库然后创建专用运行用户git clone https://github.com/librenms/librenms.git /opt/librenms useradd librenms -d /opt/librenms -M -r -s /usr/sbin/nologin chown -R librenms:librenms /opt/librenms chmod 775 /opt/librenms注意-M -r -s /usr/sbin/nologin表示不建家目录、创建成系统用户、且禁止交互登录这是给服务进程专用的标准做法。很多教程里把用户建成了普通登录用户虽然也能跑但安全上并不推荐。PHP-FPM的配置在/etc/php-fpm.d/www.conf。因为前端我用Nginx需要把PHP-FPM的进程用户改成Nginx用户并把监听方式改成Unix socket方便Nginx直接转发user nginx group nginx listen /run/php-fpm/php-fpm.sock listen.owner nginx listen.group nginx listen.mode 0660改完后启动PHP-FPM并设为开机自启systemctl enable --now php-fpm然后调整/etc/php.ini里的几个关键参数。默认的memory_limit对LibreNMS来说太小至少给到1024M时区也要设置否则告警时间对不上date.timezone Asia/Shanghai memory_limit 1024M3.4 Nginx站点配置LibreNMS自带一份Nginx配置参考但一般还得根据实际域名改一下。这里给出我目前生产环境里能直接用的配置主要就是定义站点根目录、PHP解析和禁止访问隐藏文件server { listen 80; server_name librenms.example.com; root /opt/librenms/html; index index.php; charset utf-8; gzip on; gzip_types text/css application/javascript text/javascript image/svgxml text/plain application/xml; gzip_disable MSIE [1-6]\.; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php { include fastcgi.conf; fastcgi_split_path_info ^(.\.php)(/.)$; fastcgi_pass unix:/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ /\.ht { deny all; } }把配置放到/etc/nginx/conf.d/librenms.conf后先测试语法再启动nginx -t systemctl enable --now nginx如果装了SELinux且不想关掉需要允许HTTP服务访问相关目录。LibreNMS的rrd、log目录都要写入权限可以用下面两条命令打标签chcon -R -t httpd_sys_rw_content_t /opt/librenms/rrd chcon -R -t httpd_sys_rw_content_t /opt/librenms/storage这样比直接关SELinux更安全也避免很多后续莫名奇妙的问题。3.5 初始化数据库与管理员账号进入/opt/librenms目录复制默认配置文件并编辑数据库连接和站点地址cd /opt/librenms cp config.php.default config.php vim config.php编辑的关键项大约在文件开头不远的位置$config[db_host] localhost; $config[db_port] 3306; $config[db_user] librenms; $config[db_pass] 你刚才设置的密码; $config[db_name] librenms; $config[base_url] /;新版本LibreNMS已经逐渐把base_url相关的配置移动到webui配置组里具体以你当前版本文件里的注释为准。这一行影响网页上的资源路径填错会导致样式和图片全部加载不出来但页面HTML能打开排查时会很迷惑。接着用artisan命令初始化数据表并创建管理员账号。新版本已经逐步淘汰Web安装向导所以直接用命令行更稳妥cd /opt/librenms php artisan migrate --force php artisan user:add admin admin adminexample.com 你的管理员密码 --roleadmin第一次执行migrate会把大量数据表建好耗时稍长属正常现象。建表完成后访问你配置的域名应该能看到登录页。如果还没有先跑一下内置的验证脚本看看缺失项sudo -u librenms /opt/librenms/validate.php这个脚本会列出PHP扩展缺失、目录权限、数据库版本等问题基本照着改就能过。3.6 定时任务与轮询调度LibreNMS的发现和轮询依赖cron定时触发否则设备加进去永远是“待处理”状态。在/etc/cron.d/下新建一个librenms文件cat /etc/cron.d/librenms EOF */5 * * * * librenms /opt/librenms/cronic /opt/librenms/discovery-wrapper.py */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 */5 * * * * librenms /opt/librenms/cronic /opt/librenms/services-wrapper.py * * * * * librenms /opt/librenms/cronic /opt/librenms/alerts.py 27 07 * * * librenms /opt/librenms/daily.sh EOFcron命令里的librenms是指定以哪个系统用户身份执行这个字段很多人会漏。我最初图省事把整条命令挂到了root用户的crontab里结果poller产生的rrd文件全是root所有Web端没有写权限图形全部空白搞了很久才定位到权限问题。poller-wrapper.py后面的16表示同时启动16个轮询进程这个数字要按设备数调节。设备少于100台时8到16之间都行设备多了再往上加同时要关注CPU负载。4. 接入第一台网络设备4.1 添加设备前先确认SNMP能通LibreNMS非常依赖SNMP设备侧不先配好加进LibreNMS也只是个空壳。无论Linux服务器还是交换机路由器第一步一定是先确认你能从LibreNMS这台机器上用snmpwalk拿到数据。以一台Linux服务器为例先装SNMP服务端yum install -y net-snmp net-snmp-utils编辑/etc/snmp/snmpd.conf核心是配置rocommunity和网段限制。我测试环境直接简单点rocommunity public 0.0.0.0/0这行意思是允许任意IP用public这个community只读访问。生产环境一定要把网段改小千万别用全0网段长时间裸奔。改完启动服务并放行防火墙systemctl enable --now snmpd firewall-cmd --permanent --add-port161/udp firewall-cmd --reload然后在LibreNMS服务器上测试snmpwalk -v2c -c public 192.168.1.100 system能刷出sysDescr等一串数据就说明SNMP链路通了。如果超时优先检查两个地方目标机防火墙是否放行UDP 161、snmpd.conf里是否绑定了非默认的agentAddress。设备侧解决之后LibreNMS这边基本不需要再额外排查。4.2 Web和CLI两种添加方式都用一遍LibreNMS添加设备有Web界面和命令行两种方式。Web端在左侧菜单“设备”里点“添加设备”填上IP、SNMP版本和community字符串勾上“启用自动发现模式”就能完成添加。这种方式最直观适合少批量添加。命令行方式更适合批量脚本或者SSH进入服务器操作cd /opt/librenms php addhost.php public v2c 192.168.1.100这条命令的含义是用public作为社区字符串通过SNMP v2c协议添加192.168.1.100这台设备。后面还可以加设备组名比如php addhost.php public v2c 192.168.1.100 office-switch添加之后正常情况下5分钟内cron会触发第一轮discovery和poll把设备信息、接口列表、传感器数据全部采集出来。如果等了很久页面状态还是灰色就检查一下/opt/librenms/logs/librenms.log和cron任务有没有在执行。4.3 自动发现与轮询是怎么配合的LibreNMS的魅力在于自动发现。当你给一台设备开启自动发现后它不光采集这台设备本身还会通过LLDP/CDP邻居信息自动找到直接相连的其他设备再递归发现下去。这在有几十台交换机的网络里非常高效我最初加了一台核心交换机半小时后自动发现了二十多台接入层设备。自动发现和轮询是两条独立的流水线。discovery负责识别设备类型、接口变更、服务状态变化等低频但重要的工作poller负责周期性地采集CPU、内存、端口流量等高频数据。两者都由cron驱动一个跑完写库一个跑完更新图形。如果你改了设备配置或者换了模块触发一次discovery就能快速反映到系统里不必等那5分钟窗口。如果后面设备数量上了规模LibreNMS也支持分布式部署主节点跑Web和数据库额外节点跑poller和discovery把采集压力从主节点拆出去。这个扩展模式在官方文档里有很详细的说明等到你发现自己单机跑不过来时再研究它也不迟。5. 中文界面设置和乱码处理5.1 三种切到中文界面的路径LibreNMS的本地化做得还算不错但默认语言跟随浏览器所以很多人装完打开还是英文界面。想切成中文我试过最有效的方式有下面三种按优先级排第一把浏览器首选语言改成中文。以Chrome为例进入设置里的“语言”把中文简体移到最顶部刷新LibreNMS页面整个界面就会切成中文。这是LibreNMS读取浏览器Accept-Language头的正常逻辑属于最干净的办法。如果你用Edge同样在浏览器设置里调整语言优先级。第二登录LibreNMS后点右上角用户头像进“个人偏好”或“Preferences”里面有一个Language选项直接选简体中文保存这个设置会覆盖浏览器默认语言对当前用户全局生效。我实际测试下来效果最稳定因为浏览器环境经常在多语言之间切换个人偏好设置能锁住界面语言。第三在/opt/librenms/config.php里强制默认语言加上下面这行$config[webui][default_lang] zh-CN;这个方案的优点是能让所有未单独设置偏好的用户都默认看到中文界面适合公司内部多用户共用一套LibreNMS的场景。注意改完config.php后要清一下缓存在/opt/librenms目录下执行php artisan config:clear不然有时候配置不会立刻生效。5.2 图表里的中文方块字怎么修界面文字切成中文后还有一类问题经常出现页面上的中文正常但图形里偶尔带有中文注释或者设备名时图表里渲染出来的字全是方块。这个问题的根源在于RRDtool绘图时使用的默认字体缺失中文字形解决办法是给RRDtool安装一款中文字体。CentOS 7上用wqy-microhei比较省事yum install -y wqy-microhei-fonts安装完字体文件一般在/usr/share/fonts/wqy-microhei/wqy-microhei.ttc。然后在LibreNMS的config.php里指定这个字体路径$config[rrdgraph][font] /usr/share/fonts/wqy-microhei/wqy-microhei.ttc;设置后需要等新一轮poller生成图表才能看到效果已经生成的旧图不会自动重绘。如果这个配置项在你当前的版本里没生效可以搜一下config.php里的rrdgraph相关注释新版某些分支把字体配置拆成了数组按注释格式改成对应结构就行。5.3 中文字符集与设备命名建议部署时数据库用了utf8mb4设备名和描述里就能正常存中文。但要注意LibreNMS的自动发现从SNMP驱动返回的字符串很多是厂商原生编码不一定都规范。如果设备名从MIB里抓出来是GBK编码在页面上显示可能乱码。这种情况推荐的做法是在Web端“编辑设备”里手动覆盖一个标准的显示名称字符集就以页面保存的内容为准。我个人习惯是设备命名统一用“机房-楼层-设备类型-编号”这种格式比如“东区机房-3F-CoreSW-01”中文、英文加数字混排都没有问题。但hostname和sysName仍建议保留英文因为部分告警脚本、遥传脚本和API内部逻辑对非ASCII字符还是可能存在兼容性问题等哪天编码出问题再回来看这段话你会感谢我的。6. 常见问题与排查实战6.1 问题排查速查表把我在部署和日常使用中遇到频率最高的问题整理成一张速查表方便你直接对照现象原因解决办法页面502 Bad Gatewayphp-fpm未启动或socket路径不一致检查php-fpm状态确认www.conf里的socket路径与nginx配置一致validate.php报PHP版本过低系统默认PHP 5.4未启用Remi高版本仓库确认remi-php82已启用重装php相关包页面能打开但图片空白RRD目录权限或SELinux拦截检查/opt/librenms/rrd归属运行chcon命令打SELinux标签添加设备后一直不更新cron任务没配置或用户字段错误确认/etc/cron.d/librenms存在且执行用户为librenms设备SNMP超时防火墙UDP 161未放行或community不对用snmpwalk从本机测通后再添加中文界面切换无效浏览器缓存或语言优先级不对清缓存设置浏览器语言为中文优先或在用户偏好里固定语言图表中文方块缺少中文字体安装wqy-microhei-fonts并在config.php指定字体路径改了config.php不生效应用配置缓存执行php artisan config:clear这张表覆盖了我遇到过的大部分日常问题。如果你碰到表里没有的现象第一反应应该是打开/opt/librenms/logs/librenms.log看日志很多问题日志里已经写得很直白了。6.2 我踩过的几个坑和总结第一个坑是关于cron用户权限。我一开始图省事把poller和discovery的cron任务都挂在root用户下结果跑出来的rrd文件全部属于rootWeb进程根本没有写权限页面上的图形全部空白。最后排查了快两个小时才发现权限归属问题把所有rrd目录改成librenms:librenms归属并重新触发poller才恢复。所以这里再强调一次cron里指定用户字段是librenms不要用root也不要用nginx用户否则迟早会出现权限错位。第二个坑是数据库版本。我在一台CentOS 7的默认源上直接装了MariaDB 5.5建库时还没用utf8mb4。前一个月一切正常直到我加入带中文描述的设备后数据库报出字符集相关错误部分表里的数据出现乱码截断。最后只能重建库、重新发现设备前期的历史数据全部损失。如果你的环境已经跑在旧版数据库上建议尽早规划迁移别等问题爆了再动手。第三个坑和SELinux有关。我在生产环境第一次装LibreNMS时关了SELinux才把图像和告警跑通后来有一次安全检查把SELinux重新设回enforcing结果图像马上打不开日志里全是权限denied。所以如果你希望保留SELinux记得提前把httpd_sys_rw_content_t的上下文标记打好别像我一样事后补救。最后再分享一个经验LibreNMS的validate.php是个好东西每次升级完或者配置出现异常我都会先跑一遍它官方的检查项覆盖了大多数常见问题。部署完不要急着加设备先跑一次验证把列出来的提醒清理干净再接入生产环境能省下后续大量排查时间。这套流程我重复过很多次按这个顺序走下来CentOS 7上的LibreNMS基本都能稳定跑很久。
返回列表