// Índice de contenidos
WordPress puede ser lento. Pero no tiene por qué serlo. Con la configuración correcta, un sitio WordPress en HestiaCP puede cargar en menos de un segundo, manejar miles de visitas simultáneas, y obtener puntuaciones perfectas en Core Web Vitals.
He optimizado cientos de instalaciones WordPress en VPS con HestiaCP. La diferencia entre una configuración por defecto y una optimizada puede ser de 3-5 segundos a 0.3 segundos de tiempo de carga. Eso es 10 veces más rápido.
En esta guía te muestro exactamente cómo configurar HestiaCP para que WordPress vuele: desde ajustes de PHP y caché multicapa, hasta seguridad específica y mantenimiento automatizado.
Requisitos del servidor para WordPress
Antes de optimizar, asegúrate de tener los recursos adecuados:
Requisitos mínimos por tipo de sitio
| Tipo de sitio | RAM | CPU | Almacenamiento |
|---|---|---|---|
| Blog personal | 1 GB | 1 vCPU | 20 GB SSD |
| Sitio corporativo | 2 GB | 2 vCPU | 40 GB SSD |
| WooCommerce pequeño | 4 GB | 2 vCPU | 60 GB NVMe |
| WooCommerce grande | 8+ GB | 4+ vCPU | 100+ GB NVMe |
Lo que marca la diferencia
- NVMe vs SSD: NVMe es 3-5x más rápido para operaciones de base de datos
- RAM suficiente: Permite Redis, OPcache y procesos PHP sin swap
- CPU single-thread potente: WordPress es mayormente single-threaded
- Ancho de banda: Importante para sitios con mucho tráfico o medios pesados
Verificar recursos actuales
# Ver RAM y uso
free -h
# Ver CPU
nproc
cat /proc/cpuinfo | grep "model name" | head -1
# Ver tipo de disco
lsblk -d -o name,rota,type
# rota=0 significa SSD/NVMe
Configuración óptima de PHP
PHP es donde WordPress pasa la mayor parte del tiempo. Una configuración optimizada puede reducir el TTFB (Time To First Byte) drásticamente.
Elegir versión de PHP
Usa siempre la versión más reciente estable que soporte tu tema y plugins:
| PHP | Estado | Recomendación |
|---|---|---|
| 8.3 | Actual | ✅ Recomendada |
| 8.2 | Estable | ✅ Excelente |
| 8.1 | Soporte seguridad | ⚠️ Actualizar pronto |
| 8.0 | End of Life | ❌ No usar |
| 7.4 | End of Life | ❌ Migrar urgente |
Cambiar versión en HestiaCP:
- Ve a Web → tu dominio → Editar
- En Backend Template, selecciona la versión PHP
- Guarda
Configuración de php.ini
Edita la configuración PHP del dominio o globalmente:
# Ubicación para PHP 8.3
/etc/php/8.3/fpm/pool.d/usuario.conf
Configuración recomendada:
; Memoria y tiempos
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
max_input_vars = 5000
; Uploads
upload_max_filesize = 64M
post_max_size = 64M
; OPcache (CRÍTICO para rendimiento)
opcache.enable = 1
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
opcache.fast_shutdown = 1
opcache.enable_cli = 0
opcache.validate_timestamps = 0 ; Si no editas código a menudo
; Seguridad
expose_php = Off
display_errors = Off
log_errors = On
Configuración de PHP-FPM Pool
Ajusta los workers según la RAM disponible:
; /etc/php/8.3/fpm/pool.d/usuario.conf
; Modo dinámico para sitios con tráfico variable
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500
; Para sitios de alto tráfico constante
; pm = static
; pm.max_children = 30
Cálculo de max_children:
max_children = (RAM disponible - RAM sistema) / RAM por proceso PHP
Un proceso PHP de WordPress usa ~30-50 MB. Con 4 GB de RAM:
(4000 - 1000) / 40 = 75 max_children (ser conservador: usar 30-40)
Reiniciar PHP-FPM
systemctl restart php8.3-fpm
Configurar Redis Object Cache
Redis almacena en memoria las consultas a base de datos, reduciendo drásticamente la carga de MySQL.
Instalar Redis
# Instalar Redis server
apt install redis-server php-redis
# Habilitar e iniciar
systemctl enable redis-server
systemctl start redis-server
# Verificar
redis-cli ping
# Debe responder: PONG
Configurar Redis
Edita /etc/redis/redis.conf:
# Limitar memoria
maxmemory 256mb
maxmemory-policy allkeys-lru
# Socket Unix (más rápido que TCP)
unixsocket /var/run/redis/redis.sock
unixsocketperm 770
# Desactivar persistencia para caché puro
save ""
appendonly no
Añade el usuario www-data al grupo redis:
usermod -aG redis www-data
systemctl restart redis-server
systemctl restart php8.3-fpm
Configurar WordPress para Redis
Añade a wp-config.php:
// Redis Object Cache
define('WP_REDIS_HOST', '/var/run/redis/redis.sock');
define('WP_REDIS_PORT', 0);
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_PREFIX', 'wp_tusitio_');
define('WP_CACHE_KEY_SALT', 'tusitio_');
define('WP_CACHE', true);
Instalar plugin Redis Object Cache
- Instala el plugin “Redis Object Cache” de Till Krüss
- Ve a Ajustes → Redis
- Haz clic en Enable Object Cache
- Verifica que muestra “Connected”
WordPress optimizado de serie
El VPS HestiaCP Administrado viene con Redis, FastCGI cache y PHP optimizado preconfigurados. Tu WordPress volará desde el primer momento.
Nginx FastCGI Cache
El caché de Nginx sirve páginas estáticas directamente sin ejecutar PHP. Es la capa de caché más rápida.
Habilitar FastCGI Cache en HestiaCP
HestiaCP incluye templates con FastCGI cache. Para activarlo:
- Ve a Web → tu dominio → Editar
- En Proxy Template, selecciona uno con cache:
caching- Caché básicocaching-proxy- Caché con proxy
- Guarda
Configuración manual avanzada
Si necesitas personalizar, edita el template en:
/usr/local/hestia/data/templates/web/nginx/
Configuración típica de FastCGI cache:
# Definir zona de caché
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2
keys_zone=WORDPRESS:100m inactive=60m max_size=1g;
# En el bloque server
set $skip_cache 0;
# No cachear para usuarios logueados
if ($http_cookie ~* "wordpress_logged_in") {
set $skip_cache 1;
}
# No cachear POSTs
if ($request_method = POST) {
set $skip_cache 1;
}
# No cachear admin, wp-login, cart, checkout
if ($request_uri ~* "/wp-admin/|/wp-login.php|/cart/|/checkout/|/my-account/") {
set $skip_cache 1;
}
# Configurar caché
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
# Header para debug
add_header X-FastCGI-Cache $upstream_cache_status;
Purgar caché
Para purgar el caché cuando publicas contenido, instala el plugin Nginx Helper y configúralo para purgar automáticamente.
O manualmente:
rm -rf /var/cache/nginx/fastcgi/*
Plugins de caché recomendados
No todos los plugins de caché son iguales. Aquí mis recomendaciones para HestiaCP:
Para sitios sin WooCommerce
WP Super Cache (gratuito)
- Simple y efectivo
- Genera archivos HTML estáticos
- Compatible con Nginx
Configuración recomendada:
- Modo: Expert (mod_rewrite)
- Activar: Compresión de páginas
- Activar: No cachear páginas para usuarios conocidos
- TTL: 3600 segundos (1 hora)
Para WooCommerce
W3 Total Cache (gratuito) o WP Rocket (pago)
W3TC configuración:
- Page Cache: Disk Enhanced
- Object Cache: Redis (si lo tienes)
- Browser Cache: Enabled
- Minify: Enabled (CSS/JS)
Combinación recomendada
| Capa | Herramienta |
|---|---|
| Page Cache | Nginx FastCGI o WP Super Cache |
| Object Cache | Redis + plugin Redis Object Cache |
| Browser Cache | Headers Nginx + plugin |
| CDN | Cloudflare (gratis) |
No uses múltiples plugins de page cache. Elige uno solo.
Optimización de wp-config.php
El archivo wp-config.php controla comportamientos críticos de WordPress.
Configuración de rendimiento
<?php
// Aumentar memoria
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
// Reducir revisiones
define('WP_POST_REVISIONS', 5);
// Vaciar papelera automáticamente (días)
define('EMPTY_TRASH_DAYS', 7);
// Deshabilitar edición de archivos desde admin
define('DISALLOW_FILE_EDIT', true);
// Intervalo de autoguardado (segundos)
define('AUTOSAVE_INTERVAL', 120);
// Caché
define('WP_CACHE', true);
// Redis (si lo usas)
define('WP_REDIS_HOST', '/var/run/redis/redis.sock');
define('WP_REDIS_PORT', 0);
define('WP_REDIS_PREFIX', 'tusitio_');
define('WP_CACHE_KEY_SALT', 'tusitio_');
Configuración de seguridad
// Forzar SSL en admin
define('FORCE_SSL_ADMIN', true);
// Deshabilitar actualizaciones automáticas de core (hacerlas manual)
define('WP_AUTO_UPDATE_CORE', false);
// Bloquear peticiones HTTP externas (excepto las necesarias)
define('WP_HTTP_BLOCK_EXTERNAL', false);
// Deshabilitar cron de WordPress (usar cron del sistema)
define('DISABLE_WP_CRON', true);
Usar cron del sistema
WordPress ejecuta su cron en cada visita, lo que añade latencia. Es mejor usar el cron del sistema:
# Añadir a crontab
crontab -e
# Ejecutar cron de WordPress cada 5 minutos
*/5 * * * * cd /home/usuario/web/tudominio.com/public_html && wp cron event run --due-now --quiet
O con curl:
*/5 * * * * curl -s https://tudominio.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Optimización de base de datos
La base de datos es a menudo el cuello de botella.
Limpiar base de datos
Usa el plugin WP-Optimize o comandos WP-CLI:
# Limpiar revisiones
wp post delete $(wp post list --post_type='revision' --format=ids) --force
# Limpiar transients expirados
wp transient delete --expired
# Limpiar spam y papelera
wp comment delete $(wp comment list --status=spam --format=ids) --force
wp comment delete $(wp comment list --status=trash --format=ids) --force
# Optimizar tablas
wp db optimize
Configuración de MySQL/MariaDB
Edita /etc/mysql/mariadb.conf.d/50-server.cnf:
[mysqld]
# InnoDB Buffer Pool (50-70% de RAM disponible para MySQL)
innodb_buffer_pool_size = 1G
innodb_buffer_pool_instances = 4
# Logs
innodb_log_file_size = 256M
innodb_log_buffer_size = 16M
# Caché de queries (controversia, pero útil en WordPress)
query_cache_type = 1
query_cache_limit = 2M
query_cache_size = 64M
# Conexiones
max_connections = 150
# Tablas temporales
tmp_table_size = 64M
max_heap_table_size = 64M
Reinicia MySQL:
systemctl restart mariadb
Índices importantes
Asegúrate de que las tablas críticas tienen índices:
-- Ver índices actuales
SHOW INDEX FROM wp_postmeta;
SHOW INDEX FROM wp_options;
-- Añadir índice a wp_options si no existe
ALTER TABLE wp_options ADD INDEX autoload (autoload);
¿Muchos sitios WordPress?
El VPS HestiaCP Administrado incluye gestión centralizada, actualizaciones automáticas y monitorización de todos tus WordPress.
Seguridad específica WordPress
WordPress es el CMS más atacado del mundo. Protégelo correctamente.
Protección a nivel de Nginx
Añade a la configuración del dominio:
# Bloquear xmlrpc.php (si no lo usas)
location = /xmlrpc.php {
deny all;
}
# Bloquear acceso a archivos sensibles
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
# Proteger wp-includes
location ~* ^/wp-includes/.*\.php$ {
deny all;
}
# Proteger wp-config.php
location = /wp-config.php {
deny all;
}
# Limitar peticiones a wp-login
location = /wp-login.php {
limit_req zone=login burst=3 nodelay;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
Plugins de seguridad recomendados
| Plugin | Función | Peso |
|---|---|---|
| Wordfence | WAF + Scanner | Medio |
| Sucuri | Scanner + CDN | Ligero |
| iThemes Security | Hardening | Ligero |
| Limit Login Attempts | Bloqueo fuerza bruta | Muy ligero |
Mi recomendación: Limit Login Attempts + configuración Nginx es suficiente para la mayoría. Wordfence solo si necesitas WAF completo.
Permisos de archivos
# Directorios: 755
find /home/usuario/web/tudominio.com/public_html -type d -exec chmod 755 {} \;
# Archivos: 644
find /home/usuario/web/tudominio.com/public_html -type f -exec chmod 644 {} \;
# wp-config.php: 600
chmod 600 /home/usuario/web/tudominio.com/public_html/wp-config.php
Gestión de múltiples sitios WordPress
Si administras varios WordPress en el mismo servidor:
Separación de usuarios
Crea un usuario HestiaCP diferente para cada cliente:
v-add-user cliente1 contraseña [email protected]
v-add-web-domain cliente1 cliente1.com
Esto aísla los sitios y mejora la seguridad.
WordPress Multisite
Si prefieres un WordPress Multisite:
- Instala WordPress normalmente
- Añade a
wp-config.php:
define('WP_ALLOW_MULTISITE', true);
-
Ve a Herramientas → Configuración de red y sigue el asistente
-
Actualiza
wp-config.phpy.htaccesssegún las instrucciones
WP-CLI para gestión masiva
# Actualizar todos los WordPress del servidor
for site in /home/*/web/*/public_html; do
if [ -f "$site/wp-config.php" ]; then
echo "Actualizando $site"
wp core update --path="$site" --allow-root
wp plugin update --all --path="$site" --allow-root
fi
done
Mantenimiento automatizado
Script de mantenimiento semanal
Crea /root/scripts/wp-maintenance.sh:
#!/bin/bash
# Mantenimiento WordPress semanal
LOG="/var/log/wp-maintenance.log"
echo "=== $(date) ===" >> $LOG
for site in /home/*/web/*/public_html; do
if [ -f "$site/wp-config.php" ]; then
echo "Procesando $site" >> $LOG
# Limpiar transients
wp transient delete --expired --path="$site" --allow-root 2>/dev/null
# Optimizar base de datos
wp db optimize --path="$site" --allow-root 2>/dev/null
# Limpiar revisiones antiguas (mantener 5)
wp post delete $(wp post list --post_type='revision' --format=ids --path="$site" --allow-root 2>/dev/null | tail -n +6) --force --path="$site" --allow-root 2>/dev/null
echo "Completado $site" >> $LOG
fi
done
echo "Mantenimiento completado" >> $LOG
Programar semanalmente:
chmod +x /root/scripts/wp-maintenance.sh
# Añadir a crontab (domingos a las 4 AM)
echo "0 4 * * 0 /root/scripts/wp-maintenance.sh" >> /etc/crontab
Actualizaciones automáticas
Para actualizaciones automáticas de plugins y temas:
// En wp-config.php o functions.php
add_filter('auto_update_plugin', '__return_true');
add_filter('auto_update_theme', '__return_true');
O con WP-CLI programado:
# Actualizar plugins todos los días a las 3 AM
0 3 * * * wp plugin update --all --path="/home/usuario/web/sitio.com/public_html" --allow-root
Monitorización de rendimiento
Herramientas de testing
| Herramienta | URL | Qué mide |
|---|---|---|
| PageSpeed Insights | pagespeed.web.dev | Core Web Vitals |
| GTmetrix | gtmetrix.com | Waterfall, métricas |
| WebPageTest | webpagetest.org | Detalle profundo |
| Pingdom | tools.pingdom.com | Tiempo de carga |
Métricas objetivo
| Métrica | Objetivo | Excelente |
|---|---|---|
| TTFB | < 600ms | < 200ms |
| LCP | < 2.5s | < 1.2s |
| FID/INP | < 100ms | < 50ms |
| CLS | < 0.1 | < 0.05 |
| Tiempo carga total | < 3s | < 1s |
Monitorización con New Relic o Query Monitor
Para sitios de producción críticos:
- Query Monitor (plugin gratuito) - Debug de consultas SQL lentas
- New Relic (APM) - Monitorización profesional
- Blackfire - Profiling de PHP
Verificar caché funcionando
# Verificar header de caché Nginx
curl -I https://tudominio.com | grep -i "x-fastcgi-cache"
# Debe mostrar: HIT
# Verificar Redis
redis-cli -s /var/run/redis/redis.sock INFO stats | grep hits
Preguntas frecuentes
¿Cuántos sitios WordPress puede manejar un VPS?
Depende de los recursos y tráfico. Regla general: 2 GB RAM (5-10 sitios), 4 GB RAM (10-20 sitios), 8 GB RAM (20-50 sitios). Con Redis y caché configurados, muchos más.
¿WP Super Cache o W3 Total Cache?
WP Super Cache es más simple y suficiente para la mayoría. W3TC ofrece más control pero es más complejo. Para WooCommerce, considera WP Rocket (pago).
¿Debo usar un CDN?
Sí, siempre. Cloudflare es gratuito y mejora velocidad y seguridad. Para imágenes pesadas, considera BunnyCDN o KeyCDN.
¿Por qué mi WordPress sigue lento?
Posibles causas: tema pesado, demasiados plugins, hosting insuficiente, sin caché configurado o base de datos sin optimizar.
¿Redis o Memcached?
Redis. Soporta más tipos de datos, tiene persistencia opcional, y es más versátil. La mayoría de plugins WordPress lo soportan mejor.
¿Cada cuánto debo optimizar la base de datos?
Semanalmente es ideal. Configura WP-Optimize o el script de mantenimiento para automatizarlo.
¿Deshabilitar WP-Cron afecta algo?
No, si configuras el cron del sistema correctamente. De hecho, mejora el rendimiento porque evita que el cron se ejecute en cada visita.
Conclusión
Un WordPress optimizado en HestiaCP puede competir con cualquier hosting managed premium. Los pasos clave son:
- PHP optimizado con OPcache configurado
- Redis para object cache
- Nginx FastCGI cache para páginas estáticas
- Plugin de caché ligero y bien configurado
- Base de datos limpia y optimizada
No necesitas un hosting de 100€/mes para tener un WordPress rápido. Solo necesitas HestiaCP y los conocimientos de esta guía.
Si prefieres tener todo esto configurado de serie y despreocuparte del mantenimiento, el VPS HestiaCP Administrado de Avantys incluye todas estas optimizaciones por defecto.
Guías relacionadas
- Cómo instalar HestiaCP en Ubuntu
- Instalar WordPress en HestiaCP
- Configurar SSL en HestiaCP
- HestiaCP para WooCommerce
- Seguridad en HestiaCP
- ¿Qué es HestiaCP?
VPS HestiaCP Administrado
Tu servidor HestiaCP con soporte técnico profesional. Nos encargamos de la administración para que tú te dediques a tus clientes.
VPS HestiaCP Administrado
La potencia de un VPS con el panel HestiaCP, montado y gestionado por nosotros.