Clauses PHP dans Nginx : qui a la priorité sur qui ? ( intéret de fastcgi_param PHP_VALUE)

Hello,

Admettons que j’ai plusieurs sites nginx sur la même hote. J’ai une configuration php-fpm globale, présente dans /etc/php/7.4/fpm/php.ini puis dans /etc/php/7.4/fpm/conf.d.

Maintenant, je rends compte que chaque site hébergé a des besoins différents, et je pensais qu’en faisant un tunning comme il suit dans le fichier nginx pour chaque hote, ça fonctionnerait (exemple ici pour une instance Nextcloud) :

location ~ \.php(?:$|/) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        set $path_info $fastcgi_path_info;

        try_files $fastcgi_script_name =404;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;

        fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
        fastcgi_param front_controller_active true;     # Enable pretty urls
        fastcgi_pass php-handler;

        fastcgi_param PHP_VALUE "open_basedir=\"/tmp:/usr/share/nginx/html/nextcloud.domaine.org:/sys/class/net/:/usr/bin/clamscan\"
        allow_url_fopen=\"On\"
        memory_limit=\"2048M\"
        opcache.interned_strings_buffer=\"8\"
        opcache.max_accelerated_files=\"10000\"
        opcache.memory_consumption=\"128\"
        opcache.save_comments=\"1\"
        opcache.revalidate_freq=\"1\"
        disable_functions=\"passthru,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source\"
";
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
}

Comme vous le voyez, pour ce site spécifique, je ne veux pas de certaines extensions, je veux également limiter la portée de l’openbasedir.

Soit, si maintenant, j’ai ce besoin pour cette instance nginx et que je restart php-fpm + nginx, je m’aperçois que ça fonctionne très bien pour mon hôte. Par contre, si j’ai un setup différent pour un autre site, si je réapplique des modifications dans le fichier de l’host, je m’aperçois que le setup est aléatoirement pris en compte.

Je n’y comprends plus rien…

Nginx permet, dans ses fichiers sites-availables, de faire un setup PHP spécifique pour chaque hote, mais j’ai l’impression qu’il ne sait en prendre en compte qu’un seul à la fois ?!

Je pensais que chaque tuning PHP spécifié pour chaque fichier d’hote ne s’appliquait que dans l’instance de l’hote où il était déclaré.

Donc est-ce que j’ai mal compris la portée de fastcgi_param PHP_VALUE ? Pour moi, chaque déclaration dans une hôte de variable fastcgi_param PHP_VALUE n’avaient comme portées que le contexte dans lequel il est exécuté (monsite1).

Si j’appelle plusieurs fois fastcgi_param PHP_VALUE, dans des fichiers de site nginx différents, sur la même variable, mais avec une valeur différente pour chaque site (prenons openbasedir où ça prendrait un sens évident), il n’y a à chaque fois d’appliqué pour tous les sites qu’une seule et même valeur pour tout le monde, et celle-ci est un peu prise aléatoirement.

Donc quel est l’intéret de fastcgi_param PHP_VALUE si on ne peut l’utiliser que sur une seule et même variable à la fois, pour l’intégralité des sites ?
Autant faire son tunning dans la configuration globale de PHP, non ?

Si Nginx ne comprend qu’une seule valeur à la fois pour une même variable pour l’ensemble des sites hébergés, pourquoi permettre de faire un setup spécifique propre à chaque site, puisqu’au final il n’y a qu’une seule valeur qui sera retenue pour tout le monde ?? A ce moment là, au nginx -t, il devrait brailler à la vérification de la conf, mais là rien.

Est-ce que je fais mal quelque chose ?

Je peux me tromper mais à-priori c’est ta variable « fastcgi_pass » qui me semble mal configurée.

Si tu veux que chaque vhost ait sa propre configuration, il faut que tu lui donnes un « identifiant » customisé, qui doit être le même dans ton fichier vhost de nginx, et qui correspond à la valeur de la variable « listen » dans ton fichier php-fpm personnalisé pour ce vhost.

Exemple, utilisant un socket unix pour php, dans le contexte server de nginx :

   fastcgi_pass unix:/run/php-fpm.domain1.sock;

puis dans le fichier de conf php-fpm lié :

 listen = run/php-fpm.$pool.sock
  • où « domain1 » correspondant un texte pouvant être le nom de domaine
  • où « $pool » correspondant au nom du pool php-fpm déclaré en entête du fichier de configuration personnalisé.

C’est seulement à ce moment où PHP sait que la configuration php-fpm personnalisée sera à appliqué sur le vhost en question, puisque et php, et le serveur web, écoutent le même processus.

Voilà (en espérant avoir compris le problème, et bien restitué l’information) :stuck_out_tongue:


Je renvoie à la page PHP :


Bref, la valeur « php-handler » ne me semble pas correcte… :wink:

Quant à savoir qui a la priorité ?

  • Aucune variable « fastcgi_* » n’a de priorité sur l’autre.
  • le fichier personnalisé de php-fpm pour un vhost a priorité sur le fichier de configuration de php initial.
2 J'aime

Super, c’est exactement ça semble-t-il, merci pour ton coup de main !