Mejorando el rendimiento de WordPress con Apache 2 y PHP-FPM

PHP-FPM (Fast CGI Process Manager) es un producto  que permite integrarse con Apache 2 para atender diferentes peticiones PHP de manera simultánea para mejorar el rendimiento y la carga de la página WEB, lo que se traduce en menores tiempos de carga y muchas más peticiones concurrentes en el mismo servidor WEB.

Una de las características de PHP-FPM que mejora la velocidad de carga es la reutilización del código PHP almacenado en memoria caché. Es decir, en vez de interpretar el código PHP cada vez, lo interpreta la primera vez y el resto de las veces lo reutiliza, evitando nuevos cálculos de CPU.

Lo he probado en puerto53.com y he notado una mejora notable en la carga de este blog.

La instalación es muy sencilla.

En Linux CentOs 7, instalamos PHP-FPM así:

yum install -y php72w-fpm
systemctl enable php-fpm

Seguidamente, editamos fichero /etc/php-fpm.d/www.conf y modificamos las siguientes directivas:

;dominio de la URL
[puerto53.com]

;usuario de sistema operativo que arranca Apache
user = puerto53

;grupo al que pertenece el usuario
group = puerto53
;La IP y el puerto por donde va a escuchar el servicio de PHP-FPM
listen = 127.0.0.1:9000
;El usuario del sistema operativo propietario del servicio
listen.owner = puerto53

Ejemplo de configuración de este fichero:

[[email protected] ~]# cat /etc/php-fpm.d/www.conf |grep -v ^$ |grep -v ";"
[puerto53.com]
user = puerto53
group = puerto53
listen = 127.0.0.1:9000
listen.owner = puerto53
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 12
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 10
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache
[[email protected] ~]#

Arrancamos el servicio de PHP-FPM con el comando systemctl start php-fpm y comprobamos que el puerto 9000 ya está escuchando al estar el servicio arrancado:

[[email protected] ~]# lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 3162 root 6u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 3163 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 3164 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 3165 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 3166 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 3167 puerto53 3u IPv4 435157 0t0 TCP localhost:cslistener->localhost:52054 (ESTABLISHED)
php-fpm 3167 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
httpd 7494 puerto53 15u IPv4 436554 0t0 TCP localhost:52054->localhost:cslistener (ESTABLISHED)
php-fpm 7514 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 7528 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 7550 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 7634 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 7638 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 21240 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 21246 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 21270 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 21275 puerto53 8u IPv4 361759 0t0 TCP localhost:cslistener (LISTEN)
[[email protected] ~]#

Por último, configuramos Apache. Simplemente hay que añadir las siguientes directiva:

# php-fpm
SetEnv proxy-nokeepalive 1
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/app/puerto53/html/$1 timeout=600
ProxyTimeout 600
</IfModule>
# php-fpm Fin

El módulo de Apache proxy_module, debe estar habilitado.

Reiniciamos Apache y ya tenemos PHP-FPM funcionando.

Cálculo correcto del parámetro pm.max_children de PHP-FPM para un rendimiento óptimo

Lo primero que tenemos que saber es cuánta memoria consume nuestra aplicación. Lo averiguaremos con el comando:

ps -ylC php-fpm --sort:rss

En este caso vemos en la columna RSS que cada proceso de aplicación ocupa unos 90MB, aproximadamente.

A continuación, revisamos cuánta memoria libre tenemos en nuestra maquina si paramos PHP-FPM. Lo veremos con el comando:

 free -m

En este caso tenemos 1GB totalmente libre y unos 550MB de buffer caché que se pueden considerar como libres.

Pero no queremos agotar toda la memoria del servidor, así que decidimos que, como máximo, el servicio PHP-FPM utilice 1100MB de memoria. Por lo tanto:

pm.max_children: 1100 / 92 = 11,9

El parámetro pm.max_children lo configuraremos con un valor de 12.

No olvides aplicar también las siguientes mejoras de rendimiento

¿Te ha gustado? ¡Compártelo!

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on email

Deja un comentario

Tal vez también te gustaría leer...

¿Qué es y cómo funciona Linkedin?

Linkedin es la mejor red social de empleo que existe en el mundo y la más utilizada por profesionales que buscan empleo y por aquellas empresas que necesitan contratar trabajadores. Su éxito global ha sido tal que, incluso las empresas tradicionales de búsqueda de empleo como las empresas de trabajo temporal (ETTs), consultorías y empresas

Leer más »

Averiguar las tecnologías con las que está construida una WEB

Los que somos administradores de páginas WEB, muchas veces nos fijamos en detalles de otos sitios que visitamos y nos interesa saber cómo están construidas. Por ejemplo, qué CMS está utilizando, qué tema de WordPress estamos viendo, con qué plugins, qué servidor WEB, etc. David Martínez Perales Administrador de Linux, WordPress y SEO Linkedin

Leer más »

Cambiar el nombre y la URL de tu página empresarial en Facebook

Cuando creé este blog también hice una página en Facebook a donde enviaba y sigo enviando todos los artículos que publico. De esta manera, doy más visibilidad al blog y los visitantes pueden interactuar desde la red social para su mayor comodidad. Sin embargo, la primera vez que creas la página, Facebook le da un

Leer más »

Pruebas de estrés con Apache Bench o «ab»

Antes de publicar una página WEB al gran público, es conveniente hacer pruebas de estrés de los servidores WEB, revisar el rendimiento del Garbage Collector de Java (si la aplicación está hecha en Java) y de la base de datos, para saber si los usuarios van a experimentar problemas de lentitud o no cuando pongamos

Leer más »

Configuración de Bloques en NGINX

El concepto de bloque en NGINX es similar al de VirtualHost en Apache. Sin embargo, vamos a crear un fichero de configuración diferente para cada URL distinta que va a servir el Webserver por la misma IP y puerto. David Martínez Perales Administrador de Linux, WordPress y SEO Linkedin

Leer más »

¿Qué es y cómo funciona un certificado SSL?

Un certificado SSL es un componente de seguridad en una página WEB que autentifica que esa página es de quien dice ser y, además, encripta todo el tráfico. El cifrado se realiza mediante un sistema de clave pública y privada y es imprescindible para proteger datos sensibles del tráfico de una página WEB ante la

Leer más »