ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.4-fpm.sock - PHP - Programmation
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 |
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 ?
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:
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/ ?
example.com et openclassrooms.example.com sont des alias de www.example.com, ça aussi c'est clair…
À quoi sert cette ligne exactement ?
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:
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:
<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:
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