1. 为什么我选LibreNMS而不是别的监控系统
先说结论:如果你手头管着十几台到几百台Linux服务器、交换机、路由器,想找一个开源、免费、不需要商业授权、又能自动发现设备的监控平台,LibreNMS是目前综合成本最低的选择之一。我在生产环境里从Zabbix迁移到LibreNMS用了大约一个周末,之后维护成本几乎为零,这个题我算是踩过完整一遍坑的,所以这次直接把Ubuntu 24.04下的完整安装和配置过程写清楚。
LibreNMS是一个基于PHP + MySQL + SNMP的网络监控系统,GPL开原,社区活跃度很高。它最吸引我的点有三个:第一,自动发现——只要给它一个网段或者一批设备IP,它就会自己通过SNMP协议去探测设备类型、接口、CPU、内存、磁盘,然后把图表画出来;第二,报警规则灵活——可以基于任意采集到的指标写告警规则,支持邮件、Slack、Telegram、Webhook等各种渠道;第三,有一个非常实用的Web UI,不管你是想快速看全网的流量趋势,还是想看某台设备最近一周的CPU负载,基本点两下就能出来。
相比之下,Zabbix的功能当然也很强,但配置门槛明显偏高,尤其是模板、触发器、宏变量这些概念,新手很容易迷失。Prometheus + Grafana的组合我也试过,适合Kubernetes和云原生场景,但如果你要监控的是传统网络设备、物理服务器,SNMP设备,LibreNMS的开箱即用程度是最好的。所以这套方案比较适合:想给公司机房搭一套内部监控、个人实验室多台设备做统一管理、从零开始想学网络监控的运维新手,或者被商业监控软件授权费烦透了的小团队。
整个安装过程我会基于Ubuntu 24.04 LTS,从依赖环境准备、PHP与Composer部署、MySQL数据库初始化、LibreNMS源码部署、Web安装向导、SNMP配置、设备添加与自动发现、以及最后的性能调优和安全加固,一步步带下来。所有命令都在我的虚拟机里重新跑过一遍,确认没有问题。如果你的系统是Ubuntu 22.04或20.04,大部分步骤同样适用,只是部分软件包版本号会有差异。
2. 安装前的环境准备与依赖规划
在真正动手之前,需要先想清楚一件事:LibreNMS要求的环境和Ubuntu默认环境之间有一些偏差。比如Ubuntu 24.04默认的PHP版本是8.3,MySQL默认是8.0,这都没问题,但LibreNMS官方对PHP的内存限制、扩展模块、时区设置都有硬性要求。如果这些细节不提前处理好,安装向导会在中间卡住,到时候再回头看错误日志,反而不如一开始就按标准来。
2.1 系统基础更新与必要软件包
我在几台不同的Ubuntu 24.04虚拟机和物理机上测试过,第一步永远是先更新系统。千万别跳过这步,否则可能会遇到源索引缓存导致的依赖冲突,花在排错上的时间比更新系统还长。
sudo apt update sudo apt upgrade -y升级完成后,重启一次系统,确保内核和基础库都是最新状态。这是我个人的习惯,特别是从Ubuntu 22.04跨版本升级来的机器,不重启的话,后面安装一些内核相关模块时容易出现诡异问题。
接下来安装基础工具,包括Git、curl、wget、unzip等。LibreNMS官方安装文档里其实没有强制要求这么早安装Git,但后面升级LibreNMS、切换版本分支时会用到,所以提前装好比较省事。
sudo apt install -y git curl wget unzip software-properties-common apt-transport-https ca-certificates gnupg lsb-release这些软件包都是后续步骤的隐性依赖,比如software-properties-common用来管理PPA源,apt-transport-https用于从HTTPS源拉取软件包,lsb-release用来识别当前发行版版本。Ubuntu 24.04 LTS可能是未来几年里很多服务器会长期使用的版本,提前把这些工具备齐,后面会顺手很多。
2.2 时间同步与系统时区设置
监控系统对时间极其敏感。SNMP采集到的数据、报警触发时间、图表的时间戳,全部依赖系统时钟。我见过一台时间跑偏的监控服务器,所有设备流量曲线都是错位的,排查了很久才意识到服务器时钟差了十几分钟。所以必须安装并启动NTP服务:
sudo apt install -y systemd-timesyncd sudo timedatectl set-ntp true sudo timedatectl set-timezone Asia/Shanghai systemctl status systemd-timesyncd如果你的环境不允许使用外部NTP服务器,可以修改/etc/systemd/timesyncd.conf里的NTP地址,指向内网时间服务器。Ubuntu 24.04默认使用systemd-timesyncd,比传统的NTP更适合轻量场景。这里我直接把时区设置为Asia/Shanghai,如果你的服务器在其他时区,按实际情况改。
2.3 PHP、MySQL、Nginx等核心组件选型
LibreNMS官方推荐LNMP架构,即Linux + Nginx + MySQL + PHP-FPM。我特别说明一下为什么不用Apache:Nginx对PHP-FPM的支持非常干净,内存占用低,并发处理能力强,而且配置起来比Apache的.htaccess机制更直观。LibreNMS官方文档目前也是以Nginx作为第一推荐。
PHP方面,Ubuntu 24.04软件源自带PHP 8.3,这正好满足LibreNMS对PHP 8.1以上的要求。我们需要安装的PHP扩展有以下这些:
sudo apt install -y php8.3-fpm php8.3-cli php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-mysql php8.3-json php8.3-intl php8.3-ldap php8.3-snmp php8.3-bcmath php8.3-gmp这里有几个扩展我要单独解释一下:
- php8.3-snmp是LibreNMS采集网络设备数据的关键,没有它,SNMP相关功能全部失效。
- php8.3-ldap用于对接企业LDAP/AD认证,如果你的团队用域账号管理,这个扩展很有用。
- php8.3-bcmath和php8.3-gmp是数学运算扩展,LibreNMS在计算某些网络指标时依赖它们。
- php8.3-intl用于国际化,虽然我们主要用中文界面,但没装这个扩展,PHP的某些函数会直接报错。
MySQL这边,Ubuntu 24.04软件源默认是MySQL 8.0,直接安装:
sudo apt install -y mysql-server有些人可能会问,MariaDB行不行?我建议在生产环境老老实实用MySQL。LibreNMS官方文档里同时支持MySQL和MariaDB,但MySQL 8.0在SQL模式、字符集排序规则上和LibreNMS配合更成熟。MariaDB我也试过,主要是在后续升级LibreNMS版本时偶发字符集兼容问题,排查起来比较麻烦。如果你已经在用MariaDB,这也不是不能用,但新部署的话,MySQL更省心。
Nginx直接通过软件源安装:
sudo apt install -y nginx至此,我们完成了LNMP基础组件的安装。为了确保PHP-FPM正确加载了所有扩展,可以执行:
php -v php -m | grep -E 'snmp|mysql|gd|curl|mbstring|xml|zip|intl|ldap|bcmath|gmp'输出结果里应该能看到所有被grep的扩展名。如果少了哪个,重装对应的php8.3-xxx包即可。这一步很关键,不要跳过,否则后面Web安装向导会直接显示“缺失扩展”错误。
3. 数据库初始化:LibreNMS用户、权限与配置
数据库是LibreNMS存放所有配置、设备列表、采集数据、报警记录的核心。数据库配置得当与否,直接影响性能和后续升级。我见过有人在安装向导里顺手填了一个root账号,后续所有请求都用root连接数据库,这种做法隐患很大。正确做法是创建一个专用数据库用户,只授权LibreNMS自己的库,并且密码使用足够复杂的字符串。
3.1 启动MySQL并设置安全配置
Ubuntu 24.04安装MySQL后,默认会有一个Debian维护账号(debian-sys-maint),root本机登录默认使用auth_socket认证,也就是说在终端直接sudo mysql就能进入。我们先启动服务,然后初始化安全配置:
sudo systemctl enable --now mysql sudo mysql_secure_installationmysql_secure_installation会引导你完成匿名用户删除、root远程登录禁止、test数据库删除等操作。对于root账号,建议设置一个强密码,虽然我们日常不会用root来连LibreNMS数据库,但留着空密码的root始终是不安全的。
3.2 创建专用数据库、用户并授权
进入MySQL命令行:
sudo mysql -u root -p在MySQL提示符下执行:
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和utf8mb4_unicode_ci。千万不要用默认的latin1,否则设备名称里一旦出现中文或者特殊符号,存储和查询都会出问题。
- 用户只允许localhost连接,不要给远程访问权限。如果监控服务器和数据库分离部署,你需要单独设置bind-address和远程授权,但那是另一套架构了,默认单机部署时,localhost足够安全。
- 密码尽量用随机生成的字符串,比如openssl rand -base64 24的结果,别用什么admin123。
创建完数据库后,建议测试一下用户能否正常连接:
mysql -u librenms -p -h localhost librenms输入密码后能进入librenms库,就说明账号没问题。这一步虽然简单,但能提前发现MySQL认证插件不兼容的问题。MySQL 8.0默认使用caching_sha2_password认证,而PHP 8.3的mysqlnd驱动和它配合得很正常,所以如果你用的是Ubuntu自带的PHP包,一般不会碰到问题。如果你从旧系统迁移,PHP版本较旧,可能会遇到认证失败,到时候需要改成mysql_native_password。在Ubuntu 24.04上我们不用操心这个。
3.3 调整MySQL性能参数
LibreNMS的数据库会持续写入监控数据,所以MySQL的innodb_buffer_pool_size建议调大一点。虽然LibreNMS也能运行在默认配置上,但采集设备和告警规则多起来之后,慢查询会拖累页面加载速度。编辑MySQL配置文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf在[mysqld]段追加:
innodb_buffer_pool_size = 256M innodb_log_file_size = 64M max_connections = 300这组参数适合2核4G内存的入门级服务器。如果你的物理机内存更大,比如16G,可以把innodb_buffer_pool_size设为2G。注意不要让这个值超过物理内存的70%,否则MySQL会和PHP-FPM抢内存,反而导致系统卡顿。修改后重启MySQL:
sudo systemctl restart mysql我之所以强调这几项,是因为LibreNMS的实时图表和RRD聚合数据其实对数据库的读压力不大,真正压力大的是历史数据查询。innodb_buffer_pool_size越大,历史查询命中缓存的比例越高,页面响应越快。这是调整前后能明显感知到的区别。
4. 下载LibreNMS源码与Composer依赖安装
LibreNMS的部署方式和很多PHP项目不同,它不是一个简单的tar包解压就能跑的,它依赖Composer来管理PHP第三方库,所以我们要先保证Composer环境正常,然后从Git仓库拉取源码。这个过程不复杂,但有几个细节会影响成功率。
4.1 创建LibreNMS用户并设置目录
安全最佳实践是:不要让LibreNMS跑在root用户下,也不建议运行在www-data用户下。最正规的做法是创建一个独立的系统用户librenms,后续所有PHP-FPM池、调度器脚本都以这个用户运行。
sudo useradd -r -M -d /opt/librenms -s /bin/bash librenms这里参数的含义:
- -r表示创建系统用户,不显示在登录界面。
- -M表示不在/home目录创建用户主目录,因为主目录就是我们接下来要创建的源码目录。
- -d指定用户的主目录为/opt/librenms。
- -s指定shell为/bin/bash,这是因为Composer和artisan命令需要shell环境。
然后创建源码目录并把所有权交给librenms用户:
sudo mkdir -p /opt/librenms sudo chown librenms:librenms /opt/librenms4.2 从Git克隆LibreNMS源码
现在切到librenms用户并克隆源码:
sudo -u librenms -H sh -c 'cd /opt/librenms && git clone https://github.com/librenms/librenms.git .'注意最后这个“.”,表示克隆到当前目录而不是创建一个叫librenms的子目录。这个命令执行时间取决于网络状况,如果服务器访问GitHub比较慢,可以考虑用代理或者镜像源,但我不建议使用来路不明的第三方镜像,因为安全风险太高。GitHub官方仓库最放心。
克隆完成后,切换到最新的稳定分支。LibreNMS的master分支虽然包含最新代码,但稳定性不如明确的发布标签。官方推荐使用latest release版本,我们可以通过下面命令查看当前版本标签:
cd /opt/librenms git fetch --tags git branch -a git tag | tail -20我写这篇博文时最新稳定版是24.x系列。如果只想用官方recommended版本,可以这样切换:
git checkout $(git describe --tags --abbrev=0)这样会签出最新的发布标签,是一个相对保守、适合生产的选择。
4.3 安装Composer并安装PHP依赖
Composer是PHP世界的包管理器,类似Python里的pip。LibreNMS源码里包含了composer.json和composer.lock,我们需要用Composer把vendor目录里的依赖还原出来。先安装Composer:
sudo apt install -y composerUbuntu 24.04软件源里的Composer版本可能比较旧,建议直接下载最新版:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php composer-setup.php --install-dir=/usr/local/bin --filename=composer php -r "unlink('composer-setup.php');"然后验证:
composer --version接下来,切换目录并执行依赖安装:
cd /opt/librenms sudo -u librenms composer install --no-dev --prefer-source这一步耗时较长,通常需要几分钟,视网络和机器性能而定。--no-dev参数表示不安装开发环境依赖,生产环境没必要装那些调试工具。--prefer-source会优先使用git克隆方式来拉取依赖库,方便后续跟踪问题,如果网络不好也可以去掉这个参数改用默认的zip方式。
安装完成后,可以检查vendor目录是否存在且大小正常:
sudo -u librenms ls -l /opt/librenms/vendor/bin如果vendor/bin里出现了phpunit这类文件,说明开发依赖也被装进来了,可以回头再执行一次:
sudo -u librenms composer install --no-dev生产环境务必保持干净的vendor目录。
5. 配置Web服务:Nginx与PHP-FPM协同工作
到现在为止,LibreNMS代码和依赖已经就绪,但浏览器还访问不到它。这是因为我们还没有把Nginx和PHP-FPM串联起来。这一步也是大多数新手踩坑最重的地方:要么是PHP-FPM的sock文件路径写错,要么是root目录指向不对,要么是处理PHP请求的location规则不对。
5.1 配置PHP-FPM池
Ubuntu的PHP-FPM通常会有一个默认池www.conf,对应的运行用户是www-data。我们要给LibreNMS单独建一个池子,让PHP进程以librenms用户运行,避免文件权限错乱。
复制默认配置并修改:
sudo cp /etc/php/8.3/fpm/pool.d/www.conf /etc/php/8.3/fpm/pool.d/librenms.conf sudo nano /etc/php/8.3/fpm/pool.d/librenms.conf修改或确认以下内容:
[librenms] user = librenms group = librenms listen = /run/php/php8.3-fpm-librenms.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 php_value[memory_limit] = 512M php_value[max_execution_time] = 300 php_value[upload_max_filesize] = 100M php_value[post_max_size] = 100M这里最关键的是user和group改为librenms,listen使用的socket文件所有者是www-data。Nginx是通过www-data用户去连接这个sock的,所以socket的权限要保证Nginx能读写。memory_limit设为512M是因为LibreNMS在生成某些大报表或批量采集时会占用比较多内存,默认的128M大概率不够用,导致504超时。
修改后重启PHP-FPM:
sudo systemctl restart php8.3-fpm确认sock文件生成:
ls -l /run/php/php8.3-fpm-librenms.sock如果文件不存在,说明PHP-FPM配置有问题,查看日志排查:
sudo tail -f /var/log/php8.3-fpm.log5.2 编写Nginx站点配置
现在为LibreNMS创建一个独立的server配置。我建议直接新建一个配置文件,不要改动默认站点,这样将来可以同时部署多个服务,互不干扰。
sudo nano /etc/nginx/sites-available/librenms内容如下:
server { listen 80; server_name monitor.example.com; root /opt/librenms/html; index index.php; charset utf-8; gzip on; gzip_types text/css application/javascript application/json image/svg+xml; gzip_vary on; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ ^/(\.(?!well-known)|vendor|tests|\.git) { deny all; } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/run/php/php8.3-fpm-librenms.sock; fastcgi_index index.php; fastcgi_read_timeout 300; } location ~ /\.(?!well-known).* { deny all; } }逐一解释每个关键块:
- server_name建议改成你自己的域名或IP。如果没有域名,可以使用服务器IP,给server_name写IP也可以,但不推荐,因为将来换IP会麻烦。
- root指向/opt/librenms/html,这是LibreNMS Web入口所在目录。如果你的源码放在别的路径,这里也要相应修改。
- location /里try_files是为了支持路由重写,如果不这样配,LibreNMS的URL会全部多出index.php前缀,不好看,而且部分功能会异常。
- 第二条location ~ ^/(.(?!well-known)|vendor|tests|.git) deny all,是为了禁止访问.php以外的敏感文件和目录,尤其是.git和vendor目录。如果不禁止,攻击者可以直接下载你的源码或者依赖库配置,这非常危险。
- location ~ .php$是用来处理PHP请求的。fastcgi_pass后面必须是PHP-FPM监听的sock路径,和librenms.conf里一致。fastcgi_read_timeout 300很重要,因为LibreNMS一些较慢的报表请求会超过默认的60秒,不加这个会频繁出现502。
启用站点并测试配置:
sudo ln -s /etc/nginx/sites-available/librenms /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx如果nginx -t报错,根据提示修正,一般问题都出在分号缺失或者路径错误。访问http://你的服务器IP/,应该能看到LibreNMS的安装引导页面。没看到的话,先别急着往下走,先看nginx错误日志:
sudo tail -f /var/log/nginx/error.log最常见的情况是目录权限不对,导致nginx返回403。这时确保/opt/librenms的所有者为librenms用户,同时目录至少要有755权限,文件至少644权限:
sudo chown -R librenms:librenms /opt/librenms sudo find /opt/librenms -type d -exec chmod 755 {} \; sudo find /opt/librenms -type f -exec chmod 644 {} \;后面我们还会运行一个官方脚本来自动设置权限,但先手动跑一遍能更早发现权限问题。
6. Librenms安装向导与初始化配置
Web界面能打开,说明前半程基本成功了。LibreNMS接下来会进入一个图形化的安装向导,这个向导相比其他PHP项目要简单很多,但该填的信息一个都不能错。
6.1 “Check”页面:解决依赖和环境检查项
浏览器打开LibreNMS首页后,会进入安装向导,第一步通常是运行环境检查。系统会逐一检测PHP扩展、目录权限、软件版本是否满足要求。每项后面有绿色勾或红色叉。红色叉的项目必须全部解决才能进入下一步。
我在不同机器上遇到最多的检查项失败有:
- PHP模块缺失:回到第2.3节,安装所有列出的扩展。
- “Composer dependencies not installed”:说明第4.3步composer install没有成功执行,检查/opt/librenms/vendor目录是否存在。
- “MySQL database connection failed”:多半是数据库密码或者主机名填错了。注意LibreNMS的数据库主机,如果MySQL写在localhost,这里也填localhost,别填127.0.0.1。虽然按TCP/IP也能通,但权限里我们只授权了'localhost',这里填127.0.0.1可能会因为认证主机不匹配导致连接失败。
- “Timezone not set”:回到2.2节设置时区。
- “PHP version too low”:在Ubuntu 24.04上通常不会遇到。
如果检查项全部通过,点击Continue。
6.2 填写数据库与应用配置
这一步需要填写:
- Database Host:localhost。
- Database Port:3306。
- Database Name:librenms。
- Database User:librenms。
- Database Password:你之前设定的强密码。
- Database Unix Socket:如果你的MySQL不是通过TCP连接,可以填/var/run/mysqld/mysqld.sock,但单机默认用localhost即可。
应用配置部分还需要设置一个管理员账号。LibreNMS要求第一个用户必须是admin角色。填一个邮箱和密码,邮箱会用来接收报警邮件,密码务必复杂一点。用户名默认是邮箱地址的前缀,也可以自定义。
填完后点击Install,系统会开始创建数据表并初始化配置。这一步通常需要几十秒。如果中途卡住,多半是数据库权限不够,或者PHP执行时间超时。数据库权限这个问题,有些人在第一步创建用户时,误给了SELECT权限,导致建表失败。建议重新执行第3.2节的GRANT ALL PRIVILEGES,并确保FLUSH PRIVILEGES。
安装完成后,页面会提示删除安装临时文件:
sudo rm -rf /opt/librenms/install这个文件在源码安装阶段会生成,如果不删除,后续访问站点可能还会跳回安装向导,这是LibreNMS的安全保护机制,但也会造成困扰。
6.3 配置时区、语言和个人偏好设置
安装完成后,直接用刚才创建的账号登录LibreNMS。进入系统后先别急着添加设备,先做一些基础设置。
点击右上角用户头像,进入“用户设置”,可以修改显示的语言为简体中文。LibreNMS的本地化做得还不错,很多界面都支持中文,虽然翻译不是100%完整,但关键菜单和提示都能看懂。我个人还是用英文界面,因为有些专业术语翻译成中文反而不直观,比如“Device Groups”、“Alert Rule”这类词,英文原文更清晰。这个看个人习惯,不影响使用。
然后在“设置 -> 常规设置”里,可以修改站点名称、默认轮询间隔等。LibreNMS默认轮询间隔是300秒,即每5分钟采集一次设备数据。小规模环境可以保持默认,设备多了之后可以适当延长到600秒,降低服务器负载。
7. 启动轮询与发现:手动与自动发现设备的完整流程
LibreNMS的核心能力是自动发现和轮询。安装完成后,系统不会自动开始采集,需要我们先配置好调度任务和SNMP。
7.1 配置系统cron任务
LibreNMS官方要求添加一组cron任务,用来定期执行轮询、发现、报警检查、数据汇总等任务。编辑crontab:
sudo crontab -e但这里有个细节:LibreNMS官方建议将cron任务写入librenms用户的crontab,而不是root的crontab。因为轮询任务需要以librenms用户身份运行,才能正确写日志。所以执行:
sudo -u librenms crontab -e追加以下内容:
*/5 * * * * php /opt/librenms/artisan schedule:run >> /dev/null 2>&1这是Laravel项目标准的定时任务入口。LibreNMS内部已经定义了多个计划任务,包括每5分钟轮询、每日数据汇总、每6小时发现等,它们都通过这一个schedule:run激活。用哪个用户运行,决定了任务以什么权限去读取配置和写日志。我建议统一用librenms用户。
写完后保存,确认cron生效:
sudo -u librenms crontab -l7.2 设置SNMP轮询与发现的默认团体字符串
添加设备之前,需要确保目标设备开启了SNMP服务。如果你对自己的网络设备不熟悉,可以先从一台Linux服务器开始测试。安装snmpd并配置最简单的SNMP v2c:
sudo apt install -y snmpd snmp修改/etc/snmp/snmpd.conf,将默认团体名改为一个自定义的只读字符串,例如publicro。注意,生产环境建议用更复杂的团体名,SNMP v3当然更安全,但配置复杂度会高很多,这里先以简单可用为主。
LibreNMS添加设备时,需要填写SNMP版本和团体名。如果你没有特殊需求,统一使用SNMP v2c,团体名保持一致即可。
7.3 手动添加设备与验证采集
登录Web界面,导航到“设备 -> 添加设备”。填写:
- Hostname或IP:填写目标设备的IP地址。
- SNMP版本:v2c。
- 端口:161。
- 团体名:和snmpd配置保持一致。
LibreNMS会立即尝试通过SNMP探测设备,成功后会把设备加入列表,并自动识别设备类型。如果设备不支持SNMP,或者防火墙挡着161端口,添加会失败,并返回“Could not connect to the device”。这时候需要排查:
- 目标设备防火墙是否放行了UDP 161。
- snmpwalk命令是否能正常返回数据:
snmpwalk -v2c -c publicro 192.168.1.1 system - 如果snmpwalk有输出而LibreNMS添加失败,很可能是Web服务器上的PHP-FPM没有权限访问外网UDP端口,此时检查SELinux或AppArmor配置。Ubuntu默认没有启用SELinux,但AppArmor可能限制snmp模块行为,可以通过journalctl -u php8.3-fpm查看日志来定位。
设备添加成功后,LibreNMS会自动触发一次首次采集。等待几秒,点击设备页面,就能看到CPU、内存、接口流量等数据。如果数据为空,过几分钟后再刷新,因为轮询周期默认是5分钟。
7.4 配置自动发现网段
手动添加设备适合数量少的情况。如果你的环境里有几十台设备,一台台加太痛苦。LibreNMS支持按IP网段自动扫描发现。在“设置 -> 发现”里,配置自动发现的方式,其中最简单的是使用“Discovery”功能,指定要扫描的网段:
在Web导航栏找到“设备 -> 自动发现”,或者在设置中配置“Discovery Networks”。填入一个网段,比如192.168.1.0/24,LibreNMS会定期扫描该网段内所有开了SNMP的地址并尝试发现。SNMP扫描使用的是ICMP ping加SNMP协议组合,只对开启了SNMP的设备产生记录。这个功能不是实时的,默认每6小时执行一次发现任务。
自动发现成功的关键是:目标设备SNMP配置正确,且防火墙放行UDP 161从监控服务器进来的请求。另外,LibreNMS不会主动关闭那些后来停掉的设备,它只是不再更新数据,设备状态会显示为“Down”。
我在实际项目中,通常的做法是先把核心设备手动添加,确认SNMP配置无误,再对网段启动自动发现。这样既能保证优先级高的设备第一时间上线,又能慢慢把长尾资产“挖”出来。
8. 报警规则与通知渠道配置
监控系统不报警,等于白装。LibreNMS的报警机制比较灵活,但仍然需要花点时间理解它的概念。它有“规则”和“通知”两层结构。规则描述的是“什么条件下触发报警”,通知描述的是“触发后通过什么渠道发给谁”。
8.1 自定义一个常用报警规则:CPU使用率超阈值
进入“报警 -> 规则 -> 创建规则”。LibreNMS的规则语法是基于设备收集的指标字段。比如我们要对CPU负载做报警,字段是processor_usage。一个简单的规则是:
%macros.device_up = 1 && processors.processor_usage > 90这条规则的含义是:设备在线,且CPU使用率高于90%。
注意里面的“.”语法表示关联表关系。LibreNMS的规则里,processors是一张表,processor_usage是字段。如果设备是路由器,可能有多个CPU核心,那么任意一个核心超过90%都会触发。如果想对所有核心都超过90%才报警,可以用聚合函数,但那种场景很少见,通常有一个核心飙升就足以说明问题。
规则创建后,设置告警间隔,比如15分钟重新检查一次,重复告警间隔设为1小时,防止告警风暴。
8.2 配置邮件告警
LibreNMS支持通过SMTP发送邮件。进入“设置 -> 报警设置 -> 邮件”,配置SMTP服务器地址、端口、账号密码、发件人地址。如果使用企业邮箱的SMTP服务器,注意选择正确的加密方式(TLS或SSL),端口用465或587。配置完成后,建议先给自己发一封测试邮件,按钮一般在“通知”或“测试”里可以找到。
我在公司内部部署时,有时候不想依赖外部SMTP,就直接在内网搭一个Postfix中继,将LibreNMS的邮件发送到内部邮箱系统。这种方式更稳定,不占公网带宽。
8.3 接入Webhook与其他通知渠道
除了邮件,LibreNMS还支持Slack、Discord、Telegram、Pushover以及通用的Webhook。Webhook适合对接企业内部的钉钉、飞书或自定义通知服务。在“通知 -> 创建通知 -> Webhook”中,填入回调URL,选择需要发送的事件类型(故障、恢复、确认等)。Webhook的JSON格式在LibreNMS文档里有详细说明,我通常用它对接一个自建的报警群机器人,实现手机端即时推送。
这里分享一个我踩过的坑:Webhook回调地址如果在公网上,务必加上签名校验,否则别人可以伪造报警信息。LibreNMS本身不提供签名机制,但可以在通知规则里把报警内容拼上自定义的token,接收端校验token是否匹配。这个方式简单粗暴,但足够防御大多数误触。
9. 日常维护、升级与常见问题速查
部署完成后,还有一系列日常维护动作要做。很多人在监控系统装完就丢在那里,过了半年再想升级,结果反而因为缺少依赖、数据库结构过旧导致升级失败。这里我把维护相关的要点一次说清楚。
9.1 使用daily.sh脚本维护文件权限与数据库结构
LibreNMS提供一个官方维护脚本,路径为/opt/librenms/daily.sh。它的作用是,如果Git仓库需要更新,它会自动切换到指定分支并同步代码;如果需要执行数据库迁移,它也会自动跑。但要注意,它是被cron的schedule:run调用的,不是手动频繁执行的。我们只需要保证cron任务配置正确,日常维护就能自动化。
如果需要手动更新LibreNMS,执行:
cd /opt/librenms sudo -u librenms ./daily.sh这个脚本会做Git拉取、Composer依赖更新、数据库迁移、缓存清理等一系列动作。更新前建议先备份数据库。
9.2 数据库备份与恢复
数据库备份很简单,直接使用mysqldump:
mysqldump -u librenms -p librenms > librenms_backup_$(date +%F).sql恢复时:
mysql -u librenms -p librenms < librenms_backup_20250101.sql我建议把数据库备份做成每日定时任务,并保留最近7天的备份。最简单的做法是加一条cron:
0 3 * * * mysqldump -u librenms -p'你的密码' librenms | gzip > /backup/librenms_$(date +\%Y\%m\%d).sql.gz注意密码写在命令行里有安全隐患,但如果你只是内网环境,并且备份目录权限严格控制,这也是无奈之举。更安全的方式是使用~/.my.cnf存放密码。
9.3 常见安装与运行问题排查速查表
我把我在实际使用中遇到的一些高频问题整理成表,方便你按图索骥。
| 症状 | 可能原因 | 解决方法 |
|---|---|---|
| 打开网页空白或500 | PHP-FPM没启动或配置错误 | 运行systemctl status php8.3-fpm,查看/var/log/php8.3-fpm.log |
| 502 Bad Gateway | fastcgi_pass中的sock路径不对,或PHP-FPM内存不足 | 检查librenms.conf里的listen路径,并确认与nginx配置一致;调大php_value[memory_limit] |
| 安装向导提示PHP扩展缺失 | Ubuntu软件源未安装对应扩展 | 根据提示安装相应php8.3-xxx包 |
| 设备添加失败,SNMP超时 | 目标设备防火墙拦截UDP 161 | snmpwalk测试;检查iptables/firewalld规则 |
| 图表是空的 | RRD目录权限不对或轮询任务未运行 | 检查/opt/librenms/rrd目录权限,确认cron任务是否添加 |
| 数据库连接失败 | 密码错误或授权主机不匹配 | 用mysql -u librenms -p测试连接;确认用户仅在localhost授权 |
| 页面加载特别慢 | MySQL缓冲池太小,或PHP-FPM进程不够 | 调大innodb_buffer_pool_size;增加pm.max_children |
| 报警一直不触发 | cron没运行,或规则语法错误 | 检查librenms用户的crontab;在规则列表页面测试规则 |
9.4 安全加固:禁用目录列表、启用HTTPS
默认情况下,Nginx已经把.git和vendor目录封禁了。还需要注意几点:
- 将/opt/librenms目录权限改为librenms用户所有,避免其他用户可写。
- 在生产环境务必启用HTTPS。可以使用Let's Encrypt免费证书:
sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d monitor.example.com - 如果不想用域名,也可以用自签名证书,但浏览器会有安全提示,适合内部测试环境。
顺便提一点,LibreNMS的admin账号密码建议启用双因素认证。它原生支持TOTP,在其用户设置页面可以开启,之后登录时需要输入动态验证码,能极大降低密码泄露带来的风险。
10. 个人使用感受与后续扩展建议
整套环境从零搭建到现在稳定运行,我最大的体会是:LibreNMS的安装门槛不高,但真正让监控系统“跑得好”的关键在于后续的规则定制和数据梳理。安装向导只是开始,把设备分组、告警阈值调准、减少无效通知、让监控面板符合团队的实际需求,这些才需要花更长的时间。
如果你只是个人玩一玩,安装到这里已经完全够用了。如果是在团队或生产环境中使用,我建议你再做几件事:
- 将设备的资产信息补全,包括机房位置、维护联系人、保修期限,LibreNMS允许在设备详情中维护这些字段,在出现故障时能快速找到责任人。
- 把外部应用纳管起来。LibreNMS本身是网络监控,但它也支持通过自定义脚本采集任意指标,我们可以用它来监控业务API的响应时间、服务端口存活状态等。官方文档里提供了“Services”和“Application”功能,可以扩展性很广。
- 把报警渠道和值班系统打通。如果你们公司有运维值班平台,用Webhook方式对接,LibreNMS就能作为底层监控源向值班平台推送告警,极大降低漏报概率。
还有一个曾经让我很受益的小技巧:在服务器上安装SNMP服务后,会自带很多MIB库文件。把设备的私有MIB文件放到/opt/librenms/mibs目录下,LibreNMS在自动发现时就能识别出更多设备型号细节,否则某些设备的接口名称会显示成oid编号,特别难看。这个MIB库不需要手动注册,只要文件放进去,重启轮询进程就能生效。
最后再分享一个我自己折腾出来的优化方式:如果你管理的设备数量超过100台,建议把LibreNMS的轮询间隔从默认的5分钟调整到10分钟,然后把RRD的聚合周期适当延长。这样虽然数据实时性降低了一点,但服务器负载会明显下降,数据库膨胀速度也会变慢。像我们这种看趋势多于看实时的场景,10分钟完全够用。监控系统最怕的不是数据不够新,而是因为服务器撑不住把数据丢了。
以上这套部署流程,我在Ubuntu 24.04上至少完整跑过三次,每次都是干净的系统从头装到尾。按照这个顺序操作,基本不会卡住。如果你在过程中碰到任何文档里没有细说的问题,优先去看/opt/librenms/logs/librenms.log和PHP-FPM的错误日志,大多数异常线索都在那里。先把日志看懂,再动手改配置,比盲目试错要高效得多。