Upgrading PHP for LibreNMS on RHEL 9

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.