J'ai récemment installé Apache 2.4 sur ma machine locale, ainsi que PHP 5.4.8 en utilisant PHP-FPM.
Tout s'est bien passé (après un certain temps ...) mais il y a quand même une étrange erreur:
J'ai configuré Apache pour PHP-FPM comme ceci:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1
</VirtualHost>
Cela fonctionne, par exemple si j'appelle, http://localhost/info.php
j'obtiens le bon phpinfo()
(c'est juste un fichier de test).
Si j'appelle un répertoire cependant, j'obtiens un 404 avec le corps File not found.
et dans le journal des erreurs:
[Tue Nov 20 21:27:25.191625 2012] [proxy_fcgi:error] [pid 28997] [client ::1:57204] AH01071: Got error 'Primary script unknown\n'
Mise à jour
J'ai maintenant essayé de faire le proxy avec mod_rewrite:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Mais le problème est: il est toujours en train de rediriger, car on http://localhost/
le http://localhost/index.php
demande automatiquement , à cause de
DirectoryIndex index.php index.html
Mise à jour 2
Ok, donc je pense "peut-être vérifier s'il y a un fichier à donner au proxy en premier:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Maintenant, la réécriture complète ne fonctionne plus ...
Mise à jour 3
Maintenant, j'ai cette solution:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond /Users/apfelbox/WebServer/%{REQUEST_FILENAME} -f
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Vérifiez d'abord qu'il y a un fichier à passer à PHP-FPM (avec le chemin complet et absolu ) puis faites la réécriture.
Cela ne fonctionne pas lorsque vous utilisez la réécriture d' URL dans un sous - répertoire, aussi échoue pour les URL comme http://localhost/index.php/test/
donc retour à la case départ .
Des idées?
la source
config.php
fichiers en clair s'ils se trouvaient dans des répertoires aliasés et donc n'existant pas dans% {DOCUMENT_ROOT} /% {REQUEST_URI}.J'ai également rencontré ce problème hier - Apache 2.4 est passé de Debian / experimental à Debian / unstable, me forçant à gérer ce nouveau truc; pas sur nos serveurs de production bien sûr;).
Après avoir lu ce qui ressemble à des millions de sites, des documents Apache, des rapports de bogues et une sortie de débogage dans le journal des erreurs, j'ai finalement réussi à le faire fonctionner. Non, il n'y a pas encore de support pour FPM avec des sockets . La configuration par défaut de Debian utilise des sockets depuis un certain temps maintenant, donc les utilisateurs de Debian devront également changer cela.
Voici ce qui fonctionne pour un site CakePHP et PHPMyAdmin (ce dernier a besoin d'une configuration si vous utilisez les paquets Debian), donc je peux confirmer que cela
mod_rewrite
fonctionne toujours comme prévu pour faire une réécriture d'URL de fantaisie.Remarquez
DirectoryIndex index.php
, ce qui pourrait être la raison pour laquelle aucune de vos configurations n'a fonctionné pour les "dossiers" (du moins c'est ce qui n'a pas fonctionné ici).J'obtiens toujours
File not found.
des répertoires, mais seulement s'il n'y a pas de fichier d'index, il peut analyser. J'adorerais me débarrasser de cela aussi, mais ce n'est pas aussi critique que pour le moment.Le vhost ci-dessus fonctionne parfaitement bien avec un .htaccess à la racine comme ceci:
Je ne comprends pas vraiment ce que vous voulez dire par contre
URL rewriting inside a subdirectory
(je ne fais que réécrire dans le fichier index.php de la racine).(Oh, et vous devrez vous assurer que Xdebug n'entre pas en conflit avec FPM sur votre système, dès le départ, ils veulent utiliser les mêmes ports.)
la source
DirectoryIndex index.html
dans le vhost en question l'a corrigé. Si c'est le casDirectoryIndex index.php
, il semble que d'autres fichiers PHP finissent par donner l'erreur «Fichier introuvable» et «Script principal inconnu». Dans mon cas, j'aiindex.html
un fichier phptest.php
.Il vous suffit de définir:
Et n'oubliez pas de paramétrer la page client en:
la source
Voilà ce que j'ai. Il semble fonctionner correctement. J'ai mis Drupal dans un sous-répertoire et son travail de réécriture, les index de répertoire fonctionnent et PATH_INFO fonctionne.
J'ai essayé de faire quelque chose comme ça sans réécriture ("Si" et autres), mais je n'ai rien pu faire fonctionner.
EDIT: Notez que si vous l'implémentiez en tant que fournisseur d'hébergement partagé, cela pourrait être un problème de sécurité. Cela permettrait aux utilisateurs de passer des scripts PHP à un proxy fcgi arbitraire. Si vous aviez un pool séparé pour chaque utilisateur, cela permettrait une élévation des attaques de privilèges.
la source
Encore une autre solution (nécessite Apache> = 2.4.10) - À l'intérieur du vhost:
Donc, ici, le gestionnaire fcgi pour PHP ne sera défini que si le fichier existe et si son nom correspond à l'extension de fichier PHP.
BTW: Pour ceux qui auraient l'idée de régler ProxyErrorOverride sur On , sachez que c'est vraiment une mauvaise idée. L'utilisation de cette directive n'est pas sans poser de problème. Par exemple, toute application PHP envoyant du code HTTP tel que 503 entraînerait un résultat inattendu. Le gestionnaire d'erreurs par défaut serait impliqué dans tous les cas et pour les applications PHP qui fournissent une API, c'est vraiment un mauvais comportement.
la source
La meilleure façon de résoudre ce problème est d'activer les journaux de débogage pour mod_proxy et mod_rewrite et php-fpm. Dans apache 2.4, vous pouvez désormais activer les journaux de débogage pour des modules spécifiques uniquement. http://httpd.apache.org/docs/current/mod/core.html#loglevel La configuration par module et par répertoire est disponible dans Apache HTTP Server 2.3.6 et versions ultérieures
Peut-être que vous obtenez une double barre oblique sur les répertoires?
Voici ce que j'utilise et cela fonctionne bien:
la source
Une chose que j'ai rencontrée dans mon traitement de ce problème est que si vous utilisez la combinaison de:
Dans votre configuration de pool fpm, ne passez pas le chemin d'accès complet à la
ProxyPass
directive.Mais -Seulement- si le pool sur ce port est chrooté.
la source
Je ne sais pas si le problème est lié, mais j'ai trouvé une solution de travail partielle ici:
/programming/44054617/mod-rewrite-in-2-4-25-triggering-fcgi-primary-script-unknown-error-in-php-fpm
L'astuce semble être d'ajouter un? char dans le .htaccess RewriteRule, par exemple en utilisant:
au lieu de:
La source du problème semble être un changement dans mod_rewrite d'Apache 2.4.25. J'ai utilisé le niveau de log d'Apache trace1 pour observer une "boucle" qui passe $ 1 à php-fpm après que index.php / $ 1 a été passé. Le $ 1 génère l'erreur "AH01071: Got error 'Primary script unknown \ n'".
J'espère que cette petite friandise aidera quelqu'un à résoudre ses problèmes.
la source
Linode a un excellent tutoriel sur ce sujet
Fondamentalement, vous configurez un gestionnaire pour l'ensemble du serveur qui interceptera tous les scripts php et les passera à fast-cgi.
la source
j'ai l'erreur également après le passage à php-fpm + apache 2.4.6 pour les instances drupal
mais j'utilise le mod d'événement mpm
il suffit d'insérer
DirectoryIndex index.php
travaille pour moialors mes paramètres Vhost ressemblent à ci-dessous
Merci
pas besoin de réviser le fichier .htaccess par défaut de drupal
la source
Je fais face aux mêmes problèmes sur mon serveur (docker centos 7.3.16). Après avoir suivi le journal de php-fpm, j'ai trouvé miss a sys lib.
WARNING: [pool www] child 15081 said into stderr: "php-fpm: pool www: symbol lookup error: /lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure"
puis, je rappelle le nspr, cela fonctionne. Si vous ne trouvez pas les solutions après avoir essayé des méthodes, vous pouvez essayer ceci.yum -y install/reinstall nspr
la source
Cela fonctionne avec Wordpress 5.1.1 et plus récent avec PHP 7.3, FastCGI, proxy, également MariaDB / MySQL. Vérifié deux fois sur mes serveurs. Fonctionne comme un charme.
Premier sur CentOS / Fedora / Red Hat
Modifiez ce fichier:
Collez ceci:
Devrait donner srw-rw-rw-.
Ou comment installer sur Debian / Ubuntu
Didacticiel:
source: https://emi.is/?page=articles&article=php-7-installation-and-configuration-for-apache-2.4-using-php-fpm-(debian,-repository)
Le problème est que php 7.3 du repo Ondrej ne fonctionne qu'avec le mode mpm_prefork. Il a git repo, vous pouvez donc le trouver dans le net et lui demander s'il fera php 7.3 pour mpm_worker et mpm_event. Le reste de la configuration des distributions de la famille Debian est ci-dessous:
coller
coller
coller
copiez ceci dans un fichier txt:
supprimez-le puis collez-le au lieu de ci-dessus:
Ajouter une directive
Activez ensuite le site:
Modifiez ensuite le site SSL (dans ce cas, le certbot de Let's Encrypt a été installé et configuré précédemment au début de la configuration du certificat SSL).
N'oubliez pas d'ajouter un port 9000 à un pare-feu sur Debian / Ubuntu
Sur CentoOS / Fedora / Red Hat
la source