[gull] Question/problème PHP-FPM

Alexis Domjan adomjan at horus.ch
Tue Jan 8 13:36:15 CET 2019


Hello,

>     a) php-fpm a fait un nouveau fork, pour une raison ou une autre
>        (p.ex. rechargement de config ou de script PHP, voir le test
>        que te propose Félix), et a passé un descripteur à sa nouvelle
>        instance (fils) -- pourquoi passerait-il le mauvais ?

Ce serait en effet étonnant. Mais c'est troublant que le site retourne 
une erreur HTTP 500 (la fameuse erreur open_basedir()) juste après que 
les logs indiquent cette information. Peut-être que cette notice n'est 
pas la cause directe du bug, mais une indication d'un mécanisme qui se 
produit en même temps ?

> Ici, j'ai l'impression que ton /var/lib/php5-fpm/web35.sock est
> peut-être justement le système de communication local (UNIX domain
> socket) qui permet à apache2 et à php-fpm de communiquer et
> aussi de se passer les sockets de connexion (c'est plus
> efficace que de faire du proxying).

C'est du mod_proxy_fcgi via un socket unix (on peut aussi utiliser un 
socket tcp, c'était d'ailleurs obligatoire jusqu'à Apache 2.4.9). Y'a 
donc dans la config du vhost:

<FilesMatch "\.php[345]?$">
SetHandler "proxy:unix:/var/lib/php5-fpm/web35.sock|fcgi://localhost"
</FilesMatch>

Et dans le pool.d de php5-fpm:

listen = /var/lib/php5-fpm/web35.sock

C'est donc bien le moyen de communiquer entre Apache2 et PHP-FPM pour 
exécuter les scripts PHP.

> Est-ce que les deux sockets des deux instances php-fpm sont bien
> différents ?  Est-ce que php-fpm est en fait un seul processus qui
> lance une instance séparée par site ?

Il y a deux processus PHP-FPM pour chaque site, car c'est ce qui est 
configuré par défaut dans php-fpm : pm.start_servers = 2

> Quand on lit la doc php-fpm, on voit qu'on peut protéger chacun
> des sites via chroot (donc le socket doit alors être dans le chroot,
> et donc une instance séparée php-fpm par client), est-ce ce qui est fait ici?

Oui c'est le cas, il y a un chdir / dans la configuration de chaque host 
sous /etc/php5/fpm/pool.d/*.conf

> Plutôt avec netstat.

Oui, je m'en rappellerai lorsque le problème se reproduira.

> Tiens, puisque j'ai un compte sur une de tes machines, autant l'utiliser:
> schaefer at platinum:~$ netstat -anp | grep php
> (Not all processes could be identified, non-owned process info
>   will not be shown, you would have to be root to see it all.)
> unix  2      [ ACC ]     STREAM     LISTENING     1613770779 -                   /run/php/php7.1-fpm.sock
> unix  2      [ ACC ]     STREAM     LISTENING     1688082839 -                   /var/run/php5-fpm.sock

Sauf que sur cette machine ce n'est pas la même configuration. Sur 
platinum j'utilise des sockets tcp et il y a aussi un ou plusieurs 
processus (en fonction du start_servers) pour chaque site.

Sur vps, la machine où le problème se produit on peut voir:

root at vps:/etc/php5/fpm/pool.d# netstat -anp | grep php | grep web35
unix  2      [ ACC ]     STREAM     LISTENING     399462849 
12125/php-fpm: pool /var/lib/php5-fpm/web35.sock

Il y a donc un socket par site aussi.

>     - un socket par version de php-fpm pour communiquer avec apache2

Oui, par version et par site (configuré dans fpm/pool.d/)

>     - un socket pour communiquer entre chaque instance de php-fpm
>       d'une version particulière ?

Je ne crois pas que ce soit configuré ainsi, comme je l'ai compris.



More information about the gull mailing list