Si con anterioridad has tenido tus sitios de WordPress en un Shared Hosting al migrar a un servidor dedicado (VPS) tal vez te preguntes lo siguiente, ¿Cómo es posible que un plan de Hosting tenga la capacidad de tener sitios ilimitados?
La respuesta es un poco mas sencilla de lo que parece, básicamente no tienen sitios ilimitados solo optimizan sus recursos y tienes sitios ilimitados media vez el espacio en disco lo permita.
El día de hoy aprenderemos a escalar múltiples sitios de WordPress dentro de un solo servidor. Aprenderemos varias formas de optimización y configuración que te permitirán alojar varios sitios sin ningún problema.
Antes de comenzar
Antes de que iniciemos necesitas tener preparado lo siguiente:
Paso 1 – Archivos de configuración
Como primer paso vamos a crear nuestro archivo de configuración de Nginx para uso compartido de nuestras instancias de WordpPress para esto vamos a ejecutar el siguiente comando:
sudo nano /etc/nginx/snippets/wordpress.conf
En nuestro archivo recién creado vamos a ingresar lo siguiente :
#fastcgi_cache start
set $no_cache 0;
# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
set $no_cache 1;
}
if ($query_string != "") {
set $no_cache 1;
}
# Don't cache uris containing the following segments
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $no_cache 1;
}
# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $no_cache 1;
}
location / {
# no php is touched for static content
gzip_static on;
try_files $uri $uri/ /index.php$is_args$args;
}
### SECURITY ###
location /xmlrpc.php { deny all; }
location ~ /\. { access_log off; log_not_found off; deny all; }
location ~ ~$ { access_log off; log_not_found off; deny all; }
location ~* wp-admin/includes { deny all; }
location ~* wp-includes/theme-compat/ { deny all; }
location ~* wp-includes/js/tinymce/langs/.*\.php { deny all; }
location /wp-includes/ { internal; }
#location ~* wp-config.php { deny all; }
location ~* ^/wp-content/uploads/.*.(html|htm|shtml|php)$ {
types { }
default_type text/plain;
}
location ~ \.php$ {
fastcgi_hide_header X-Powered-By;
include fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_intercept_errors on;
fastcgi_split_path_info ^(.+\.php)(.*)$;
}
Luego procederemos a crear un nuevo archivo de configuración que nos ayudara a separar la lógica de nuestros archivos estáticos como por ejemplo nuestras imágenes y archivos de Js y Css.
Para esto vamos a ejecutar el siguiente comando:
sudo nano /etc/nginx/snippets/statics.conf
En nuestro archive recién creado vamos a ingresar lo siguiente:
### DISABLE LOGGING ###
location = /robots.txt { allow all; access_log off; log_not_found off; }
location = /favicon.ico { access_log off; log_not_found off; }
### CACHES ###
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ { access_log off; expires 60d; }
location ~* \.(woff|svg)$ { access_log off; log_not_found off; expires 60d; }
location ~* \.(js)$ { access_log off; log_not_found off; expires 60d; }
### Caching
gzip_vary on;
gzip_disable "msie6";
gzip_comp_level 6;
gzip_min_length 1100;
gzip_buffers 16 32k;
gzip_proxied any;
gzip_types text/plain aplication/xml text/css text/js text/xml application/x-javascript text/javascript application/javascript application/json application/xml+rss;
NOTA
Este archivo ya contempla temas de cache dentro de Nginx para archivos estáticos. Específicamente la configuración contempla guardar en cache durante 60 días este tipo de archivos para optimizar nuestras llamadas al sitio.
Paso 2 – Habilitar el Memory Swap de nuestro servidor
En este paso vamos a habilitar esencialmente un espacio físico en nuestro disco duro que puede ser utilizado como RAM.
Cabe mencionar que este espacio físico no será tan rápido como la memoria RAM de nuestro servidor, pero nos ayudará especialmente con servidores de menos de 4GB de RAM.
El Memory Swap funciona de la siguiente manera, cuando el Kernel tiene procesos que ejecutar y la memoria RAM esta saturada enviara estos procesos a nuestro espacio de memoria para ser ejecutados, prácticamente tendremos mas memoria al momento que esta se sature.
NOTA
Si al ingresar a nuestro servidor nos damos cuenta de que el SWAP está en uso constantemente es una clara seña de que debemos habilitarle mas recursos a nuestro servidor.
Para habilitar esta herramienta dentro de nuestro servidor necesitamos contemplar lo siguiente:
- La memoria SWAP debe de ser dos veces mayor que nuestra memoria RAM física, por ejemplo, si nuestro servidor cuenta con 2GB de RAM nuestra configuración de memoria SWAP debe de ser de 4GB.
Podemos habilitar nuestra configuración con el siguiente comando:
sudo swapon --show
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
OJO
Esta configuración aun no es permanente, para mantener esta configuración aun cuando nuestro servidor se reinicie, debes de ejecutar también el siguiente comando:
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
¡Listo! Ya contamos con nuestra configuración de memoria SWAP habilitada.
NOTA
Si en el futuro decides hacer un Updgrade de tu servidor recuerda cambia tus valores de la memoria SWAP, acá te dejo los comandos para poder realizar el cambio de tamaño.
sudo swapoff -a
sudo fallocate -l 6G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Paso 3 – Habilitar nuestro cache de Nginx utilizando FastCGI Cache
El cache es una copia temporal de ciertos recursos, por lo general estáticos como imágenes y archivos de estilo o Javascript, para ser servidos sin necesidad de volverlos a llamar por un tiempo determinado.
Esto quiere decir que si yo ingreso a mi sitio la primera vez todos los recursos serán llamados, pero al ingresar la segunda vez solo parte de los archivos serán cargados.
Con esta técnica evitamos que todas las llamadas sean enviadas a nuestro motor de Php y de esta manera ahorraremos recursos.
A continuación, crearemos nuestra configuración de cache ejecutando el siguiente comando:
sudo nano /etc/nginx/conf.d/fastcgi.conf
Dentro de nuestro archivo recién creado vamos a colocar la siguiente configuración:
# /etc/nginx/conf.d/fastcgi.conf
# FastCGI cache settings
fastcgi_cache_path /var/run/nginx-cache/website1 levels=1:2 keys_zone=WEBSITE1:500m inactive=60m;
fastcgi_cache_path /var/run/nginx-cache/website2 levels=1:2 keys_zone=WEBSITE2:500m inactive=60m;
# any more wordpress site that needs that needs caching here
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
fastcgi_cache_valid 200 301 302 7d;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SERVER_NAME $http_host;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
fastcgi_keep_conn on;
NOTA
Como podemos observar existen dos configuraciones, esto contempla el hecho que tendremos varios sitios de WordPress en un solo servidor.
Esto se ve reflejado como website1 y website2, sin embargo, si deseas agregar un nuevo sitio solo debes de copiar una de estas dos configuraciones y ajustar el nombre.
Debes de cambiar el nombre de estos sitios por los de tus sitios.
El archivo de configuración ya contempla todo lo relacionado al funcionamiento correcto de nuestro cache.
Por último, debemos crear nuestra carpeta donde se guardarán nuestros archivos de cache, eso lo haremos con el siguiente comando:
sudo mkdir /var/run/nginx-cache
¡Listo! Ya con esto tendríamos habilitado y listo para utilizarse nuestro cache en Nginx.
Paso 4 – Agregar configuración de Nginx a nuestro sitio
Para que nuestra configuración que acabamos de realizar tome efecto, vamos a editar el archivo de nuestro sitio web para aplicar todas estas configuraciones, esto lo haremos con el siguiente comando:
sudo nano /etc/nginx/sites-enable/website1
Una vez dentro de nuestra configuración de nuestro sitio en Nginx vamos a colocar lo siguiente:
server {
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
fastcgi_cache WEBSITE1;
....
listen 80;
server_name webiste1.<your-domain-name> ;
root /var/www/wordpress/website1;
index index.php;
error_log /var/log/nginx/access_website_1.log warn;
access_log /var/log/nginx/access_website_1.log;
include /etc/nginx/snippets/wordpress.conf;
include /etc/nginx/snippets/statics.conf;
}
¡Listo! Una vez guardada nuestra configuración vamos a reiniciar nuestro servicio de Nginx, esto lo haremos con el siguiente comando:
sudo service nginx reload
Paso 5 – Optimizaciones de Php
Ya contamos con todo lo necesario dentro de nuestra configuración de Nginx ahora nos toca generar la respectiva optimización dentro de Php.
Nota
Para obtener los mejores resultados siempre utiliza la última versión del Php-FPM cuando te sea posible.
A continuación, vamos a editar valores dentro de nuestro archivo de configuración de Php, pero primero te dejare unas formulas para que puedas calcular los valores de acuerdo con tu Servidor.
- pm cambiar siempre a static.
- max_children (RAM Total – Memoria utilizada por Ubuntu) / El tamaño de tus procesos.
- start_servers Número de núcleos de tu CPU x 4.
- min_spare_servers Número de núcleos de tu CPU x 2.
- max_spare_servers Igual a tu start_ servers.
Nota
Para ver el número de procesos y cuanta memoria esta siendo utilizada por Ubuntu puedes hacerlo con el comando htop para poder realizar este análisis.
Ahora si vamos a reemplazar los valores por defecto de nuestro archivo de configuración de Php con nuestros nuevos valores, esto lo haremos con el siguiente comando:
sudo nano /etc/php/7.4/fpm/pool.d/www.conf
Acá en este archivo vamos a buscar los siguientes valores y remplazarlos por lo nuestros, por ejemplo:
pm = static
max_children = 5
start_servers = 4
min_spare_servers = 2
max_spare_server = 4
una vez realizados los cambios podemos reiniciar nuestro Php-FPM con el siguiente comando:
sudo service php8.1-fpm restart
Paso 6 – Configuración de Mysql
Tras haber configurado Php, únicamente nos faltaría realizar unas optimizaciones dentro de nuestro motor de base de datos para completar nuestra serie de optimizaciones.
Para esto vamos a ejecutar el siguiente comando:
sudo nano /etc/mysql/conf.d/mysql.conf
Dentro de nuestro archivo recién creado vamos a colocar la siguiente configuración:
[mysql]
[mysqld]
innodb_buffer_pool_size = 5M
performance_schema = off
key_buffer_size = 5M
innodb_log_buffer_size = 1M
max_connections = 35
sort_buffer_size = 512K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
join_buffer_size = 128K
thread_stack = 196K
tmp_table_size = 1M
¡Listo! Podemos reiniciar nuestro servicio de MySql para que nuestros cambios tomen efecto, esto lo haremos con el siguiente comando:
sudo service mysql restart
Siguientes pasos
Como siguientes pasos para mejorar y optimizar aun mas tus sitios de WordPress te recomiendo lo siguiente:
- Borra los Temas y Plugins sin utilizar dentro de tu sitio Web.
- Optimiza las imágenes y comprímelas adecuadamente.
- Revisa y optimiza tus archivos que cuenten con Render Blocking, puedes utilizar el Google Page Insights para esto.
- Haz uso de un CDN como Cloudflare.
Conclusión
En conclusión, podemos tener un servidor privado con múltiples sitios web de manera escalable, esto te dará la flexibilidad de utilizar un solo servidor para almacenar vario sitios web, como recomendación por experiencia propia podrías contar con 10 sitios de tráfico mediano o ya bien 15 o 20 sitios con menor tráfico en un servido con 2GB de RAM.