Question Transférer des requêtes PHP via ProxyPassMatch en tant que gestionnaire ou uniquement lorsqu'un fichier existe


Je migre mon serveur pour utiliser mod_proxy_fcgi et php-fpm au lieu de mod_php. Apache est capable de transmettre des requêtes .php au proxy fcgi et PHP s'exécute correctement. J'ai ce travail avec:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1

Malheureusement, Apache transmet toutes les requêtes .php au proxy, même lorsque le fichier n'existe pas. Cela pose quelques problèmes. Ma règle ErrorDocument n'est pas appelée et DirectoryIndex index.php index.html ne retombe pas dans index.html.

J'ai pu résoudre ces problèmes avec mod_rewrite:

RewriteEngine On                                                           
RewriteCond %{REQUEST_FILENAME} ^/((.*\.php)(/.*)?)$                       
RewriteCond /var/www/html/%2 -f                                   
RewriteRule . fcgi://127.0.0.1:9000/var/www/html/%1 [P] 

Cependant, la documentation Apache ne recommande pas RewriteRule: "Cela est dû au fait que cet indicateur déclenche l'utilisation du travailleur par défaut, qui ne gère pas le regroupement de connexions."

Dans l’idéal, je souhaiterais soit utiliser ProxyPass dans un bloc FilesMatch (actuellement non pris en charge), soit définir un nouveau gestionnaire qui utilise un proxy pour fcgi et l’utiliser pour gérer les requêtes .php, comme ce que mod_php fait.

Avez-vous des suggestions pour simuler une configuration standard mod_php tout en utilisant le proxy via fcgi?


5
2017-11-09 22:04


origine




Réponses:


Une option consiste à installer mod_proxy_handler: https://gist.github.com/progandy/6ed4eeea60f6277c3e39

Ou vous pouvez attendre Apache 2.4.10, qui devrait inclure le module.

En gros, le module vous permet de faire ceci:

#tcp
<FilesMatch \.php$>
SetHandler proxy:fcgi://localhost:9000
</FilesMatch>

#uds
<FilesMatch \.php$>
    SetHandler "proxy:unix:/path/to/socket.sock|fcgi://./"
</FilesMatch>

4
2018-06-13 12:31



YAEEES! J'ai perdu une journée entière à cause d'essais et d'erreurs. Ce qui a résolu le problème, c'est d'utiliser le bloc #tcp ci-dessus. En utilisant ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/usr/local/var/www/$1 ne fonctionne pas avec VirtualDocumentRoots, et l’astuce de réécriture n’a jamais fonctionné pour moi. - mcdado
En outre, il est important de noter que proxy:fcgi://localhost:9000  ne veut pas le chemin après. Ce fut un grand malentendu pour moi. - mcdado
FYI je l'ai écrit dans un post de blog: mcdado.com/post/166619749589/apache-and-php-fpm-via-homebrew - mcdado


Idem à l'OP.

  • Je ne pouvais pas non plus comprendre comment obtenir la configuration Apache VHOST pour acheminer les demandes non détectables vers un serveur 404.
  • De même, j’ai également été bloqué en essayant de comprendre comment obtenir des URL sans extension pour mapper ProxyPassMatch.
    • Bien sûr ... je pourrais acheminer tout à travers le php-fpm proxy, mais cela a tué les fichiers javascript et css.

Solution théorique

Je suppose que je devrais écrire une coutume 404.php processeur - puis acheminez toutes les demandes en ajoutant le (s) fichier (s) demandé (s) en tant que chaîne de requête.

Par exemple:

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-s
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-l
RewriteRule ^.*$   fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/404.php?no_comprende=%{REQUEST_URI} [P]
...
ProxyPassMatch ^/(.*\.php(/.*)?)$    fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1
...

en théorie - et en supposant que l'ordre dans lequel elles sont répertoriées est toujours valable:

Tout fichier 404'd serait attrapé avant la ProxyPassMatch la directive a été atteinte

Ma solution

  • php5-fpm (5.4.23)
  • Apache 2.4.2
  • Ubuntu 12.04 / 3.8.0-34 x86_64

Pour gérer des URL sans extension avec php-fpm J'ai adapté ce qui précède pour rechercher les URL sans extension telles quelles dans ma configuration VHOST:

...
# Extensionless URL's
RewriteCond %{REQUEST_FILENAME} ^/((.*)(/.*)?)$
RewriteCond %{DOCUMENT_ROOT}/%2.php -f
RewriteRule !.*\.php$   fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/%1.php   [P]

# files w/ .php extensions
RewriteCond %{REQUEST_FILENAME} ^/((.*\.php)(/.*)?)$
RewriteCond %{DOCUMENT_ROOT}/%2 -f
RewriteRule . fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/%1 [P]
...

Pas joli, mais ça fait le travail :-(


0
2017-12-18 00:40





Juste pour le compte rendu d'un one-liner:

AddHandler "proxy:unix:/path/to/socket.sock|fcgi://./" .php

Vous aurez besoin d'une version récente d'Apache 2.4 (RedHat l'a reporté à la version 2.4.6)

Oliver


0
2017-10-20 17:36





J'ai eu exactement le même problème que ide et j'ai passé beaucoup plus de temps à essayer de le résoudre que je ne l'avais espéré. Etant donné que c’est le seul article ou article que j’ai pu trouver et qui m’ait aidé à résoudre correctement le problème, je voulais ajouter ma solution au mélange.

Ma configuration:

  • Ubuntu 14.04
  • Apache 2.4.20
  • PHP-FPM 5.5.9-1ubuntu4.17 (fpm-fcgi) (construit le 19 mai 2016 19:08:26)

J'ai rencontré quelques défis supplémentaires:

  1. Mon gestionnaire ErrorDocument est un fichier PHP.
  2. J'ai un tas de directives RedirectPermanent dans le fichier .htaccess de ma racine de document. Celles-ci n'étaient pas honorées car les requêtes étaient envoyées à PHP-FPM avant l'évaluation des règles de redirection.
  3. FilesMatch était insuffisant pour moi car j'utilise la réécriture d'URL de manière similaire à Wordpress. Par exemple. /mydir/mypath.html pointe vers /mydir/script.php. Je n'arrivais pas à faire correspondre les URL réécrites, mais j'ai peut-être oublié quelque chose?
  4. J'ai pu avoir l'approche de misterich au travail, mais après avoir lu celle d'Apache avertissement de performance, J'ai décidé de creuser plus loin.

Ma solution est fondamentalement la suivante:

  1. Intercepter et rediriger les demandes de répertoires et de fichiers inexistants et les réécrire dans le fichier PHP du gestionnaire d'erreurs.
  2. Utilisez une autre règle de réécriture pour acheminer ma demande d'erreur réécrite vers PHP-FPM.
  3. Routez toutes les autres requêtes vers PHP-FPM en utilisant ProxyPassMatch.

Pour résoudre les redirections 301 (n ° 2), je vais simplement utiliser le gestionnaire d’erreur pour émettre des redirections.

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^.*\.php$ /error.php?error=404&requestUri=$1

RewriteCond %{REQUEST_FILENAME} ^/(error.php)$
RewriteCond %{DOCUMENT_ROOT}/%1 -f
RewriteRule . fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/%1   [P]

# PHP-FPM
ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/mysite.com"

0
2018-05-29 00:33





J'ai eu même problème quand le fichier n'existait pas montrant "Fichier introuvable." message, cela a résolu mon problème et m'a permis de configurer une page 404:

<VirtualHost *:80>

---------- content --------

DocumentRoot /home/user/public_html/domain.tld

#this disables php execution if you wish to show only html files
#ProxyPass /errors !

ProxyErrorOverride On
# /errors folder is located in public_html
ErrorDocument 404 /errors/404.php


</VirtualHost>

0
2017-07-08 06:18