1) Eliminar o deshabilitar el módulo PHP de Apache

1) Eliminar o deshabilitar el módulo PHP de Apache

Apache estaba funcionando con lentitud en producción. Después de buscar respuestas durante algún tiempo, finalmente fui al canal IRC #apache y los profesionales me pidieron que verificara el modo apache con este comando:

sudo apachectl -V

y se alarmaron al descubrir queServidor MPMesprehorquilla. Dijeron enfáticamenteNO UTILICE PREFORK EN UN SERVIDOR DE PRODUCCIÓN.Resulta que los paquetes de Ubuntu (¿presumiblemente heredados de Debian?) insisten en ejecutar Apache en modo prefork a pesar de que elmétodo recomendado para ejecutar PHP con Apacherecomienda claramente proxy_fcgi y php-fpm, luego fcgid y finalmente dice que no debes usar prefork:

Por qué ya no deberías usar mod_php con el mpm prefork

  • mod_php se carga en cada proceso httpd todo el tiempo. Incluso cuando httpd ofrece contenido estático/que no es PHP, esa memoria está en uso.
  • mod_php no es seguro para subprocesos y te obliga a seguir con el mpm previo al fork (multiproceso, sin subprocesos), que es la configuración más lenta posible.

Esa página también contiene algunosdetalle sobre PHP-FPMpero esto parece un poco elaborado y confuso y parece implicar mucha configuración manual. Estoy decepcionado y sorprendido que Ubuntu 16 no tenga una opción de paquete para el modo fastCGI o algo así.

Intenté cambiar Apache amodo de eventousando a2enmod y cuando intenté reiniciar Apache, recibí un error:

Apache está ejecutando un MPM con subprocesos, pero su módulo PHP no está compilado para ser seguro para subprocesos. Necesitas recompilar PHP

En cualquier caso, me preguntaba si alguien tenía algunas instrucciones mínimas paso a paso para ejecutar el modo fastCGI en Ubuntu 16 con PHP 7.0.confiando en los instaladores de paquetes tanto como sea posible.Actualmente estoy viendo muchas instrucciones vagas y mal explicadas y me preocupa arruinar mi entorno de producción con malas decisiones.

Además, alguien debería agregar mpm-event como opción de etiqueta. Eso es lo que recomendaron los chicos de #apache IRC.

Respuesta1

ezra-ssugiere un buen enfoque, pero no incluye algunos detalles que pueden resultar confusos para las personas que dependen de los administradores de paquetes.NOTA: No estoy seguro de si estos pasos son exactos. Si alguien tiene problemas o ve problemas, hágamelo saber y actualizaré esta publicación.

En primer lugar, al momento de escribir este artículo, los paquetes apache2 de Ubuntu insisten en prefork si desea instalar PHP. Sin embargo, no se desespere, porque aún puede usar instaladores de paquetes para instalar y actualizar PHP.yapache2 y aún así conseguir que su configuración funcione con Apache eneventomodo usando PHP-FPM comorecomendado por la wiki de Apachey se describe con más detalle enPHP de alto rendimiento en Apache httpd 2.4.x usando mod_proxy_fcgi y php-fpm. La idea básica es que apache2 y PHP-FPM se comuniquen a través de un socket en lugar de que PHP se ejecute como un módulo de Apache.

1) Eliminar o deshabilitar el módulo PHP de Apache

Debido a que los paquetes de Ubuntu insisten en prefork Apache al instalar PHP, tenemos que separarlos. Hice esto usando apt para desinstalar libapache2-mod-php7.0 porque ya no necesito el paquete:

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

Alternativamente, puede desactivar el módulo Apache php7.0, pero esto no eliminará el paquete apt de su sistema, lo que deja molestos problemas en el sistema.

sudo a2dismod php7.0

2) Cambie Apache al modo de evento y habilite fcgid

Creo que estos comandos deberían funcionar:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) Instalar PHP-FPM

Ya tengo instalado PHP 7 con sus diversos módulos, así que simplemente instalo PHP-FPM con este comando:

sudo apt-get install php7.0-fpm

4) Edite su configuración de VirtualHost para manejar archivos PHP con PHP-FPM:

En mi caso, edité el host SSL predeterminado,/etc/apache2/sites-available/default-ssl.confy agregó esta línea justo cerca de la parte superior:

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

IMPORTANTEEsto le indica a Apache que maneje las solicitudes de archivos PHP con PHP-FPRM y la ruta en esta directiva (/run/php/php7.0-fpm.sock) debe coincidir con la ruta especificada por elescuchardirectiva en el archivo/etc/php/7.0/fpm/pool.d/www.conf

5) Reiniciar Apache

sudo service apache2 restart

Para verificar si el modo de evento está habilitado, use este comando:

sudo apachectl -V

En el resultado, deberías ver esto:

Server MPM:     event

Intente crear una página phpinfo y acceder a ella en su navegador. Deberías verlo Server API: FPM/FastCGIen la salida.

Respuesta2

Las distribuciones ofrecen el método "mod_php" para mayor comodidad.

Mientras que la forma más eficaz es apache w/event + mod_proxy_fcgi -> php-fpm.

Quizás deberían actualizarse con los tiempos, pero les resulta difícil cuando tantos marcos vienen con configuraciones .htaccess mod_php en una especie de estilo "plug & play". Al final, es el administrador el único responsable de administrar y configurar su sitio correctamente.

Si está en producción, le sugiero que utilice un servidor de prueba para practicar la actualización y los cambios.

Acerca de la wiki prefiero o te sugeriría el método "handler". https://wiki.apache.org/httpd/PHP-FPM#Proxy_via_handler.

Es decir, configurar php-fpm para tener un socket listo y con permisos suficientes para que el usuario de Apache le envíe solicitudes y configurar Apache para usarlo.

Un ejemplo rápido:

# 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>

Editar:

De esta manera, no importa qué versión de PHP utilice porque a Apache no le importa, simplemente invertirá el proxy de las solicitudes apropiadas a php-fpm.

Además, no olvides descargar mod_php para poder usar mpm_event.

Edición 2:

Según la solicitud, no necesita desinstalar los paquetes mod_php de Debian/ubuntu, Apache solo se preocupa por su configuración, por lo que descargar el módulo será suficiente.

información relacionada