cambie apache de prefork a evento en Ubuntu 16, haga que php 7 funcione

11

Apache se estaba ejecutando lentamente en la producción. Después de buscar respuestas durante un tiempo, finalmente fui al canal #apache IRC y los profesionales me hicieron verificar el modo apache con este comando:

sudo apachectl -V

y se alarmó al descubrir que Server MPM es prefork . Dijeron enfáticamente que NO USE PREFORK EN UN SERVIDOR DE PRODUCCIÓN. Como resultado, los paquetes de Ubuntu (¿presumiblemente heredados de Debian?) Insisten en ejecutar apache en modo prefork a pesar de que el método recomendado para ejecutar PHP con Apache recomienda claramente proxy_fcgi y php-fpm, luego fcgid y finalmente dice que no debería usar prefork:

¿Por qué no deberías usar mod_php con prefork mpm?

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

Esa página también contiene algunos detalles sobre PHP-FPM, pero esto parece un poco elaborado y poco claro y parece implicar una gran cantidad de configuración manual. Estoy decepcionado y sorprendido de que Ubuntu 16 no tenga una opción de paquete para el modo fastCGI o algo así.

Intenté cambiar apache al modo de evento usando a2enmod y cuando intenté disparar apache nuevamente, recibí un error:

Apache está ejecutando un MPM roscado, 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 que el modo FastCGI se ejecute en Ubuntu 16 con PHP 7.0 confiando lo más posible en los instaladores de paquetes. 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 una opción de etiqueta. Eso es lo que recomendaron los chicos de #apache IRC.

S. Imp
fuente
Ese último error se debe a que cambiaste a evento, pero aún estás usando mod_php. Deshabilite mod_php y cambie a php-fpm y desaparecerá. ¿Y puedo recomendar nginx?
Michael Hampton
@MichaelHampton el título debería mencionar PHP. No es difícil cambiar apache a evento. Es difícil cambiar apache a evento Y hacer que php 7 funcione.
S. Imp
1
@MichaelHampton seguramente te das cuenta de que estoy confundido acerca de cómo "desactivar mod_php y cambiar a php-fpm". ¿No es esa la pregunta que hago en mi publicación? Además, la pregunta no es sobre nginx, que presenta otro ámbito de aprendizaje. Cambiar a nginx no es práctico para este proyecto porque estoy trabajando con un equipo.
S. Imp
No mencioné cómo deshabilitar los módulos de Apache porque demostraste que ya sabes cómo hacerlo. En cuanto a habilitar php-fpm, vea las respuestas a esta pregunta, tutoriales en línea, etc.
Michael Hampton

Respuestas:

15

ezra-s sugiere un buen enfoque, pero no incluye algunos detalles que pueden ser confusos para las personas que confían en los administradores de paquetes. NOTA : No estoy seguro si estos pasos son exactos. Si alguien encuentra problemas o ve problemas, avíseme y actualizaré esta publicación.

En primer lugar, al momento de escribir esto, 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 y apache2 y aún así hacer que su configuración funcione con Apache en modo evento usando PHP-FPM como lo recomienda el wiki de Apache y se describe con más detalle en High- PHP de 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 comunican 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 Apache PHP

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

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

Alternativamente, puede deshabilitar el módulo php7.0 Apache en su lugar, pero esto no eliminará el paquete apt de su sistema, lo que deja atrás el molesto sistema.

sudo a2dismod php7.0

2) Cambie Apache al modo de evento y habilite fcgid

Creo que estos comandos deberían hacer el truco:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) Instalar PHP-FPM

Ya tengo PHP 7 instalado con sus diversos módulos, así que solo 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.conf , y agregué esta línea cerca de la parte superior:

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

IMPORTANTE Esto 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 la directiva listen 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 la salida, debería ver esto:

Server MPM:     event

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

S. Imp
fuente
55
Sugiero no usar ProxyPassMatch, porque no permitirá usar .htaccess en el directorio. Use esto en su lugar: <FilesMatch \ .php $> SetHandler "proxy: unix: /run/php/php7.0-fpm.sock | fcgi: // localhost /" </FilesMatch>
waza123
¿Qué sucederá si no toco este archivo a diferencia de lo que me dijo que hiciera: /etc/apache2/sites-available/default-ssl.conf,? Los míos https y http funcionan bien
usuario5858
Seguí la respuesta a excepción de ProxyPassMatch, agregué la línea Filesmatch del comentario de @ waza123 a la parte superior de 000-default.conf y reinicié apache2 y todo funciona perfectamente. Gracias a ambos, mi pequeño VPS está ahorrando una TONELADA de memoria y CPU sobre mpm_prefork 🥳
dw1
No tuve que hacer ProxyPass o editar archivos con Ubuntu Server 19.10. Después del paso 3 (instalación de PHP-FPM), acabo de hacerlo a2enconf /etc/apache2/conf-available/php7.3-fpm.conf; systemctl reload apachey cuando creé un archivo phpinfo.php con el <?php phpinfo();interior, la línea API del servidor dice FPM / FastCGI. Por cierto, instalé php7.3 porque en el momento de escribir esta publicación, al menos uno debería estar en esa versión, si no es superior, y los repositorios aptos de Ubuntu para Ubuntu Server 19.10 actualmente suben a php7.3.
ServerChecker
6

Las distribuciones ofrecen el método "mod_php" por conveniencia.

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

Tal vez deberían actualizarse con los tiempos, pero es difícil para ellos cuando tantos marcos vienen con configuraciones .htaccess mod_php en una especie de "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 use un servidor de prueba para practicar la actualización y los cambios.

Sobre el wiki prefiero o sugeriría el método "manejador". https://wiki.apache.org/httpd/PHP-FPM#Proxy_via_handler .

Es decir, configure php-fpm para que tenga un socket listo y con permisos suficientes para que el usuario de Apache le envíe solicitudes y configure 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 use porque a Apache no le importa, simplemente revertirá 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.

ezra-s
fuente
Gracias por su respuesta. He estado haciendo muchas pruebas y errores y este es el enfoque que parece estar funcionando actualmente. El proceso real es un poco más complicado porque tienes que obtener apache de prefork a evento, desinstalar libapache2-mod-php7.0, etc. Espero formular una respuesta más completa aquí en un momento.
S. Imp
no es necesario "desinstalar" desde el punto de vista apache httpd, solo descargue el módulo. Lo mismo con event / prefork, los mpm también son módulos en 2.4, por lo que uno descarga prefork y carga el evento.
ezra-s
ok, entonces quizás no tenga que desinstalar el paquete, pero al menos tiene que deshabilitar el módulo php para apache, y me preocupa que una actualización de apt-get rompa la configuración. Estos detalles faltan en su respuesta. Me encantaría que los agregue porque no estoy especialmente seguro de mi capacidad para aclarar los detalles de lo que hice exactamente.
S. Imp
Quizás los asumí, a Apache tampoco le importan los paquetes de Debian, solo su configuración funcional.
ezra-s
Apache se preocupará si una actualización del paquete apt cambia su configuración, que es un problema que encontré en un momento. En el espíritu de mi publicación original, me gustaría proporcionar instrucciones detalladas para otros que confían en los instaladores de paquetes (y actualizaciones) como lo hago yo.
S. Imp