passer apache de prefork en événement dans Ubuntu 16, faire fonctionner php 7

11

Apache fonctionnait lentement en production. Après avoir cherché des réponses pendant un certain temps, je suis finalement allé sur le canal IRC #apache 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 le serveur MPM est préfork . Ils ont catégoriquement déclaré NE PAS UTILISER PREFORK SUR UN SERVEUR DE PRODUCTION. En fait, les paquets Ubuntu (vraisemblablement hérités de Debian?) Insistent pour exécuter apache en mode préfork malgré le fait que la méthode recommandée pour exécuter PHP avec Apache recommande clairement proxy_fcgi et php-fpm, puis fcgid et finalement vous ne devriez pas utiliser la pré-fourche:

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 lorsque j'ai essayé de lancer apache back up, 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 autant que possible sur les installateurs de packages. Je regarde actuellement beaucoup d'instructions vagues et mal expliquées et je crains que mon environnement de production ne prenne de mauvaises décisions.

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

S. Imp
la source
Cette dernière erreur est due au fait que vous êtes passé à l'événement, mais que vous utilisez toujours mod_php. Désactivez mod_php et passez à php-fpm et cela disparaîtra. Et puis-je recommander nginx?
Michael Hampton
@MichaelHampton le titre doit mentionner PHP. Il n'est pas difficile de passer d'Apache à l'événement. Il est difficile de basculer apache en événement ET de faire fonctionner php 7.
S. Imp
1
@MichaelHampton vous vous rendez sûrement compte que je ne sais pas comment "désactiver mod_php et passer en php-fpm". N'est-ce pas la question que je pose dans mon message? De plus, la question ne concerne pas nginx, qui présente un autre domaine d'apprentissage. Passer à nginx n'est pas pratique pour ce projet car je travaille avec une équipe.
S. Imp
Je n'ai pas mentionné comment désactiver les modules Apache parce que vous avez démontré que vous savez déjà comment faire cela. Quant à l'activation de php-fpm, voir les réponses à cette question, les tutoriels en ligne, etc.
Michael Hampton

Réponses:

15

ezra-s suggère une bonne approche mais elle n'inclut pas certains détails qui pourraient être déroutants pour les personnes qui comptent sur les gestionnaires de paquets. REMARQUE : 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.

Premièrement, au moment d'écrire ces lignes, les paquets apache2 d'Ubuntu insistent sur la préfork si vous souhaitez installer PHP. Ne désespérez pas, cependant, car vous pouvez toujours utiliser les installateurs de packages pour installer et mettre à jour PHP et apache2 et toujours faire fonctionner votre configuration avec Apache en mode événement en utilisant PHP-FPM comme recommandé par le wiki Apache et décrit plus en détail dans High- 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) Supprimer ou désactiver le module PHP Apache

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 j'installe juste 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 j'ai ajouté cette ligne juste en haut:

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

IMPORTANT Ceci indique à Apache de gérer les demandes de fichiers PHP avec PHP-FPRM et le chemin dans cette directive ( /run/php/php7.0-fpm.sock ) doit correspondre au chemin spécifié par la 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/FastCGIdans la sortie.

S. Imp
la source
5
Je suggère de ne pas utiliser ProxyPassMatch, car il ne permettra pas d'utiliser .htaccess dans le répertoire. Utilisez ceci à la place: <FilesMatch \ .php $> SetHandler "proxy: unix: /run/php/php7.0-fpm.sock | fcgi: // localhost /" </FilesMatch>
waza123
Que se passera-t-il si je ne touche pas ce fichier contrairement à ce que vous avez dit de faire: /etc/apache2/sites-available/default-ssl.conf,? Mine https et http fonctionnent bien
user5858
J'ai suivi la réponse à l'exception de ProxyPassMatch, ajouté la ligne Filesmatch du commentaire de @ waza123 en haut de 000-default.conf et redémarré apache2 et tout fonctionne parfaitement. Merci à vous deux mon petit VPS enregistre une tonne de mémoire et de CPU sur mpm_prefork 🥳
dw1
Je n'ai pas eu à faire le ProxyPass ou l'édition de fichier avec Ubuntu Server 19.10. Après l'étape 3 (installation de PHP-FPM), je viens de le faire a2enconf /etc/apache2/conf-available/php7.3-fpm.conf; systemctl reload apacheet lorsque j'ai créé un fichier phpinfo.php avec l' <?php phpinfo();intérieur, la ligne API du serveur indique FPM / FastCGI. BTW, j'ai installé php7.3 car au moment de la rédaction de cet article, on devrait au moins être sur cette version, sinon supérieure, et les référentiels apt Ubuntu pour Ubuntu Server 19.10 vont jusqu'à php7.3 actuellement.
ServerChecker
6

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 les 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.

ezra-s
la source
Merci pour votre réponse. J'ai fait beaucoup d'essais et d'erreurs et c'est l'approche qui semble fonctionner actuellement. Le processus réel est un peu plus compliqué car vous devez obtenir apache de préfork à l'événement, désinstaller libapache2-mod-php7.0 etc. J'espère formuler une réponse plus complète ici dans un instant.
S. Imp
pas besoin de "désinstaller" du point de vue apache httpd, il suffit de décharger le module. Idem avec event / prefork, les mpm sont aussi des modules en 2.4, donc on décharge prefork et charge event.
ezra-s
ok alors peut-être que vous n'avez pas besoin de désinstaller le paquet, mais vous devez au moins désactiver le module php pour apache - et je m'inquiète d'une mise à niveau apt-get brisant la configuration. Ces détails manquent dans votre réponse. Je serais ravi que vous les ajoutiez, car je ne suis pas particulièrement confiant dans ma capacité à obtenir des détails sur ce que j'ai fait exactement.
S. Imp
Peut-être que je les ai supposés, Apache ne se soucie pas non plus des paquets Debian, juste de sa configuration fonctionnelle.
ezra-s
Apache se souciera si une mise à jour du package apt change sa configuration, ce qui est un problème que j'ai rencontré à un moment donné. Dans l'esprit de mon message d'origine, je voudrais fournir des instructions détaillées pour les autres qui s'appuient sur les installateurs de packages (et les mises à jour) comme moi.
S. Imp