ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.4-fpm.sock

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.4-fpm.sock - PHP - Programmation

Marsh Posté le 04-10-2021 à 18:53:01    

Bonjour,
 
je suis le cours Gérez votre serveur Linux et ses services sur openclassroom. Après avoir merdouillé sur l'installation d'un serveur wordpress (dans le cadre du cours), je suis revenu sur mes pas pour mieux comprendre les parties précédentes, il s'agit de PHP, chapitre Installez PHP sur votre serveur web. (le sujet n'est pas wordpress…)
 
Il y a une instruction dont l'objectif manque encore de clarté à mes yeux:

Citation :

DocumentRoot /var/www/html/www.example.com
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.4-fpm.sock|fcgi://localhost/var/www/html/www.example.com


L'expression régulière ne me gêne pas, tout est clair.
À quoi sert un socket unix, c'est aussi clair.
Le pool [www] (…/pool.d/www.conf ) écoute sur le socket unix /run/php/php7.4-fpm.sock
 
Par contre, que je commente cette ligne (ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.4-fpm.sock…) dans mon VirtualHost, ou que je la laisse décommentée, cela ne change rien au résultat final.
Est-ce normal que de mon client firefox j'obtienne toujours (i.e. ligne juste dessus commentée ou pas) ceci en tapant https://openclassrooms.example.com/top_secret/ ?
https://i.ibb.co/m6BKHzx/php1.pngexample.com et openclassrooms.example.com sont des alias de www.example.com, ça aussi c'est clair…
 
À quoi sert cette ligne exactement ?

Citation :

DocumentRoot /var/www/html/www.example.com
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.4-fpm.sock|fcgi://localhost/var/www/html/www.example.com


 
Quelques infos:

Citation :

thierry@vm-serveur:/var/www/html/www.example.com$ ll
total 28
drwxr-xr-x 4 root root  4096 Okt  2 14:29 ./
drwxr-xr-x 4 root root  4096 Okt  4 11:29 ../
-rw-r--r-- 1 root root 10918 Sep 29 13:45 index.html
drwxr-xr-x 2 root root  4096 Sep 30 14:07 top_secret/
drwxr-xr-x 2 root root  4096 Okt  2 14:29 wordpress/
 
thierry@vm-serveur:/var/www/html/www.example.com$ ll top_secret/
total 16
drwxr-xr-x 2 root root 4096 Sep 30 14:07 ./
drwxr-xr-x 4 root root 4096 Okt  2 14:29 ../
-rw-r--r-- 1 root root   17 Sep 30 14:06 index.html.bak
-rw-r--r-- 1 root root   20 Sep 30 14:07 index.php
 
thierry@vm-serveur:/var/www/html/www.example.com$ cat top_secret/index.php  
<?php
phpinfo();
?>


 
Une petit remarque: à la fin de mon Virtualhost, il y a quelques directives pour authentifier l'utilisateur (soit avec mot de passe "normal", soit avec un serveur ldap) qui émet une requête sur www.example.com/top_secret, cela fonctionne bien, ce n'est pas problématique.  
 
Mon VirtualHost:

Citation :

<VirtualHost *:80>
        ServerName www.example.com
        ServerAlias example.com openclassrooms.example.com
        ServerAdmin webmaster@example.com
 
        <IfModule mod_rewrite.c>
                RewriteEngine On
                RewriteCond %{HTTPS} !=on
                #RewriteRule ^(.*) https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
                RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
        </IfModule>
 
</Virtualhost>
 
 
<IfModule mod_ssl.c>
<VirtualHost *:443>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        ServerName www.example.com
        ServerAlias example.com openclassrooms.example.com
 
        # On active le chiffrement (HTTPS)
        SSLEngine                   On
        SSLCertificateFile          /home/thierry/certificat/fullchain.pem
        SSLCertificateKeyFile       /home/thierry/certificat/privkey.pem
 
        ServerAdmin webmaster@example.com
        DocumentRoot /var/www/html/www.example.com
 
        ########################################################
        # Commenté ou non commenté le résultat est le même ?? Normal ??
        ########################################################
        ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.4-fpm.sock|fcgi://localhost/var/www/html/www.example.com
 
        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn
 
        ErrorLog ${APACHE_LOG_DIR}/www.example.com-error.log
        CustomLog ${APACHE_LOG_DIR}/www.example.com-access.log combined
 
        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
 
        <Directory /var/www/html/www.example.com>
                Options All
                AllowOverride None
        </Directory>
 
        #<Directory /var/www/html/www.example.com/top_secret>
        #       AuthType Basic
        #       AuthName "Accès retreint aux utilisateurs authentifiés"
        #       AuthBasicProvider file
        #       AuthUserFile "/etc/apache2/passwords"
        #       Require ip 192.168.0.122
        #       Require valid-user
        #</Directory>
 
        <Directory /var/www/html/www.example.com/top_secret>
                AuthType Basic
                AuthName "Accès retreint aux utilisateurs authentifiés"
                AuthBasicProvider ldap
                AuthLDAPURL ldap://localhost/ou=Personnes,dc=mon-entreprise,dc=com?uid?sub
                Require ip 192.168.0.122
                Require valid-user
        </Directory>
 
 
</VirtualHost>
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet


 
Les modules chargés:

Citation :

thierry@vm-serveur:/etc/apache2/sites-available$ ls ../mods-enabled/
access_compat.load  auth_basic.load  authnz_ldap.load  authz_user.load  deflate.conf  dir.load     ldap.conf  mime.load       negotiation.conf  proxy_fcgi.load  reqtimeout.load  setenvif.load       ssl.load
alias.conf          authn_core.load  authz_core.load   autoindex.conf   deflate.load  env.load     ldap.load  mpm_event.conf  negotiation.load  proxy.load       rewrite.load     socache_shmcb.load  status.conf
alias.load          authn_file.load  authz_host.load   autoindex.load   dir.conf      filter.load  mime.conf  mpm_event.load  proxy.conf        reqtimeout.conf  setenvif.conf    ssl.conf            status.load


Message édité par mozaia le 04-10-2021 à 19:09:15

---------------
Dimensions Moebius Sésamath
Reply

Marsh Posté le 04-10-2021 à 18:53:01   

Reply

Marsh Posté le 05-10-2021 à 16:20:22    

Je me lance dans une "explication", ou plutôt dans un essai d'explication. Il me manque des connaissances, du vocabulaire et de la précision (à supposé qu'il n'y ait pas trop d'erreurs)
 

Citation :

DocumentRoot /var/www/html/www.example.com
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.4-fpm.sock|fcgi://localhost/var/www/html/www.example.com


 
1) PHP-FPM (FastCGI Process Manager) est un daemon, accessible comme un serveur. C'est ici que l'on souhaite envoyer les requêtes PHP pour qu'elles soient traitées. C'est-à-dire que le daemon FPM renvoie à Apache une page html fabriquée dynamiquement.
2) La communication entre le daemon FPM et notre serveur Apache2 nécessite l'utilisation d'une Socket. Ici, comme on est dans le même ordinateur, les deux processus pourront utiliser une socket Unix (UDS), et c'est ce qui écrit: unix:/run/php/php7.4-fpm.sock . On trouve l'URI de cette socket dans le fichier /etc/php/7.4/fpm/pool.d/www.conf
3) Si la communication est maintenant presque possible entre Apache2 et le daemon FPM, il manque quand même quelque chose, un "traducteur de requête" entre Apache et le daemon FPM. C'est le rôle de l'API fcgi.
4) ProxyPassMatch contient 3 mots: 1- Match: si on a une correspondance (si ça matche) avec l'expression régulière alors 2-Pass: on transmet la requête au -3 Proxy : daemon FPM.
 
Par exemple, si on a /var/www/html/www.example.com/dir1/dir2/index.php, et qu'un client firefox émet un requête http de lecture (désolé pour mon vocabulaire !) de ce fichier index.php.
1) le suffixe va correspondre à l'expression régulière
2) http va se connecter au socket unix:/run/php/php7.4-fpm.sock et lui envoyer en stream fcgi://localhost/var/www/html/www.example.com/dir1/dir2/index.php
3) le daemon FPM reçoit tout cela, traite cette requête PHP et renvoie sa réponse, la page html dynamiquement créée vers Apache (en fcgi ou en http, ou encore autrement, je ne sais pas ?)
4) Apache reçoit d'une manière ou d'une autre la page html et la transmet au client firefox.
 
C'est en gros comme cela que ça fonctionne ? pas du tout ? ou un peu ?


Message édité par mozaia le 05-10-2021 à 16:25:49

---------------
Dimensions Moebius Sésamath
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed