web-dev-qa-db-fra.com

passer Apache de préfork en événement dans Ubuntu 16, faire fonctionner php 7

Apache fonctionnait lentement en production. Après avoir cherché des réponses pendant un certain temps, je suis finalement allé sur #Apache IRC channel et les pros m'ont fait vérifier le mode Apache avec cette commande:

Sudo apachectl -V

et ont été alarmés de constater que Serveur MPM est pré-fourche . Ils ont dit catégoriquement N'UTILISEZ PAS PREFORK SUR UN SERVEUR DE PRODUCTION. Il s'avère que les paquets Ubuntu (vraisemblablement hérités de Debian?) Insistent pour exécuter Apache dans mode préfork malgré le fait que méthode recommandée pour exécuter PHP avec Apache recommande clairement proxy_fcgi et php-fpm, puis fcgid et finalement dit que vous ne devriez pas utiliser prefork:

Pourquoi vous ne devriez plus utiliser mod_php avec la préfork mpm

  • mod_php est chargé dans chaque processus httpd tout le temps. Même lorsque httpd sert du contenu statique/non php, cette mémoire est utilisée.
  • mod_php n'est pas sûr pour les threads et vous oblige à vous en tenir à la préfork mpm (multi processus, pas de threads), qui est la configuration la plus lente possible

Cette page contient également quelques détails sur PHP-FPM mais cela semble un peu élaboré et peu clair et semble impliquer beaucoup de configuration manuelle. Je suis déçu et surpris qu'Ubuntu 16 n'ait pas d'option de package pour le mode fastCGI ou quelque chose.

J'ai essayé de basculer Apache en mode événement en utilisant a2enmod et quand j'ai essayé de relancer Apache, j'ai eu une erreur:

Apache exécute un MPM threadé, mais votre module PHP n'est pas compilé pour être threadsafe. Vous devez recompiler PHP

En tout cas, je me demandais si quelqu'un avait des instructions minimales et pas à pas pour faire fonctionner le mode fastCGI sur Ubuntu 16 avec PHP 7.0 en s'appuyant sur les installateurs de packages comme autant que possible. Je suis actuellement en train de regarder beaucoup d'instructions vagues et mal expliquées et je m'inquiète de faufiler mon environnement de production avec de mauvaises décisions.

De plus, quelqu'un devrait ajouter mpm-event comme option de balise. C'est ce que les gars de #Apache IRC recommandés.

11
S. Imp

ezra-s suggère une bonne approche mais elle n'inclut pas certains détails qui pourraient être déroutants pour les gens qui comptent sur les gestionnaires de paquets. [~ # ~] note [~ # ~] : Je ne sais pas si ces étapes sont exactes. Si quelqu'un rencontre des problèmes ou voit des problèmes, faites-le moi savoir et je mettrai à jour ce message.

Tout d'abord, au moment de la rédaction de ce document, les packages Apache2 d'Ubuntu insistent sur le préfork si vous souhaitez installer PHP. Ne désespérez pas, cependant, car vous pouvez toujours utiliser des programmes d'installation de packages pour installer et mettre à jour PHP et Apache2 et toujours faire fonctionner votre configuration avec Apache dans mode événement utilisant PHP-FPM comme recommandé par le wiki Apache et décrit plus en détail dans Haute performance PHP sur Apache httpd 2.4.x en utilisant mod_proxy_fcgi et php-fpm . L'idée de base est qu'Apache2 et PHP-FPM communiquent via socket plutôt que PHP fonctionnant en tant que module Apache.

1) Supprimez ou désactivez le module Apache PHP

Parce que les packages Ubuntu insistent sur la préfork Apache lors de l'installation de PHP, nous devons les séparer. J'ai fait cela en utilisant apt pour désinstaller libapache2-mod-php7.0 car je n'ai plus besoin du paquet:

Sudo apt-get remove libapache2-mod-php7.0

Alternativement, vous pouvez désactiver le module Apache php7.0 à la place, mais cela ne supprimera pas le package apt de votre système, ce qui laissera la corruption du système ennuyeuse.

Sudo a2dismod php7.0

2) Basculez Apache en mode événement et activez fcgid

Je crois que ces commandes devraient faire l'affaire:

Sudo a2dismod mpm_prefork
Sudo a2enmod mpm_event
Sudo a2enmod proxy_fcgi

3) Installez PHP-FPM

J'ai déjà PHP 7 installé avec ses différents modules, donc je viens d'installer PHP-FPM avec cette commande:

Sudo apt-get install php7.0-fpm

4) Modifiez votre configuration VirtualHost pour gérer les fichiers PHP avec PHP-FPM:

Dans mon cas, j'ai modifié l'hôte SSL par défaut, /etc/Apache2/sites-available/default-ssl.conf , et ajouté cette ligne juste à côté haut:

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

[~ # ~] important [~ # ~] Cela demande à Apache de gérer les requêtes de fichier PHP avec PHP-FPRM et le chemin d'accès dans cette directive (/run/php/php7.0-fpm.sock ) doit correspondre au chemin spécifié par le directive listen dans le fichier /etc/php/7.0/fpm/pool.d/www.conf

5) Redémarrez Apache

Sudo service Apache2 restart

Pour vérifier si le mode événement est activé, utilisez cette commande:

Sudo apachectl -V

Dans la sortie, vous devriez voir ceci:

Server MPM:     event

Essayez de créer une page phpinfo et d'y accéder dans votre navigateur. Vous devriez voir Server API: FPM/FastCGI Dans la sortie.

14
S. Imp

Les discothèques proposent la méthode "mod_php" pour plus de commodité.

Alors que le moyen le plus performant est Apache w/event + mod_proxy_fcgi -> php-fpm.

Peut-être devraient-ils évoluer avec le temps, mais c'est difficile pour eux quand tant de frameworks sont livrés avec des configurations .htaccess mod_php dans une sorte de mode "plug & play". À la fin, c'est l'administrateur qui est le seul responsable de l'administration et de la configuration de leur site correctement.

Si vous êtes en production, je vous suggère d'utiliser un serveur de test pour pratiquer la mise à niveau et les modifications.

À propos du wiki, je préfère ou vous suggérerais la méthode du "gestionnaire". https://wiki.Apache.org/httpd/PHP-FPM#Proxy_via_handler .

Autrement dit, configurez php-fpm pour avoir un socket prêt et avec suffisamment d'autorisations pour que l'utilisateur Apache puisse lui envoyer des requêtes et configurer Apache pour l'utiliser.

Un exemple rapide:

# needed modules for reverse proxying to php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


<Virtualhost *:443>
    ServerName whatever.example.com
    #other typical directives here
    <Directory /var/www/php-app>
        <FilesMatch \.php>
            SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
        <FilesMatch>
    </Directory>
</VirtualHost>

Éditer:

De cette façon, peu importe la version PHP que vous utilisez car Apache s'en fiche, il inversera simplement le proxy des requêtes appropriées vers php-fpm.

N'oubliez pas non plus de décharger mod_php pour pouvoir utiliser mpm_event.

Modifier 2:

Selon la demande, vous n'avez pas besoin de désinstaller les paquets mod_php de debian/ubuntu, Apache ne se soucie que de sa configuration, donc le déchargement du module fera l'affaire.

6
ezra-s