Comment activer .htaccess avec proxy_fcgi et php-fpm ?

WRInaute accro
Bonjour

J'ai upgradé la distro de mon serveur VPS ( OVH Classic 4 ), de Debian 7 Wheezy, à Debian 8 Jessie récemment.

Tout s'est passé sans encombre, mais mon Apache ( maintenant version 2.4.1 ), est resté en mode prefork, car je constatais que le mode worker était plus lent. ( Probablement à cause d'un problème de fichier php.ini mal configuré ).

Il y a la possibilité de mpm_event avec fastcgi, mais fastcgi est déjà obsolète ?


J'ai appris ces temps-ci, que la meilleure façon de configurer Apache 2.4.1+ avec php, est le module proxy_fcgi et php5-fpm , avec la connexion qui va bien, en mode tcp/ip sur port 9000, car la connexion par socket unix, souffre de problème de nombre de sockets.

Cependant l'inconvénient de du module proxy_fcgi et php5-fpm, est que cette redirection ( par ProxyPass ), intervient avant l'interprétation des fichiers .htaccess, et rend inopérant, les urlrewriting et les authentifications http.


Donc, ma demande serait de savoir quelle est la meilleure façon de configurer Apache 2.4.1. avec php.

Merci beaucoup.

Respectueusement.
 
Nouveau WRInaute
Bonjour,

Pourquoi ne pas utiliser uniquement nginx ? Je l'utilise depuis un moment avec des sites en php ça marche à merveille.
 
WRInaute accro
MoxSite a dit:
Bonjour,

Pourquoi ne pas utiliser uniquement nginx ? Je l'utilise depuis un moment avec des sites en php ça marche à merveille.


Bonjour Monsieur

Je ne cherche pas de solution conjoncturelle à mon problème mais des solutions structurelles. ;)

Apache est la référence en matière de serveur web.

D'autre part, nginx ne supporte pas les .htaccess et les urlrewriting ?

C'est précisément mon problème : J'ai besoin de .htaccess et des authentifications http.

Si Apache ne fonctionne plus où va-t-on ?

Merci beaucoup de votre réponse.

Respectueusement.
 
WRInaute accro
Rebonjour

J'ai vu dans un forum à propos de Apache 2.4, que cette configuration ( dans le VirtualHost ), permet de laisser la fonctionnalité .htaccess , tout en ayant proxy_fcgi et php-fpm :

Code:
# Mon DOCUMENT_ROOT est : /var/www/html.
<IfModule mod_proxy_fcgi.c>
        RewriteEngine On
        RewriteBase /
        RewriteOptions InheritBefore
        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule ^([^\.]+\.php)$ fcgi://127.0.0.2:9126/var/www/html/$1 [L,P]
    </IfModule>

Et puis, pour permettre les authentifications http :

Code:
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]


Ma question :

Pour proxy_fcgi ci-dessus ( 1er code ), je suppose qu'il faut le mettre dans chacun des <VirtualHost> des sites ?

Je ne suis pas sûr du port ( 9126 ), je vais reregarder ces commentaires.

Et... Pour le RewiiteRule ( 2ème code ), où doit-on le mettre ?

Merci de votre aide.

Respectueusement.
 
WRInaute passionné
Bonjour,

j'ai déployé de l'Apache 2.4 avec PHP-FPM en backend, et les fichiers .htaccess sont bien pris en compte... à condition de les activer (en effet ils sont désactivés par défaut).

Code:
<VirtualHost *>
    ServerName www.foo.bar
    ServerAlias *.foo.bar

    DocumentRoot /home/foo/http/www/
    VirtualDocumentRoot /home/foo/http/%-3+/

    <FilesMatch "\.php$">
        SetHandler "proxy:..."
    </FilesMatch>

    CustomLog /var/log/apache2/access_foo.log virtualhost
    ErrorLog /var/log/apache2/error_foo.log
</VirtualHost>

<Directory /home/foo/http/ >
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

Ici ce que tu cherches c'est probablement le “AllowOverride”, qui doit avoir une valeur autre que “None”, cf : http://httpd.apache.org/docs/2.4/fr/upgrading.html#run-time

Sinon pour les précisions : bien sûr qu'NginX gère l'urlrewriting et l'identification HTTP. Ce qu'il ne gère pas, c'est le fait de déporter la configuration dans un fichier “.htaccess” recherché, lu et interprété à chaque hit.
 
WRInaute accro
Bonjour Bool ;)

Est-ce que ta solution permet les authentifications http ?

Et... La transmission des paramètres de login/password à un prog. php ?

Merci.

Respectueusement.
 
WRInaute impliqué
Tu dois avoir une directive FastCGIExternalServer dans la configuration Apache.
Il faut ajouter -pass-header Authorization pour l'identification HTTP.
Un truc du genre :
Code:
FastCGIExternalServer /truc/bidule/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
 
WRInaute passionné
Pas essayé, mais à priori ça n'a guère d'importance. Il s'agit juste de déclarer une variable d'environnement, qui sera traitée par mod_proxy le moment venu.
 
WRInaute accro
Bool a dit:
Pas essayé, mais à priori ça n'a guère d'importance. Il s'agit juste de déclarer une variable d'environnement, qui sera traitée par mod_proxy le moment venu.

Bonjour Bool

J'ai testé sur mon ordinateur çà marche. ;)

En tout cas sur que les .htaccess fonctionnent.

Je n'ai pas constaté d'accroissement de vitesse, c'est peut-être une illusion.

Je vais migrer prochainement.

Une dernière question : Debian 8 ( Jessie ), a théoriquement Apache 2.4.11 , et je n'ai que 2.4.1.

J'ai pourtant fait ce soir : apt-get update et apt-get upgrade, aucun paquet de changé.

Mon /etc/apt/sources.list est conforme à la doc de Debian, avec une ligne spécifique à OVH, et des clés gpg.

2.4.1 est équivalent à 2.4.10 ?

Ta méthode ne fonctionne qu'à partir de 2.4.9 . ;(

C'est la doc Apache qui le dit.

Super merci pour ton aide. ;)

Remerciements

Respectueusement.
 
WRInaute passionné
Bonsoir,

content que tu aies réussi à faire fonctionner ça :)

Pour ce qui est de la version Apache de Debian Jessie, elle est fournie avec un Apache 2.4.10, et je ne vois pas pourquoi tu aurais une version différente.

Code:
daevel@pibb:~$ dpkg -l apache2-mpm-event                                                                                                 
Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements
|/ Err?=(aucune)/besoin Réinstallation (État,Err: majuscule=mauvais)
||/ Nom                          Version             Architecture        Description
+++-============================-===================-===================-=============================================================
ii  apache2-mpm-event            2.4.10-10           amd64               transitional event MPM package for apache2

À tous hasard, essaye un apt dist-upgrade.
 
WRInaute passionné
Je n'ai pas constaté d'accroissement de vitesse, c'est peut-être une illusion.

Le fCGI / FPM n'est pas spécialement plus rapide que le classique module PHP, ou du moins pas dans des proportions facilement mesurables, mais il est surtout scalable, c'est à dire qu'il encaisse infiniment mieux les pics de trafic, tout en consommant nettement moins de ressources.
 
WRInaute accro
Bool a dit:
Le fCGI / FPM n'est pas spécialement plus rapide que le classique module PHP, ou du moins pas dans des proportions facilement mesurables, mais il est surtout scalable, c'est à dire qu'il encaisse infiniment mieux les pics de trafic, tout en consommant nettement moins de ressources.


Bonjour Bool

Ce serait excellent, car c'est précisément où çà bloque.

Je suppose que je devrais convertir d'abord toute ma database, de MyISAM vers InnodDB ?

Actuellement je n'ai que du MyISAM.

Je vais tester sur mon ordinateur. ;)

Merci beaucoup.

Respectueusement.
 
WRInaute passionné
Bonjour,

oui MyISAM n'est pas spécialement «scalable» non plus, chaque modification bloque complètement la table ce qui interdit complètement les accès concurrents. Et chose rigolote, certains SELECT nécessitant une table temporaire (car gros traitement et/ou requête mal fichue), se retrouvent également à poser le verrou en question.

Avec les machines multi-coeurs qu'on a de nos jours, MyISAM est bien souvent une plaie :D
 
WRInaute accro
Bonjour Bool

Voilà aujourd'hui j'ai converti toute ma database vers le moteur InnoDB.

Je n'ai plus qu'à configurer Apache en mode mpm_event et proxy_fcgi.

Super merci, mon site sera sans doute plus rapide. ;)

Il semblerait que le passage à InnoDB ait un peu fluidifié les accès.

Merci beaucoup de ton aide.

Respectueusement.
 
WRInaute accro
Hep, help ;)

J'ai réussi à convertir mon serveur VPS en mode mpm_event + proxy_fcgi + fcgid + php5-fpm

J'utilise strictement ta méthode, et toutbaine,sic en'est que les ServerAlias ( sans www. ),ne sont pas interprétés par php5-fpm.

J'aurais du mal, si tout le monde voyait mon code php... ;(

Et encore, même avec les ServerName ( avec www. ), celà ne marche que dans Chrome.

Dans Firefox, le code php s'affiche sans être interprété.

Je subodore une erreur de mon certificat ssl.

Théoriquement dans ce cas, Firefox devrait afficher une erreur.

Merci beaucoup de ton aide.

Respectueusement.
 
WRInaute passionné
mmm ça me semble un peu confu tout ça.

Déjà, tu devrais désactiver (ou virer) le module fcgid d'Apache.
En gros tu as 3 principaux modes d'interaction Apache/PHP :
- mod_php
- mod_fcgi + php5-cgi
- mod_proxy_fcgi + php5-fpm

Donc avec php5-fpm, pas besoin du mod_fcgi.

Maintenant pour en revenir à ton problème, je n'ai pas trop d'idée... «chez moi ça marche». Donc à moins de regarder directement sur le serveur l'ensemble du montage, difficile de savoir ce que tu as réellement fait...
 
WRInaute accro
Bonjour Bool

Le module fcgid était bien désactivé.

J'ai fait ce matin une modification de : /etc/php5/fpm/pool.d/www.conf :

Après, le site est valide sur Firefox aussi, ( mais pas sans www ).

Si je lance le site sans http://www., php n'est pas interprété.

C'est le seul problème résiduel.

J'ai tous les fichiers de ma configuration.

Il y a plusieurs sites, avec l'ip du serveur ipv4 et ipv6 théoriquement, les virtualhost sont dans /etc/apache2/sites-available/.

Ce fichier s'appelle : http://www.pronostics-courses.fr.conf

Voici le code, moins le certificats ssl.

Code:
<VirtualHost *:80>
        ServerName www.pronostics-courses.fr
        ServerAlias pronostics-courses.fr
        ServerAdmin ortolo.jeanfrancois@free.fr
        DocumentRoot /var/www/html

        SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

        <Directory /var/www/html>
                Options -Indexes +FollowSymLinks -ExecCGI +MultiViews

                AllowOverride All

                DirectoryIndex /index.php index.php

                <IfModule mod_proxy_fcgi.c>

                        RewriteEngine On
                        RewriteBase /

                        SetEnv proxy-chain-auth On

                        <FilesMatch \.php>
                        SetHandler  "proxy:fcgi://127.0.0.1:9000"
                        </FilesMatch>

                </IfModule>

                Order allow,deny
                allow from all

                <IfVersion >= 2.4>
                        Require all granted
                </IfVersion>
        </Directory>

        Alias /awstats-icon/ /usr/share/awstats/icon/

        <Directory /usr/share/awstats/icon>
                Options None
                AllowOverride None
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/www.pronostics-courses.fr_error.log
        CustomLog ${APACHE_LOG_DIR}/www.pronostics-courses.fr_access.log combined

        LogLevel debug

#       SetOutputFilter  DEFLATE
#       SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|ico|png)$ \no-gzip dont-vary
#       SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|situ|nom)$ \no-gzip dont-vary

        BrowserMatch ^Mozilla/4 gzip-onlytext/html
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName www.pronostics-courses.fr
        ServerAlias pronostics-courses.fr
        ServerAdmin ortolo.jeanfrancois@free.fr
        DocumentRoot /var/www/html

        SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

        <Directory /var/www/html>
                Options -Indexes +FollowSymLinks -ExecCGI +MultiViews

                AllowOverride All

                <IfModule mod_proxy_fcgi.c>

                        RewriteEngine On
                        RewriteBase /

                        SetEnv proxy-chain-auth On

                        <FilesMatch \.php>
                        SetHandler  "proxy:fcgi://127.0.0.1:9000"
                        </FilesMatch>

                </IfModule>

                Order allow,deny
                allow from all

                <IfVersion >= 2.4>
                        Require all granted
                </IfVersion>
        </Directory>

        Alias /awstats-icon/ /usr/share/awstats/icon/

        <Directory /usr/share/awstats/icon>
                Options None
                AllowOverride None
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/www.pronostics-courses.fr_ssl_error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel debug

        CustomLog ${APACHE_LOG_DIR}/www.pronostics-courses.fr_ssl_access.log combined
                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
# ... Le reste pour les certitficats ssl.

</VirtualHost>
</IfModule>


Merci beaucoup de ton aide.

Il semblerait, que le ServerAlias ne soit pas pris en compte.

Quand j'intervertis http://www.pronostics-courses.fr et pronostics-courses.fr, l'url sans www a php qui n'est pas interprété.

Respectueusement.
 
WRInaute accro
Bonjour Bool

Je te demande pardon de t'avoir dérangé.

Maintenant tout baigne.

J'ai simplement, échangé les ServerName et ServerAlias, et remis à zéro l'historique de mes navigateurs.

Merci de me dire si çelà passe sur tous les navigateurs ?

Quelle que soit l'url ( avec et sans www ) et le ndd avec redirection vers mon ndd principal ( voir profil ), php est interprété et le contenu html s'affiche.

Super merci pour ton aide, maintenant mon site fonctionne correctement dans les règles de l'art.

Google m'a trouvé hier 520 pages "not found" ( 404 ), pendant que je bidouillais la config.

J'espère ne pas finir dans les oubliettes, actuellement je suis,très bien positionné sur des mots-clés turfistes.

Je vais voir si je vais résister au prochain Panda. ;)

Respectueusement.
 
Discussions similaires
Haut