Comment installer GLPI 11 sur Linux (Debian/Ubuntu) : pas à pas

Un pas à pas réel d'installation de GLPI 11 sur Debian 12 ou Ubuntu 24.04 : PHP et les deux php.ini qui comptent, MariaDB avec fuseaux horaires, downstream.php pour sortir config et files du webroot, cron en CLI et liste de contrôle post-installation.

Installer GLPI 11 sur Linux se passe bien jusqu'à la ligne où vous sortez config/ et files/ du webroot et où l'installateur ne "trouve" plus la base de données. Voici le pas à pas que nous utilisons pour provisionner GLPI chez nos clients : les commandes réelles, les deux php.ini qui comptent vraiment, le fichier qui évite l'erreur la plus courante de l'installation manuelle et la liste de contrôle post-installation qui verrouille l'environnement.

Avant de commencer : dimensionnez le serveur

GLPI 11 tourne sur la pile classique LAMP : Apache (ou Nginx) + PHP 8.1 ou supérieur + MariaDB 10.5+ (ou MySQL 8). Sous Debian 12 le PHP par défaut est le 8.2 ; sous Ubuntu 24.04 LTS, le 8.3 - les deux conviennent. Ce qui change vraiment entre un pilote et un environnement de centaines de techniciens, c'est la RAM et le modèle d'exécution de PHP (mod_php contre PHP-FPM). Voici la matrice que nous utilisons pour dimensionner :

ProfilUtilisateurs actifsRAMvCPUModèle PHP
Pilote / POCjusqu'à 202 Go2mod_php suffit
Petitjusqu'à 1004 Go2PHP-FPM + OPcache
Moyen100 à 4008 Go4PHP-FPM dédié, disque SSD
Grand400+16 Go+4+Base de données sur un hôte séparé

1. Système, serveur web, PHP et extensions

Mettez le système à jour et installez tout d'un coup. Les extensions ne sont pas optionnelles : GLPI valide chacune sur l'écran des prérequis.

apt update && apt upgrade -y
apt install -y apache2 mariadb-server \
  php php-{mysql,curl,gd,intl,xml,mbstring,zip,bz2,ldap,imap,apcu} \
  libapache2-mod-php certbot python3-certbot-apache

L'erreur courante ici est d'oublier php-intl : l'installation du paquet réussit quand même, mais GLPI bloque à la vérification des prérequis et le formatage des dates ainsi que l'internationalisation cassent. php-ldap et php-imap ne sont nécessaires que si vous intégrez Active Directory et le collecteur de courrier, mais les installer maintenant évite une réinstallation plus tard.

2. Les deux php.ini qui comptent

C'est ce qui sépare une installation qui "marche" d'une qui marche aussi à 3 h du matin. PHP garde des réglages séparés par SAPI : Apache lit /etc/php/8.2/apache2/php.ini, mais le cron de GLPI tourne en ligne de commande et lit /etc/php/8.2/cli/php.ini. Réglez les deux avec les mêmes valeurs :

memory_limit = 256M
upload_max_filesize = 20M
post_max_size = 20M
max_execution_time = 300
max_input_vars = 5000
session.cookie_httponly = On
date.timezone = Europe/Paris
; rappel : ce même fichier existe aussi dans .../cli/php.ini

En infogérance, la cause numéro un des "actions automatiques qui se sont arrêtées" n'est presque jamais le cron du système : c'est le memory_limit à 128M dans le php.ini du CLI qui étouffe la synchro d'inventaire ou l'envoi de notifications en lot, alors que celui d'Apache était déjà à 256M et que personne ne s'en doutait. Éditez les deux fichiers.

3. MariaDB, la base et le fuseau horaire

Lancez mysql_secure_installation et créez la base en utf8mb4 (les accents et les emojis en dépendent) :

mysql -u root -p
CREATE DATABASE glpi CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'glpi'@'localhost' IDENTIFIED BY 'MotDePasseFort';
GRANT ALL PRIVILEGES ON glpi.* TO 'glpi'@'localhost';
FLUSH PRIVILEGES;

Un détail qui n'apparaît que plus tard : le sélecteur de fuseau horaire de GLPI reste vide tant que vous n'importez pas les tables de fuseaux de MariaDB et n'accordez pas la lecture à l'utilisateur GLPI. Faites-le maintenant :

# Charge les tables de fuseaux ; sans cela le sélecteur reste vide
mariadb-tzinfo-to-sql /usr/share/zoneinfo | mysql -u root mysql
mysql -u root -e "GRANT SELECT ON mysql.time_zone_name TO 'glpi'@'localhost'; FLUSH PRIVILEGES;"

4. Sortez config, files et logs du webroot - et dites à GLPI où ils sont

Téléchargez GLPI 11 et décompressez-le :

cd /tmp
wget https://github.com/glpi-project/glpi/releases/download/11.0.0/glpi-11.0.0.tgz
tar -xzf glpi-11.0.0.tgz -C /var/www/
chown -R www-data:www-data /var/www/glpi

Pour la sécurité, les données sensibles ne doivent pas rester sous le webroot. Déplacez-les :

mkdir -p /etc/glpi /var/lib/glpi/files /var/log/glpi
mv /var/www/glpi/config/* /etc/glpi/
mv /var/www/glpi/files/*  /var/lib/glpi/files/
chown -R www-data:www-data /etc/glpi /var/lib/glpi /var/log/glpi

Voici l'erreur la plus courante de l'installation manuelle : déplacer les répertoires sans dire à GLPI où ils sont allés. Résultat : l'installateur recrée config/ et files/ dans le webroot, vous verrouillez les permissions au mauvais endroit et l'environnement reste exposé. La bonne façon est de créer inc/downstream.php - il est lu par Apache comme par le CLI, donc il règle le web et le cron d'un coup :

<?php // /var/www/glpi/inc/downstream.php
define('GLPI_CONFIG_DIR', '/etc/glpi');
define('GLPI_VAR_DIR',    '/var/lib/glpi/files');
define('GLPI_LOG_DIR',    '/var/log/glpi');

5. Virtual host, HTTPS et le DocumentRoot sur public/

Le DocumentRoot pointe vers /var/www/glpi/public, jamais vers la racine de l'installation - c'est obligatoire depuis GLPI 10 et c'est ce qui empêche config et files d'être servis par le web.

<VirtualHost *:80>
    ServerName glpi.cliente.com.br
    DocumentRoot /var/www/glpi/public   # jamais /var/www/glpi

    <Directory /var/www/glpi/public>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
a2ensite glpi.conf && a2enmod rewrite
a2dissite 000-default.conf
systemctl reload apache2
certbot --apache -d glpi.cliente.com.br

6. Installez en ligne de commande et configurez le cron

Avec downstream.php en place, db:install écrit déjà config_db.php dans /etc/glpi - inutile d'exporter la moindre variable :

php /var/www/glpi/bin/console db:install \
  --db-host=localhost --db-name=glpi \
  --db-user=glpi --db-password='MotDePasseFort' \
  --default-language=fr_FR --no-interaction

GLPI traite les notifications, l'inventaire et les actions automatiques via un cron externe. Planifiez-le chaque minute - GLPI décide lui-même ce qui tourne à chaque déclenchement, selon la fréquence de chaque tâche :

echo "* * * * * www-data /usr/bin/php /var/www/glpi/front/cron.php &>/dev/null" > /etc/cron.d/glpi

Ensuite, dans Configuration > Actions automatiques, passez le mode d'exécution en CLI. S'il reste en mode interne (déclenché à l'accès des utilisateurs), les tâches disparaissent la nuit et le week-end - exactement quand vous voulez l'inventaire et les sauvegardes en marche.

7. Post-installation : la liste qui verrouille l'environnement

  1. Supprimez l'installateur : rm /var/www/glpi/install/install.php. Attention : chaque upgrade recrée ce fichier - supprimez-le à nouveau après chaque mise à jour.
  2. Changez les mots de passe des quatre comptes par défaut : glpi, tech, normal et post-only.
  3. Configurez le SMTP dans Configuration > Notifications et envoyez un e-mail de test.
  4. Confirmez que l'installateur a disparu et que le cron a tourné :
# L'installateur est-il encore accessible ? (attendu : 404)
curl -s -o /dev/null -w "%{http_code}\n" https://glpi.cliente.com.br/install/install.php
-- Le cron externe tourne-t-il ? (lastrun doit être récent)
SELECT name, state, lastrun FROM glpi_crontasks ORDER BY lastrun DESC LIMIT 5;

Ce que nous vérifions en reprenant un GLPI installé par un tiers

Quand nous reprenons l'infogérance d'un environnement installé par une autre équipe, le diagnostic est toujours le même trio : y a-t-il un inc/downstream.php, ou deux répertoires config qui cohabitent (un vivant, un fantôme que quelqu'un modifie sans effet) ? Le memory_limit du CLI suit-il celui d'Apache ? Et le mode des actions automatiques est-il en CLI ou lié à l'accès des utilisateurs ? Ces trois points expliquent la plupart des "GLPI est lent" et "les notifications n'arrivent pas" que nous recevons - et aucun n'apparaît sur une installation testée seulement en cliquant dans l'interface aux heures de bureau.

Besoin d'un GLPI 11 provisionné et maintenu avec cette rigueur, sans hériter d'une dette d'installation ? Découvrez la maintenance et le support GLPI de NexTool.


Révisé par l'équipe NexTool Solutions.

Questions fréquentes

PHP 8.1 ou supérieur. Debian 12 fournit le 8.2 et Ubuntu 24.04 LTS le 8.3, tous deux supportés. Les extensions obligatoires incluent intl, mysqli, curl, gd, mbstring, xml et zip ; ldap et imap ne sont nécessaires que pour Active Directory et le collecteur de courrier.

Oui. Apache lit le php.ini du SAPI apache2, mais front/cron.php tourne en CLI et lit le php.ini du CLI. N'en éditer qu'un laisse la moitié de GLPI (actions automatiques, inventaire en lot, notifications) avec la mauvaise limite de mémoire et le mauvais timeout.

C'est là que vous redéfinissez GLPI_CONFIG_DIR, GLPI_VAR_DIR et GLPI_LOG_DIR pour sortir config, files et logs du webroot. Comme il est lu par le web et par le CLI, db:install et le cron voient les mêmes chemins. Sans lui, déplacer les répertoires casse l'installation.

GLPI lit les fuseaux dans les tables time_zone de MariaDB, qui ne sont pas peuplées par défaut. Lancez mariadb-tzinfo-to-sql pour les importer et accordez SELECT sur mysql.time_zone_name à l'utilisateur GLPI.

Jusqu'à environ 100 utilisateurs, mod_php avec OPcache suffit. Au-delà, PHP-FPM isole les workers, améliore l'usage mémoire et permet de régler la concurrence indépendamment d'Apache. C'est le choix par défaut dans les environnements plus grands.

En production, oui. Sans TLS, les identifiants circulent en clair sur le réseau. Utilisez Let's Encrypt (Certbot). Derrière un proxy inverse, assurez-vous que le cookie de session porte le drapeau Secure et faites confiance à l'en-tête X-Forwarded-Proto.

Besoin d'aide ?