Por qué autoalojar WordPress en un VPS
El alojamiento compartido reparte CPU, RAM e incluso la base de datos entre cientos de sitios: su velocidad depende de los vecinos, y el acceso SSH o la configuración fina del servidor suelen estar bloqueados. Un VPS dedicado le da recursos garantizados y el control total de PHP-FPM, del servidor web, de la caché de objetos (Redis) y de la caché de páginas. Para una agencia que gestiona varios sitios de clientes, es además la posibilidad de aislarlo todo en contenedores en una sola máquina, con copias de seguridad y despliegues controlados, allí donde el compartido impone sus límites y sus sobrecostos.
Las ganancias de un WordPress en VPS
- Recursos de CPU/RAM garantizados: se acabaron las ralentizaciones por culpa de los vecinos
- Control total de PHP-FPM, del servidor web y de las extensiones
- Caché de objetos Redis y caché de páginas para dividir los tiempos de respuesta
- Acceso SSH/WP-CLI completo para automatizar el mantenimiento y los despliegues
- Aislamiento por contenedor: varios sitios de clientes en un solo VPS
- Copias de seguridad y reglas de seguridad definidas por usted, sin sobrecosto por sitio
Requisitos realistas
Un VPS de 2 vCPU y 2 GB de RAM soporta con holgura un sitio WordPress con tráfico moderado; pase a 4 GB con Redis, WooCommerce o varios sitios. Necesita Docker + Compose, una base MariaDB o MySQL, idealmente Redis para la caché de objetos, y un dominio sudominio.com con su certificado SSL. Prevea algo de ajuste de PHP (upload_max_filesize, memory_limit) según sus archivos multimedia y sus extensiones.
Despliegue paso a paso
Componer WordPress, MariaDB y Redis
En
docker-compose.yml, declarewordpress:php8.3-fpmowordpress:apache, un serviciomariadb:11yredis:alpine. Persistawp-contenty la base de datos en volúmenes con nombre, en una red Docker interna.Indicar la base de datos y los secretos
Pase
WORDPRESS_DB_*y contraseñas robustas mediante variables de entorno. Añada las claves de seguridad (salts) generadas desde la API oficial de WordPress enWORDPRESS_CONFIG_EXTRA.Arrancar e instalar WordPress
Arranque con
docker compose up -dy luego abra su dominio para el asistente de instalación. Mejor aún: automatice mediante WP-CLI (wp core install) para lograr despliegues reproducibles de un sitio a otro.Colocar el reverse proxy y el SSL
Configure Nginx/Caddy en HTTPS delante de WordPress. Ajuste
client_max_body_sizepara las subidas, active la compresión gzip/brotli y la caché de los recursos estáticos (imágenes, CSS, JS) con cabecerasCache-Controllargas.Activar la caché de objetos Redis
Instale un plugin de caché de objetos (p. ej. Redis Object Cache), apúntelo al servicio
redisy actívelo: las consultas repetidas a la base de datos se sirven desde la memoria, aliviando notablemente MariaDB.Endurecer y respaldar
Desactive la edición de archivos en la administración (
DISALLOW_FILE_EDIT), limite los intentos de conexión y programe una copia de seguridad nocturna dewp-content+ volcado SQL hacia un almacenamiento de objetos remoto.Conectarse por primera vez
Abra la URL del sitio: WordPress lanza su instalación en 5 minutos — idioma, título del sitio y después la creación de SU identificador de administrador con la contraseña y el correo que usted elija. Termínela sin esperar: una instalación inacabada queda ofrecida al primer visitante.
Para un rendimiento que rivalice con las plataformas gestionadas más rápidas, añada una caché de páginas completa por delante de PHP: un plugin que genere archivos HTML estáticos servidos directamente por Nginx (mediante try_files), o un módulo FastCGI cache. Sus páginas públicas dejan entonces de tocar por completo PHP y MariaDB, lo que permite a un VPS modesto absorber miles de visitantes simultáneos, manteniendo el back-office y el carrito (WooCommerce) excluidos de la caché.
Alerta PHP del 21/10/2026 (PHP2Shell): actualizar WordPress no corrige PHP
El 21 de octubre de 2026, el proyecto PHP publicó versiones de seguridad para dos fallos de ejecución remota de código, CVE-2026-109618 y CVE-2026-109619. La corrección está en PHP mismo: las versiones corregidas son 8.5.12, 8.4.27, 8.3.36 y 8.2.35. Su WordPress puede estar al día (núcleo, temas, plugins) y seguir ejecutándose sobre un PHP vulnerable, porque el panel de actualizaciones nunca toca el intérprete. Con la pila de este artículo, PHP vive dentro de la imagen Docker wordpress: mientras no descargue una imagen reconstruida sobre una versión corregida y recree el contenedor, el fallo sigue abierto. Para el detalle de ambos fallos, lea el artículo php2shell-cve-2026-109618-109619-mettre-a-jour-php; para reconstruir las imágenes, php2shell-docker-wordpress-reconstruire-images-php.
Comprobar y corregir en cinco gestos
Leer la versión de PHP realmente servida
Lo más fiable está en WordPress: Herramientas > Salud del sitio > Información > Servidor muestra la versión de PHP que ejecuta sus páginas. En un VPS sin Docker, desconfíe de
php -v: consulta el binario de línea de comandos, que puede ser otra versión que PHP-FPM, el que atiende a sus visitantes. Pregunte al servicio mismo conphp-fpm -v(ophp-fpm8.3 -ven Debian y Ubuntu).Comprobar la versión dentro del contenedor
Con Docker, ejecute
docker compose exec wordpress php -v: la imagen incluye un solo PHP, así que el resultado vale para el FPM o mod_php del contenedor. Compárelo con las versiones corregidas de arriba, manteniendo la misma rama (8.3.x debe llegar a 8.3.36, no a 8.4.27).Descargar la imagen actualizada
Ejecute
docker compose pull && docker compose up -d. El pull descarga la última imagen publicada para su etiqueta (por ejemplowordpress:php8.3-fpm), yup -drecrea el contenedor con ella. Sus volúmenes con nombre conservanwp-contenty la base de datos. Siphp -vaún muestra una versión antigua, la imagen corregida todavía no está publicada para esa etiqueta: vuelva a comprobarlo más tarde, o cambie de rama de PHP si su sitio la admite.Reiniciar PHP-FPM
Actualizar un paquete o unos archivos no cambia el código ya cargado por los procesos en curso. En un servidor clásico, reinicie el servicio con
systemctl restart php8.3-fpm(adapte el número de versión); con Docker basta recrear el contenedor, o si nodocker compose restart wordpress. Un simple reload es menos fiable que un restart si necesita que todos los workers se renueven.Buscar rastros de explotación
Una actualización cierra la puerta, pero no dice si alguien ya entró. Revise los registros de acceso y de error de Nginx o Apache (
docker compose logs --since 72h wordpresscon Docker) en busca de caídas de workers de PHP-FPM, mensajes de falta de memoria repetidos y peticiones inusuales de gran volumen. Dentro dewp-content, liste los archivos.phpmodificados recientemente confind wp-content -name '*.php' -mtime -7, sobre todo enuploads, donde no debería haber ningún script. Ante la menor duda, restaure desde una copia limpia y cambie contraseñas y salts.Automatizar la comprobación con WP-CLI y cron
Tenga en cuenta que
wp --infoindica la versión de PHP de la línea de comandos, no la de PHP-FPM: resérvelo para scripts, no para juzgar la exposición web. Programe mejor una tarea cron semanal que ejecutedocker compose pull, compare la salida dedocker compose exec wordpress php -vcon la versión esperada y le avise por correo si no coincide. Así, la próxima alerta de seguridad de PHP ya no depende de su memoria.Verificar de nuevo
Vuelva a abrir Salud del sitio y repita
php -ven el contenedor: ambos deben mostrar una versión corregida. Anote la fecha en su registro de mantenimiento y repita la rutina con cada nueva publicación de seguridad de PHP.
Mitigación parcial, no una corrección
Para CVE-2026-109619, el aviso de PHP indica desactivar session.upload_progress.enabled en el php.ini o en el pool FPM y reiniciar todos los workers; ini_set() y .user.ini no bastan. Esto reduce la exposición mientras planifica la actualización, pero solo actualizar PHP corrige realmente ambos fallos.
La documentación oficial
Para la configuración avanzada y las opciones propias de la herramienta, consulte la documentación oficial de WordPress. Esta guía cubre la puesta en línea en un VPS; la documentación del editor sigue siendo la referencia para los ajustes finos, las actualizaciones mayores y los casos de uso específicos.