LibreNMS recently raised its PHP requirement to 8.4 minimum, 8.5 recommended. If you’re still on 8.3 (or older), the web UI will nag you until you upgrade. Here’s how to do it on RHEL 9 using the Remi repository.
Prerequisites #
This assumes Remi is already installed and enabled:
dnf repolist | grep remi
You should see remi-safe and remi-modular. If not, install it first:
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms
1. Check the current PHP module #
dnf module list php
Name Stream Profiles Summary
php remi-7.4 common [d], devel, minimal PHP scripting language
php remi-8.0 common [d], devel, minimal PHP scripting language
php remi-8.1 common [d], devel, minimal PHP scripting language
php remi-8.2 common [d], devel, minimal PHP scripting language
php remi-8.3 [e] common [d], devel, minimal PHP scripting language
php remi-8.4 common [d], devel, minimal PHP scripting language
php remi-8.5 common [d], devel, minimal PHP scripting language
[e] marks the currently enabled stream — 8.3 here, which is now below LibreNMS’s minimum.
2. Reset and switch the module #
dnf module reset php -y
dnf module switch-to php:remi-8.5/common -y
Use remi-8.4 instead if you’d rather stay on the minimum supported version.
switch-to resets and enables in one step, then pulls in the new packages:
Upgrading:
php-cli x86_64 8.5.9-1.module_php.8.5.el9.remi remi-modular 6.2 M
php-common x86_64 8.5.9-1.module_php.8.5.el9.remi remi-modular 819 k
php-fpm x86_64 8.5.9-1.module_php.8.5.el9.remi remi-modular 3.1 M
php-gd x86_64 8.5.9-1.module_php.8.5.el9.remi remi-modular 53 k
php-mbstring x86_64 8.5.9-1.module_php.8.5.el9.remi remi-modular 537 k
php-mysqlnd x86_64 8.5.9-1.module_php.8.5.el9.remi remi-modular 152 k
...
Complete!
You may see a warning like /etc/php.ini created as /etc/php.ini.rpmnew — that’s normal; dnf won’t overwrite a config file you may have customized. Diff it afterward if you’ve made local changes.
3. Refresh and confirm nothing’s left behind #
dnf update --refresh
Dependencies resolved.
Nothing to do.
Complete!
4. Restart services #
systemctl restart php-fpm
systemctl restart nginx # or httpd
5. Verify the version #
php --version
PHP 8.5.9 (cli) (built: Jul 28 2026 13:06:52) (NTS gcc x86_64)
Copyright (c) The PHP Group
Built by Remi's RPM repository <https://rpms.remirepo.net/>
Zend Engine v4.5.9, Copyright (c) Zend Technologies
with Zend OPcache v8.5.9, Copyright (c), by Zend Technologies
6. Run LibreNMS’s validator #
cd /opt/librenms
su - librenms -s /bin/bash -c './validate.php'
You’ll likely hit a [FAIL] about file ownership, since the module switch can leave some files owned by root instead of the librenms user:
[FAIL] We have found some files that are owned by a different user than 'librenms', this will stop you
updating automatically and / or rrd files being updated causing graphs to fail.
[FIX]:
sudo chown -R librenms:librenms /opt/librenms
sudo setfacl -d -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/
sudo chmod -R ug=rwX /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/
Run the suggested fix:
chown -R librenms:librenms /opt/librenms
setfacl -d -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/
chmod -R ug=rwX /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/
Then re-run the validator:
su - librenms -s /bin/bash -c './validate.php'
===========================================
Component | Version
--------- | -------
LibreNMS | 26.8.0-dev.116+9831e4e43 (2026-08-13T22:04:07+03:00)
PHP | 8.5.9
Database | MariaDB 10.5.29-MariaDB
===========================================
[OK] Database Connected
[OK] Database Schema is current
[OK] Active pollers found
[OK] rrd_dir is writable
[OK] rrdtool version ok
The ownership [FAIL] is gone. You may still see a [WARN] about modified .gitignore files under logs/, rrd/, storage/ — those are harmless, auto-generated during normal operation, and can be cleared with ./scripts/github-remove if they bother you.