Introducción

Buenas, en este post vamos a comparar el rendimiento de distintas configuraciones de servidores web sirviendo páginas dinámicas programadas con PHP, en concreto vamos a servir un CMS Wordpress.

Las configuraciones que vamos a realizar son las siguientes:

  • Módulo php5-apache2
  • PHP-FPM (socket unix) + apache2
  • PHP-FPM (socket TCP) + apache2
  • PHP-FPM (socket unix) + nginx
  • PHP-FPM (socket TCP) + nginx

Para cada una de las configuraciones hemos hecho pruebas de rendimiento con el comando ab, por ejemplo durante 10 segundos , hemos hecho peticiones con 200 concurrentes:

ab -t 10 -c 200 -k http://172.22.x.x/wordpress/index.php

Después de hacer muchas pruebas de rendimiento con un número variable de peticiones concurrentes (1, 10, 25, 50, 75, 100, 250, 500, 1000) y distintas direcciones del wordpress. Los resultados obtenidos son los siguientes:

php1

Podemos determinar que la opción que nos ofrece más rendimiento es nginx + fpm_php (socket unix). Cuyo resultado es aproximadamente unas 600 peticiones/segundo (parámetro Requests per second de ab).

A partir de esa configuración vamos a intentar aumentar el rendimiento de nuestro servidor.

Preparamos máquina

Hemos ejecutado una instancia en OpenStack y le hemos cambiado el fichero host en nuestra receta de ansible ya configurada para que instale por defecto la configuración elegida:

nano host

[servidores_web]
nodo1 ansible_ssh_host=172.22.201.20 ansible_python_interpreter=/usr/bin/python3

Ejecutamos la receta:

ansible-playbook site.yaml

Y accedemos y terminamos de instalar WordPress:

1

2

Pruebas de rendimiento con comando ab

Instalamos primero el comando ab:

sudo apt install apache2-utils

Después de cada prueba ejecutaremos la siguiente instrucción:

sudo systemctl restart nginx
sudo systemctl restart php7.3-fpm.service

50 peticiones concurrentes

ab -t 10 -c 50 -k http://127.0.0.1/wordpress/index.php
...
Requests per second:    31.79 [#/sec] (mean)
...

100 peticiones concurrentes

ab -t 10 -c 100 -k http://127.0.0.1/wordpress/index.php
...
Requests per second:    28.87 [#/sec] (mean)
...

250 peticiones concurrentes

ab -t 10 -c 250 -k http://127.0.0.1/wordpress/index.php
...
Requests per second:    2663.01 [#/sec] (mean)
...

500 peticiones concurrentes

ab -t 10 -c 500 -k http://127.0.0.1/wordpress/index.php
...
Requests per second:    3455.01 [#/sec] (mean)
...

Instalación y configuración varnish

Instalamos varnish:

sudo apt install varnish

Abrimos el archivo de configuración:

sudo nano /etc/default/varnish

Y editamos el demonio para que escuche las peticiones que llegan al puerto 80 desde el exterior:

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

También tendremos que hacer que Varnish arranque en el puerto 80, para ello editamos la unidad de systemd:

sudo nano /lib/systemd/system/varnish.service

Y cambiamos la siguiente línea:

ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m

Ya que hemos configurado varnish para que escuche en el puerto 80, esté tendrá que enviar las peticiones al servidor web, el cuál lo vamos a poner en el puerto 8080, para ello, primero editamos el fichero de varnish que dice dónde estará el servidor web:

sudo nano /etc/varnish/default.vcl

Y editamos:

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

Configuración nginx

Vamos a configurar a nginx para que escuche en el puerto 8080, para ello abrimos el fichero de configuración:

sudo nano /etc/nginx/sites-available/default

Y editamos las siguientes líneas:

server {
        listen 8080 default_server;
        listen [::]:8080 default_server;

Podemos comprobar efectivamente que se está ejecutando el wordpress correctamente:

3

Comprobaciones

Reiniciamos los servicios:

sudo systemctl daemon-reload
sudo systemctl restart varnish
sudo systemctl restart nginx

Y hacemos las mismas pruebas que antes acordándonos de reiniciar los servicios de nginx y php como hicimos anteriormente:

50 peticiones concurrentes

ab -t 10 -c 50 -k http://127.0.0.1/wordpress/index.php
...
Requests per second:    9357.43 [#/sec] (mean)
...

100 peticiones concurrentes

ab -t 10 -c 100 -k http://127.0.0.1/wordpress/index.php
...
Requests per second:    10991.40 [#/sec] (mean)
...

250 peticiones concurrentes

ab -t 10 -c 250 -k http://127.0.0.1/wordpress/index.php
...
Requests per second:    11608.69 [#/sec] (mean)
...

500 peticiones concurrentes

ab -t 10 -c 500 -k http://127.0.0.1/wordpress/index.php
...
Requests per second:    11208.79 [#/sec] (mean)
...

Si hacemos varias peticiones al servidor, sólo se mostrará una, ya que varnish hace también de servidor caché:

less /var/log/nginx/access.log

127.0.0.1 - - [13/Feb/2021:09:28:06 +0000] "GET /wordpress HTTP/1.0" 301 185 "-" "ApacheBench/2.3"