Vamos a comparar el uso de memoria y el rendimiento de Apache2 sirviendo páginas dinámicas programadas con PHP, en concreto vamos a servir una CMS WordPress.

Podemos ver la instalacion de apache mas detallada en http://www.juanluramirez.com/servidor-web/

Por defecto PHP y WordPress tienen una limitación del uso de memoria que puede falsear los resultados que podemos obtener, por lo tanto es muy importante que cambiemos estos limítes. Podemos poner el valor por defecto de uso de memoria en 256 Mb, incluso aumentarlo si vemos que es necesario. Puede seguir este enlace para realizar la operación, teniendo en cuenta que el fichero de configuración de PHP es distinto según el método de ejecución que estemos usando: módulo php de apache2, o FPM.

Multiprocesamiento tipo Prefork (mpm-prefork).

Este Módulo de MultiProcesamiento (MPM) implementa un servidor web pre-forking y no hebrado que trata las peticiones de una manera similar a como lo hacía Apache 1.3. Esto es apropiado para sitios web que necesitan evitar el hebrado para ser compatibles con librerías que no son seguras cuado se usan hebras. Es también el mejor MPM para aislar cada petición, de manera que si suge un problema con una petición, esto no afecte al resto.

Multiprocesamiento tipo Worker (mpm-worker).

Es un módulo MPM que pretende mejorar el rendimiento frente a MPM Prefork y de hecho lo consigue. Este módulo usa procesos y al mismo tiempo hace uso de threads (también llamados hilos), es decir, combina las técnicas de forking y threading. Al iniciar Apache Worker se crean varios procesos hijo y a su vez cada proceso hijo emplea varios threads. Con esto se consigue que cada proceso hijo pueda manejar varias peticiones simultaneas gracias a los threads.

Multiprocesamiento tipo Event (mpm-event).

MPM Event hasta hace poco era considerado como experimental pero hoy en día ya es una opción estable. Es una mejora de MPM Worker y soluciona un problema de optimización que mostraba MPM Worker con la opción Keep Alive de Apache. No quiero entrar en una explicación detallada sobre el problema de optimización y confundiros con datos técnicos, por lo que seré breve y diré que MPM Event mejora el rendimiento de Apache durante las peticiones con Keep Alive, que son muy comunes.

Configuración escenario

Primero instalamos mysql-server y apache2 apt install mysql-server apache2, para comprobar el rendimiento.

Instalación del módulo php de apache2.

Una vez ya tenemos instalado apache2 podremos comprobar que por defecto la version «2.4» se define como Server MPM: event

Para poder utilizar «WordPress» debemos instalar el modulo de «php5» y «php5-mysql» para apache2, para ello instalamos el php5, el cual por defecto instala el modulo necesario apt install php5 php5-mysql

En el proceso de instalación podemos comprobar que desactiva el modulo de «event» y activa «prefork»

Module mpm_event disabled.
Enabling module mpm_prefork.
apache2_switch_mpm Switch to prefork

Descomprimimos el WordPress descargado y accedemos a través de la ip por el navegador:

Para comprobrar que estamos utilizando el modulo «php5» de apache creamos el siguiente script para comprobarlo:

<?php

// Show all information, defaults to INFO_ALL
phpinfo();

?>

Instalación y configuración de memcached


Memcached es una herramienta desarrollada por la empresa Danga Interactive, que mantiene el proyecto bajo licencia BSD y que fue pensado para incrementar la velocidad de aplicaciones web dinámicas, reduciendo la carga de la base de datos.

Una vez que tengamos actualizado el repositorio apt update, empezaremos la instalación de Memcached apt install memcached

También deberemos instalar php-pear y ph5-dev apt install php-pear php5-dev php5-memcached

A continuación editaremos el fichero /etc/memcached.conf y modificaremos esta esta fila:

# memory
-m 64

Por esta:

# memory
-m 256

Instalamos la extensión de php para memcached pecl install memcache y
reiniciamos el servicio /etc/init.d/memcached restart

Y comprobamos su funcionamiento php -i | grep memcached

Instalación y configuración de varnish


Instalar Varnish en tu servidor Linux es muy similar a instalar otras aplicaciones o paquetes. Simplemente utiliza el gestor de paquetes de tu distribución para instalarlo. En el caso de Debian, puedes hacerlo ejecutando apt-get install varnish

Antes de empezar a configurar hay que tener en cuenta que el puerto por defecto para las peticiones http es el 80, y es el puerto que tenemos configurado el servidor web, por lo tanto si queremos que Varnish escuche las peticiones tendremos que configurar que escuche en el puerto 80, y nuestro servidor web lo moveremos a otro puerto que no utilice ningún servicio.

El primer paso es editar el archivo de configuración de Varnish /etc/varnish/default y dejamos la configuración de la opción «backend default» de la siguiente manera:

backend default {
     .host = "127.0.0.1"; #Es la ip donde tiene que buscar el servidor web
     .port = "8080"; #Es el puerto que esta escuchando el servidor web
     .connect_timeout = 600s; #Los segundos antes de que de timeout
}

Luego actualizamos el archivo varnish /etc/default/varnish y sustituimos esto:

DAEMON_OPTS="-a :6081 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

Por esto:

DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

Al estar haciendo una instalación sobre Debian Jessie, este usa systemd, por lo tanto debemos configurar /etc/systemd/system/varnish.service fichero de configuración que obtenemos de cp /lib/systemd/system/varnish.service /etc/systemd/system/

Una vez copiado el fichero, vamos a crear un nuevo fichero de configuración en /etc/systemd/system/varnish.service.d, para ello creamos el directorio varnish.service.d y una vez creado el directorio creamos el fichero customexec.conf con lo siguiente:

[Service]
ExecStart=
ExecStart=/usr/sbin/varnishd -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m

Una vez guardado los cambios tenemos que cambiar la configuración del puerto del servidor web, en el caso de Apache lo hacemos de la siguiente manera modificamos el fichero /etc/apache2/sites-available/000-default.conf y sustituimos esta linea:

Por esta:

Y en la configuración del servidor web Apache /etc/apache2/ports.conf donde cambiamos esta linea:

Listen 80

Por:

NameVirtualHost *:8080
Listen 0.0.0.0:8080

Únicamente nos queda agregar el módulo de apache rpaf para que Apache reciba correctamente la IP de usuario y no la IP local apt-get install libapache2-mod-rpaf.

Reiniciamos apache /etc/init.d/apache2 restart y el daemon systemctl daemon-reload y varnish systemctl restart varnish.service

Instalación y configuración de FPM-PHP con el módulo de multiprocesamiento event

Primero desinstalamos memcached apt remove php5-memcached memcached libapache2-mod-php5 y varnish apt purge varnish

He instalamos los siguientes paquetes apt install php-pear php5-dev php5-mysql php5 php5-fpm libapache2-mod-fastcgi

Creamos el archivo de configuración de php5-fpm para apache 2.4 llamado /etc/apache2/conf-available/php5-fpm.conf y pegamos este codigo

<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
<Directory /usr/lib/cgi-bin>
    Require all granted
</Directory>

</IfModule>

Y ejecutamos lo siguientes comandos como root (#):

a2enmod actions fastcgi alias
a2enconf php5-fpm
# Si teneis mod_php activado usar este comando para desactivar
# a2dismod php5
service apache2 reload

Deshabilitamos el modulo de a2dismod mpm_prefork y habilitamos el modulo mpm_event y reiniciamos el servicio service apache2 restart

Ya tenemos nuestro servidor funcionando con el modulo mpm_event

Accedemos a nuestra ip para comprobar su funcionamiento con wordpress:

Y observamos que esta utilizando el fpm

Configuración de memcached y varnish con la nueva configuración

Para comprobar que memcached y varnish se encuentra funcionanando con la ultima configuracion realizada vamos a tener que instalar los dos paquetes tanto memcached y varnish, podremos observar que el modulo «MPM» seguira siendo event y estara funcionando memcached y varnish