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)«
a dia de hoy sigue siendo rápida esta configuración? comparado con vestacp seria mas rapido?
Si. Sigue siendo de lo más rápido y estable. Aunque «LiteSpeed Web Server» es una alternativa a tener muy en cuenta.