Escalar múltiples sitios de WordPress en un servidor

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.

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)(.*)$;
}
Toda esta configuración nos ayudara con temas de optimización para el socket de Php dentro de Nginx y ya cuenta con opciones de seguridad contempladas para WordPress.
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;

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.
Para habilitar esta herramienta dentro de nuestro servidor necesitamos contemplar lo siguiente:
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
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.
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;
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.
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.
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:

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.

Leave a Comment

Scroll to Top