Modifier un paramètre PHP ou PHP-FPM
Cas général
Picasoft utilise une image Nextcloud qui fait tourner PHP-FPM, permettant d’appeler des scripts PHP depuis nginx
de façon efficace.
Traditionnellement, PHP se configure grâce à un fichier php.ini
. Cependant, ce fichier contient de nombreuses directives, potentiellement modifiées par Nextcloud au fil des mises à jour.
Attention:
Malgré ce qui est indiqué dans un bout de sa documentation, écraser la configuration dans le fichier .user.ini
ne semble pas être le plus pertinent : il contient déjà des directives qui n’ont pas été remplies par nous.
La meilleure solution est :
- Pour PHP : monter un fichier
.ini
dans/usr/local/etc/php/conf.d/
. C’est ce qui est fait actuellement. - Pour PHP-FPM : monter un fichier
.conf
dans/usr/local/etc/php-fpm.d
. C’est ce qui est aussi fait actuellement.
Note:
La version de PHP utilisée par Nextcloud est compilée avec l’option --with-config-file-scan-dir=/usr/local/etc/php/conf.d
. Tous les fichiers .ini
de ce dossier seront donc inclus dans la configuration, par ordre alphabétique. C’est pour cela que notre fichier commence par z
, pour être inclus à la fin. Pour PHP-FPM c’est la même limonade, la compilation met le fichier de configuration à /usr/local/etc/php-fpm.
, qui inclue ensuite tous les fichiers .conf
de /usr/local/etc/php-fpm.d
.
Il suffit donc de modifier un des ces fichiers sur le dépôt et de redémarrer le conteneur applicatif.
Cas d'application
Assez souvent, notre instance est très lente, voir finit par envoyer des timeout (HTTP 504), notamment sur la synchronisation des calendriers. Les logs donnent un avertissement :
[14-Apr-2022 13:40:32] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
Cette valeur désigne le « nombre maximum de processus fils à créer lorsque pm
est réglé sur dynamic
» et « affecte la limite du nombre de requêtes simultanées qui seront servies » ([source]). En d’autres termes, la configuration de base de Nextcloud n’autorise que 5 requêtes servies simultanément!
Après quelques recherches, cette réponse sur Reddit donne des valeurs qui semblent plus adéquates à la situation :
[www] pm = dynamic pm.max_children = 50 pm.start_servers = 15 pm.min_spare_servers = 15 pm.max_spare_servers = 25 pm.max_requests = 500
Comme ces valeurs concernent PHP-FPM, il suffit de les ajouter dans le fichier zz-php-fpm-custom.conf, puis de redémarrer le conteneur.
Vérifier les paramètres
Pour PHP
Lien:
Idée prise ici.
Se rendre dans le conteneur et créer un fichier phpinfo.php
qui affiche la configuration PHP. Exemple :
- snippet.bash
$ docker exec -it nextcloud-app sh echo "<?php phpinfo(); ?>" > phpinfo.php
Puis visiter cette page.
Attention:
Leaker toute la configuration est dangereux, à ne faire que parcimonieusement et penser à supprimer le fichier après usage.
Pour PHP-FPM
Depuis le conteneur, on peut récupérer les paramètres de la configuration pour voir s’ils sont bien pris en compte :
- snippet.bash
$ php-fpm -tt [...] [14-Apr-2022 15:41:49] NOTICE: pm = dynamic [14-Apr-2022 15:41:49] NOTICE: pm.max_children = 50 [14-Apr-2022 15:41:49] NOTICE: pm.start_servers = 15 [14-Apr-2022 15:41:49] NOTICE: pm.min_spare_servers = 15 [14-Apr-2022 15:41:49] NOTICE: pm.max_spare_servers = 25 [14-Apr-2022 15:41:49] NOTICE: pm.process_idle_timeout = 10 [...]
Pour voir les paramètres runtime : TODO : https://www.php.net/manual/fr/fpm.status.php
Attention:
Certains paramètres ne sont pas affichés sur cette page et il semble n’y avoir aucun moyen d'y accéder.