WordPress Multisitio con Microservicios y Contenedores Docker en 2025
Introducción: El nuevo paradigma de los sitios masivos con WordPress
En 2025, la arquitectura monolítica de WordPress ha quedado atrás para los proyectos que buscan escalar de verdad. La combinación de WordPress multisitio con microservicios desplegados en contenedores Docker y orquestados por Kubernetes se ha consolidado como el estándar de facto para gestionar decenas, cientos o incluso miles de sitios desde una única base de código, pero con la flexibilidad de un ecosistema distribuido.
Este artículo no es una guía para instalar un LAMP con wp-cli. Es una inmersión técnica profunda en cómo diseñar, desplegar y mantener una arquitectura escalable que aproveche al máximo la naturaleza de red de WordPress multisitio, rompiendo sus limitaciones históricas mediante la contenerización y la orquestación.
¿Por qué WordPress Multisitio con Docker y Microservicios en 2025?
La pregunta no es si debes hacerlo, sino cómo. Las ventajas son contundentes:
- Aislamiento de recursos: Cada sitio (o grupo de sitios) puede tener sus propios límites de CPU, RAM y E/S, evitando el efecto "vecino ruidoso".
- Escalado granular: No escalas todo el monstruo. Escalas el servicio de
nginx, el dephp-fpm, el decron, o incluso el de la base de datos por separado. - Despliegue inmutable: Los contenedores son efímeros. Actualizar un plugin o la versión de PHP implica construir una nueva imagen y desplegarla sin tocar el estado.
- Dev/Prod parity: El mismo
docker-compose.ymloHelm chartfunciona en tu máquina, en staging y en producción con Kubernetes. - Facilidad de mantenimiento: Un fallo en un contenedor de un sitio no derriba toda la red. Kubernetes lo reinicia automáticamente.
[INFO] Aunque WordPress multisitio comparte la tabla
wp_usersywp_blogs, los microservicios nos permiten aislar las cargas de trabajo de plugins pesados (WooCommerce, LMS) en pods separados, manteniendo la red central ligera.
Componentes Clave de la Arquitectura
No se trata solo de meter WordPress en un contenedor. La arquitectura se descompone en varios servicios independientes que se comunican entre sí.
2.1 El Orquestador: Kubernetes (K8s)
Kubernetes es el cerebro. Gestiona el ciclo de vida de los contenedores, el balanceo de carga, el descubrimiento de servicios y el almacenamiento persistente. Para WordPress multisitio, necesitas al menos:
- Deployments: Para
wordpress-php,nginx,varnish(opcional),cron. - StatefulSets: Para bases de datos (MariaDB/Galera) o sistemas de archivos distribuidos (Longhorn, Ceph).
- Services: Para exponer internamente cada microservicio (ej:
service/wordpress-php:9000). - Ingress Controller: (Traefik, NGINX Ingress) para enrutar
*.midominio.comal pod de nginx correcto.
2.2 El Corazón: WordPress PHP-FPM
Cada sitio o grupo de sitios puede ejecutar su propia instancia de PHP-FPM. La clave está en la configuración de wp-config.php para que sea consciente del multisitio:
// wp-config.php para multisitio en Kubernetes
define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true); // O false si usas subdirectorios
define('DOMAIN_CURRENT_SITE', $_SERVER['HTTP_HOST'] ?? 'default.midominio.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
// Cache de objetos con Redis (microservicio aparte)
define('WP_REDIS_HOST', 'redis-service');
define('WP_REDIS_PORT', 6379);
2.3 El Proxy y el Balanceo: NGINX + Varnish
NGINX actúa como proxy inverso y terminación SSL. Varnish (o similar) como caché HTTP de página completa. La configuración debe ser dinámica para cada subdominio.
# Fragmento de nginx.conf para multisitio con microservicios
upstream php-upstream {
server wordpress-php-service:9000;
}
server {
listen 443 ssl http2;
server_name ~^(?<subdomain>.+)\.midominio\.com$;
root /var/www/html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# Pasar el subdominio a WordPress
fastcgi_param HTTP_HOST $subdomain.midominio.com;
}
}
[TIP] Para redes con miles de sitios, evita el
try_filesgenérico. Usa un mapa de$uria$blog_iden NGINX para redirigir directamente alwp-content/blogs.dir/{id}/sin tocar PHP.
2.4 Almacenamiento Persistente: El Talón de Aquiles
WordPress multisitio asume que los archivos (uploads, plugins, themes) están en un sistema de archivos compartido. En Kubernetes, esto se soluciona con:
- NFS / GlusterFS / CephFS: Clásico, pero con limitaciones de rendimiento.
- Longhorn (recomendado): Almacenamiento de bloque distribuido para Kubernetes. Cada pod monta su propio volumen.
- S3 y Object Storage: Para los uploads, con un plugin como
WP Offload Media. Los plugins y themes se empaquetan en la imagen Docker.
# PersistentVolumeClaim para uploads de un sitio específico
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: uploads-site-123
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: longhorn
Diseñando la Red Multisitio con Microservicios
Aquí es donde la teoría se encuentra con la práctica. No todos los sitios de la red son iguales.
3.1 Estrategia de Agrupación de Sitios
Divide los sitios en "pools" según su perfil de carga:
- Pool Gold (Alto tráfico, WooCommerce): Pods dedicados con 4 vCPU, 8GB RAM, Redis dedicado, y caché de página completa.
- Pool Silver (Blogs medianos): Comparten pods de PHP, pero con límites de recursos estrictos.
- Pool Bronze (Sites estáticos o de poco tráfico): Servidos directamente por NGINX con páginas cacheadas en Varnish, sin tocar PHP.
Cada pool se despliega como un Deployment independiente en Kubernetes, con su propio HorizontalPodAutoscaler.
# Ejemplo de HPA para el pool Gold
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: wordpress-gold-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: wordpress-gold
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
3.2 Microservicios Auxiliares
No todo es PHP. Cada funcionalidad se convierte en un microservicio:
- Servicio de Colas (RabbitMQ / Redis): Para procesar notificaciones, emails, importaciones CSV.
- Servicio de Búsqueda (Elasticsearch / Meilisearch): Indexa el contenido de todos los sitios de la red.
- Servicio de Imágenes (Thumbor / Imaginary): Redimensiona y optimiza imágenes bajo demanda.
- Servicio de Cron (Kuberentes CronJob): Ejecuta
wp cron event runpara cada sitio sin depender del tráfico web.
Despliegue con Docker Compose (Desarrollo) y Helm (Producción)
4.1 Entorno de Desarrollo con Docker Compose
Para que el equipo pueda replicar la arquitectura localmente:
# docker-compose.yml para multisitio + microservicios
version: '3.8'
services:
nginx:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- wordpress-data:/var/www/html
ports:
- "80:80"
depends_on:
- wordpress-php
wordpress-php:
build: ./images/php
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: secret
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress-data:/var/www/html
- ./plugins:/var/www/html/wp-content/plugins
- ./themes:/var/www/html/wp-content/themes
db:
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: rootsecret
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: secret
volumes:
- db-data:/var/lib/mysql
redis:
image: redis:7-alpine
elasticsearch:
image: elasticsearch:8.12
environment:
- discovery.type=single-node
volumes:
wordpress-data:
db-data:
4.2 Producción con Helm Charts
Para Kubernetes, usa Helm. Existen charts públicos para WordPress, pero para multisitio con microservicios es mejor construir uno propio. Un values.yaml típico incluiría:
# values.yaml para Helm chart personalizado
global:
domain: midominio.com
multisite:
enabled: true
type: subdomain
sites:
- id: 1
domain: tienda.midominio.com
pool: gold
- id: 2
domain: blog.midominio.com
pool: silver
wordpress:
image: registry.midominio.com/wordpress-php:2025.1
pools:
gold:
replicas: 3
resources:
requests:
cpu: 2
memory: 4Gi
limits:
cpu: 4
memory: 8Gi
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 20
targetCPUUtilizationPercentage: 70
silver:
replicas: 2
resources:
requests:
cpu: 500m
memory: 1Gi
database:
provider: galera
replicas: 3
storage: 200Gi
cache:
type: redis
replicas: 3
persistence:
size: 10Gi
search:
enabled: true
type: elasticsearch
replicas: 3
[WARNING] No uses el chart oficial de WordPress para multisitio en producción sin modificarlo. Asume una sola instancia. Necesitarás personalizar los
Deployments,Servicesy la lógica deIngress.
Gestión de Plugins y Themes en un Entorno Contenerizado
Este es uno de los mayores desafíos. En un entorno inmutable, no puedes instalar plugins a través del panel de administración.
Estrategias:
- Imagen Docker personalizada: Construye la imagen con todos los plugins y themes necesarios para la red. Cada actualización implica un nuevo build y despliegue.
- Volumen compartido de solo lectura: Monta un volumen NFS con los plugins, pero esto rompe el principio de inmutabilidad.
- GitOps con ArgoCD: Los plugins se definen como archivos en un repositorio Git. Un pipeline de CI/CD construye la imagen y ArgoCD la despliega.
# Dockerfile para imagen de WordPress con plugins preinstalados
FROM wordpress:6.7-php8.3-fpm-alpine
# Instalar wp-cli
RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \
&& chmod +x wp-cli.phar \
&& mv wp-cli.phar /usr/local/bin/wp
# Copiar plugins y themes desde el contexto de build
COPY plugins/ /var/www/html/wp-content/plugins/
COPY themes/ /var/www/html/wp-content/themes/
# Script de entrada para configurar multisitio dinámicamente
COPY entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
Monitoreo y Observabilidad
No puedes escalar lo que no mides. En 2025, el stack de observabilidad para WordPress multisitio incluye:
- Prometheus + Grafana: Métricas de cada pod (PHP-FPM, NGINX, MySQL), colas de Redis, y métricas de negocio como número de visitas por sitio.
- Loki + Promtail: Logs centralizados de todos los contenedores. Busca errores de PHP, 404s, o lentitud en consultas.
- Jaeger / Tempo: Trazado distribuido para seguir una petición HTTP desde el Ingress hasta la base de datos, pasando por Redis y Elasticsearch.
# Ejemplo de ServiceMonitor para Prometheus Operator
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: wordpress-php-monitor
spec:
selector:
matchLabels:
app: wordpress-php
endpoints:
- port: metrics
interval: 15s
Casos de Uso Reales en 2025
- Universidades: Una red de 500+ sitios para departamentos, cada uno con sus propios plugins y temas, pero gestionados centralmente. Los sitios de alto tráfico (admisiones) escalan automáticamente.
- SaaS de membresía: Cada cliente tiene un subdominio en la red multisitio. La facturación se maneja como un microservicio aparte, y los pods de WordPress se escalan según el plan del cliente.
- Redes de medios: Decenas de sitios de noticias regionales. La búsqueda unificada con Elasticsearch permite a los periodistas buscar contenido en toda la red.
Conclusión
La arquitectura de WordPress multisitio con microservicios y contenedores Docker en 2025 no es una moda, es una necesidad para proyectos que aspiran a crecer sin límites artificiales. La clave está en:
- Descomponer el monolito en servicios pequeños y especializados.
- Orquestar con Kubernetes para garantizar alta disponibilidad y escalado automático.
- Automatizar todo el ciclo de vida de los plugins y temas mediante CI/CD y GitOps.
- Observar cada componente con métricas, logs y trazas.
El camino no es sencillo. Requiere un equipo con habilidades en DevOps, Docker y Kubernetes. Pero el resultado es una plataforma que puede gestionar desde 10 hasta 10,000 sitios con la misma solidez y eficiencia.
[INFO] Si estás empezando, no intentes abarcar todo de golpe. Comienza con un
docker-compose.ymlpara tu red de desarrollo, migra un sitio de prueba a un pod en Kubernetes, y luego escala gradualmente. El futuro del CMS más usado del mundo es distribuido, y ya está aquí.
