La instalación del servidor para WordPress más rápido (2019)

Nuestros amigos de WPIntense han publicado ayer una nueva configuración de servidor para hacer que WordPress vuele.

Contenidos

Hoy la hemos probado y la verdad es que la velocidad es ASOMBROSA.

WPIntense son una empresa de WordPress enfocada a hacer sus instalaciones las más rápidas del planeta. Sus clientes sueñan con sitios web de WordPress rápidos, escalables y gigantescos. Y ellos hacen realidad esos sueños.

La verdad es que WPI nos sorprenden cada vez que trabajamos con ellos. Son gente que sabe de verdad de lo que está hablando.

La configuración de servidor perfecta para WordPress (2019)

Aunque este post se publicó por primera vez en 2018, hoy en día sigue vigente y sigue siendo la configuración de servidor perfecta para WordPress también en 2019.

Para conseguir un servidor optimizado para que WordPress funcione lo más rápido posible es usar:

  • Ubuntu 18.04: OJO no usar 18.10 que solo tiene soporte durante 9 meses, sino 18.04 que tiene soporte hasta 2023.
  • MySQL 8: El MySQL más rápido nunca lanzado.
  • Nginx: El servidor web más rápido.
  • PHP 7.3: El PHP más rápido disponible. En 2018 recomendábamos la versión 7.2 de PHP (última estable por entonces) y hoy recomendamos la 7.3 (última versión estable).
  • Redis: El caché de objetos y variantes más rápido disponible.
  • NGINX FastCGI Cache: El acelerador HTTP más rápido y que además es sencillo de usar.
  • Fail2Ban
  • Let’s Encrypt

Lo más sencillo para probarlo es usar DIGITAL OCEAN pero funciona en cualquier servidor que tenga Ubuntu 18.04.

Comandos para comenzar la instalación

wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb
dpkg -i mysql-apt-config_0.8.10-1_all.deb
apt-get update
apt-get upgrade
apt-get install mysql-server -y # accept all defaults
mysql_secure_installation # choose y for everything and enter a secure root password
apt-get -y install php7.2
apt-get purge apache2
apt-get install nginx
apt-get install -y tmux curl wget php7.2-fpm php7.2-cli php7.2-curl php7.2-gd php7.2-intl 
apt-get install -y php7.2-mysql php7.2-mbstring php7.2-zip php7.2-xml unzip
apt-get install -y redis
apt-get install -y fail2ban

Configurar Redis como un caché no persistente

No queremos que Redis escriba en el disco. Solo lo queremos usar como caché de objetos y variantes.

Editamos /etc/redis/redis.conf y añadimos las siguientes dos líneas al final:

vi /etc/redis/redis.conf

Y añadimos:

maxmemory 200mb
maxmemory-policy allkeys-lru

La primera línea (maxmemory) la podemos ajustar entre 200mb y 20000mb. Depende de la memoria disponible. En un servidor con 1GB usamos 100mb.

La segunda línea (maxmemory-police) fuerza el uso de first-in-first out en la eliminación de las claves antiguas.

Luego hay que buscar las líneas:

save 900 1
save 300 10
save 60 10000

Y comentarlas para evitar la escritura en disco:

#save 900 1
#save 300 10
#save 60 10000

Guardamos los datos (ESC :wq y apretamos ENTER). Y hacemos un restart de REDIS:

service redis-server restart

Configuración del dominio en el DNS

Antes de continuar debemos apuntar la entrada A del dominio al servidor y también la entrada A (o CNAME) de www.

Configuración de NGINX más rápida

WPINTENSE han subido los archivos de configuración a GITHUB porque son cientos de líneas. Esto permite servir la web en el puerto 80 (no SSL) para completar la instalación inicial de WordPress. Luego ya se puede configurar SSL con LetsEncrypt.

cd ~
git clone https://github.com/dhilditch/wpintense-rocket-stack-ubuntu18-wordpress
cp wpintense-rocket-stack-ubuntu18-wordpress/nginx/* /etc/nginx/ -R
ln -s /etc/nginx/sites-available/rocketstack.conf /etc/nginx/sites-enabled/
rm /etc/nginx/sites-enabled/default

Estos archivos contienen el archivo config y algunos fragmentos de código que hacen el sitio más rápido y seguro.

Estos archivos usan la libreria nginx_fastcgi_cache para la cual hay que crear una carpeta de caché:

mkdir /var/www/cache
chown www-data:www-data /var/www/cache/

Volvemos a arrancar NGINX:

service nginx restart

Podemos comprobar que la web ya se muestra accediendo al dominio. Nos saldrá un error 404 NOT FOUND de NGINX.

Instalamos WordPress

Primero creamos la base de datos:

mysql -u root -p

Y luego ejecutamos este SQL. Una línea después de la otra. OJO: Hay que reemplazar ‘CHOOSEASTRONGPASSWORD’ con una contraseña segura:

CREATE USER 'rs'@'localhost' IDENTIFIED BY 'CHOOSEASTRONGPASSWORD';
GRANT ALL PRIVILEGES ON rocketstack.* TO'rs'@'localhost';
EXIT;

Y podemos instalar WordPress con:

wget https://wordpress.org/latest.zip -P /var/www/
unzip /var/www/latest.zip -d /var/www/
mv /var/www/wordpress /var/www/rocketstack
chown www-data:www-data /var/www/rocketstack -R
rm /var/www/latest.zip

Ahora al volver a cargar el dominio ya aparece la pantalla de instalación de WordPress. Ahí introducimos el nombre de la base de datos, el nombre de usuario de la misma y su contraseña ‘CHOOSEASTRONGPASSWORD’.

Añadir SSL con Let’s Encrypt

Es simple con el siguiente script de NGINX:

git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
mkdir /var/www/acme/
chown www-data:www-data /var/www/acme

Ojo: Hay que cambiar ACME por el nombre del dominio que queremos proteger

/opt/letsencrypt/letsencrypt-auto certonly -a webroot –webroot-path=/var/www/acme/ -d yourdomain.com -d www.yourdomain.com

Y en este comando lo mismo: cambiarmos acme por la carpeta que hemos creado en el punto anterior y el nombre del dominio yourdomain.com y www.yourdomain.com por el dominio para el que estamos instalando esto.

Una vez ejectuado nos dice donde ha guardado el certificate chain («fullchain.pem») y el key file («privkey.pem»).

Editamos el archivo de configuración de NGINX:

vi /etc/nginx/sites-available/rocketstack.conf

Quitamos el comentario de las líneas:

#ssl_certificate
#ssl_certificate_key

Y añadimos la ruta a fullchain.pem y privkey.pem que hemos obtenido en el punto anterior.

Y guardarmos.

Finalmente para que el certificado se vaya actualizando mensualmente hay que ejecutar:

crontab -e

Y al final del archivo añadimos:

0 5 1 * * /opt/letsencrypt/letsencrypt-auto certonly -a webroot –webroot-path=/var/www/acme/ -d yourdomain.com -d www.yourdomain.com –renew-by-default

Le hacemos un restart al NGINX:

service nginx restart

Optimizamos MySQL

Editamos el archivo mysqld.cnf

vi /etc/mysql/mysql.conf.d/mysqld.cnf

Añadimos esto al final del archivo:

innodb_buffer_pool_size = 200M
innodb_buffer_pool_instances = 8
innodb_io_capacity = 5000

Y una vez que el servidor haya funcionado unos días con tráfico real podemos optimizar estos ajustes.

Optimizar los ajustes de MySQL después de haber recibido tráfico

Después de unos días ejecutamos lo siguiente:

cd ~
wget https://launchpadlibrarian.net/78745738/tuning-primer.sh
./tuning-primer.sh

Nos da información en rojo y verde sobre temas en los que hay que trabajar y en verde los que son ok.

Optimizar tu configuración PHP para WordPress

Optimizamos el archivo php.ini:

vi /etc/php/7.2/fpm/php.ini

Lo que hay que cambiar si o si son estos ajustes:

max_execution_time = 6000
memory_limit = 512M
upload_max_filesize = 50M

Y luego hay que editar el archivo www.conf

vi /etc/php/7.2/fpm/pool.d/www.conf

El mejor rendimiento lo conseguimos con:

pm = static

Una vez guardado el archivo modificado ejecutamos:

service php7.2-fpm restart

Configuramos fail2ban

Lo más sencillo para configurarlo completamente es usar el plugin de WordPress: WP fail2ban plugin.

Configuramos Redis

Ya hemos configurado REDIS para guardar la caché en RAM y no escribir en disco. Ahora solo falta usar el plugin adecuado: Redis Object Cache de Till Kruss y NO el plugin WP Redis (esto es importante).

¿ME hace falta un plugin de caché en WordPress?

No. NGINX FASTCGI CACHE se ocupa de todo eso y guarda la cache en /var/www/cache. Esto es mucho más rápido porque guarda el HTML completo usando NGINX antes de que se ejecute PHP o MYSQL.

Para vaciar esta caché al publicar un artículo nuevo usamos este plugin (también de Till Kruss): Nginx Cache plugin.

 

La publicación original (en inglés) de WPIntense está aquí: «Installing the fastest WordPress stack with Ubuntu 18.04 and MySQL 8 (Dave Hilditch)«

Descubre porqué somos Apasionados del Marketing

Mira también

Cómo saber el stock de un producto en Amazon (truco)

Hoy os quiero presentar un truco que llevamos usando desde hace tiempo y que a …

2 comentarios

  1. a dia de hoy sigue siendo rápida esta configuración? comparado con vestacp seria mas rapido?