Wordpress en varios servidores simultáneamente
20 Octubre 2009 - 12:53Las ventajas de que un site crezca son obvias: si estás haciendo bien las cosas, más tráfico = más ingresos. Pero si tu web tiene mucho tráfico y no tienes tecnología suficiente que lo soporte … puedes empezar a ver como en realidad habrá muchas peticiones a la web, pero el tráfico baja por que el servidor no es capaz de servir las páginas.
Es decir, tendrás el servidor petado y al final habrás preferido tener un tráfico intermedio, porque al menos no te daba problemas. Espero que no lo hayas pensado en serio
Para incrementos de tráfico razonables, hay varias soluciones:
1/ El más simple, es reducir el peso de tu web y el número de querys a la base de datos y de llamadas a Apache.
2/ Instalar xCache u otro acelerador de php a nivel servidor.
3/ Tunear MySQL (escribiré un post sobre eso en breve)
4/ Tunear Apache (tengo otro post pendiente)
Pero cuando hay un incremento brutal de tráfico como nos ha pasado a nosotros en nuestro blog de mujer, la cosa se pone fea si no se adoptan otro tipo de medidas: Distribuir la carga entre 3 máquinas o VPS, ya que es Apache quien no es capaz de servir adecuadamente las páginas por mucha máquina que tengas.

Servidor 1/ Aquí estará la instalación inicial de WP. Mysql lo apagamos, dejamos correr Apache.
Servidor 2/ Tendremos solo Apache y una copia exacta de la instalación del Worpdress del primer servidor.
Servidor 3/ Solo Mysql. El resto de servicios apagados.
En el servidor 1 y 2, por supuesto debes configurar correctamente el xCache.
Esta es la idea. Ahora vamos a ver como ponerla en práctica:
Hay cuatro pasos:
1/ Instalación normal del Wordpress en el servidor 1
2/ Cambio del Mysql al servidor 3
3/ Duplicación del contenido entre los servidores 1 y 2
4/ Balanceo y sincronización entre los servidores 1 y 2.
El paso 1.
Ni lo menciono. Te instalas tu wordpress y andando, como si nada.
El paso 2.
- Crea un usuario y base de datos en el servidor 3.
- Vuelca el contenido del MySQL desde el servidor 1 al servidor 3. Nosotros utilizamos el software MySQLFront. Hace la migración de la estructura y datos, rápido y bien. Yo no me complicaría la vida con comandos por SSH.
- Modifica el wp-config.php y en las líneas en las que configurar la base de datos, coloca la IP, usuario, base de datos y claves que tengas en el MySQL del servidor 3.
Asegúrate de que esa base de datos es accesible desde fuera del propio servidor. Si no sabes como se hace te recomiendo este post y este otro artículo.
Hecho esto, el apache responderá al Servidor 1 y MySQL al servidor 3.
El paso 3.
El dominio en cuestión que utilices ya está dado de alta en el servidor 1 de forma normal.
A la hora de darlo de alta en el nuevo servidor, puedes crearlo manualmente o si utilizas PLESK, utilizar el comando Migrar. Vamos a ver como sería en cada caso:
A/ Manualmente:
- Ahora da alta en el servidor 2 el mismo dominio, como si no existiera el primero.
- Accede por SSH al servidor 2. Comprueba que las rutas son las que deben ser, es decir las mismas que el servidor 1. Solo necesitamos volcar el contenido tal y como está en el servidor 1.
Para eso utilizamos el comando scp . Accede al servidor 1 por ssh, haz un tar del contenido del dominio. Luego accede al servidor 2 por ssh. Sitúate en el mismo directorio donde has hecho el tar en el otro servidor e introduce el comando:
scp root@ip-servidor1:/var/www/vhost/dominio.com/httpdocs/backup.tar .
Modificando la ip y las rutas en tu caso. Destargetea el backup y ya tienes tu contenido.
B/ Utilizando el Migrar de PLESK9.
Vas al servidor destino y utilizas el comando Migrar. Espera a que haya terminado la migración y comprueba el log de errores si que falla algo.
Hayas utilizado el procedimiento que hayas usado:
- Borra todas las DNS creadas por el servidor por defecto (en PLESK 9: Desactivar servicio)
- Crea manualmente los registros DNS de las dns que resuelvan el dominio en cuestión.
Es decir si en tu registrador tienes ns1.servidordenombres1.com y ns1.servidordenombres2.com , debes agregar esos dos registros ns, para indicarle al dominio quien va a resolver la ip del dominio son esos DNS.
- Desactiva el servicio de correo del servidor si lo tenías activado.
Ahora tenemos que volver al panel del servidor 1 y añadir una línea en las DNS.
Verás que ahora tienes un IN A www.dominio.com a la ip del servidor 1. Debes duplicarla colocando la ip del servidor 2. De ese modo, cuando alquien llegue al dominio, puede responder una u otra ip y balancear de ese modo la carga entre ambos servidores.
Resetea Named y Apache y en unos minutos empezarás a recibir tráfico en la segunda máquina.
¿Como puedes saberlo? Accede por ssh al servidor 2 e introduce el comando
watch 'netstat -anp | grep :80 | wc -l '
De devolverte valores casi cero, pasará a mostrarte el núemro de sesiones de apache abiertas. Eso siginifica que ya empieza a responder a algunas llamadas. De todos modos, el balanceo no será proporcional hasta que pasadas 12/24 hora, se propaguen bien las dns.
El paso 4.
Ya tenemos un servidor solo para las bases de datos y la carga de Apache balanceada. Notarás la mejoría en el tiempo de respuesta de tu web, una salvajada. De repente verás como el tráfico de tu web sube y no es real, esas visitas de más son las que no eras capaz de servir por falta de máquina antes de poner en marcha todo esto.
Ahora nos falta sincronizar los contenidos.
Aqui tengo que dar las gracias a Francisco Monteagudo, por su post. No tienes más que seguir la última parte al pie de la letra que copio aquí:
- Desde la línea de comandos del servidor linux primario, ejecutamos: ssh-keygen -t rsa -b 4096 -f /root/.ssh/id_rsa
- El comando anterior nos pedirá que introduzcamos una passphrase; la dejamos en blanco.
- Ahora, en el directorio de configuración del ssh del usuario root tendremos dos ficheros, id_rsa que contiene la clave privada y id_rsa.pub que contiene la clave pública.
- Copiamos la clave pública al servidor linux secundario, al directorio /root/.ssh
- En el servidor secundario, vamos al directorio /root/.ssh y buscamos el fichero “authorized_keys”. Si el fichero no existe, entonces renombramos el fichero id_rsa.pub que hemos copiado del servidor primario. Si existe, lo editamos y el fichero id_rsa.pub lo añadimos como última línea.
- Ahora volvemos al linux primario y creamos el siguiente script:
#!/bin/sh
rsync -avz secundario:/directoriouploads2 /directoriouploads1
rsync -avz /directoriouploads1 secundario:/directoriouploads2Siendo:
- secundario: Dirección IP del servidor secundario.
- directoriouploads1: Directorio de uploads de wordpress en el linux primario.
- directoriouploads2: Directorio de uploads de wordpress en el linux secundario.
- Creamos una entrada en el crontab del linux primario para que el script anterior se ejecute cada hora.
Mi recomendación es si tienes un cache de WordPress tipo 1Bloger, SuperCache, etc es que los desactives, a no ser que ejecutes la sincronización cada minuto, pero me parece demasiado.
Otra recomendación es que los editores siempre trabajen con el servidor 1. Para que no le responda unas veces el 1 y otra sel 2, debes modificar el archivo hosts que tienes en tu ordenador en la ruta C:\WINDOWS\system32\drivers\etc\hosts , añadiendo una linea donde le indiques que para ese dominio debe acudir a la IP del servidor 1.
Creo que no me dejo nada. Si crees que se puede hacer de otro modo, te agradecería que hicieses un comentario.



meneame.net says:
20 Octubre 2009 - 13:14
Solución para webs con mucho tráfico en WordPress: balanceo entre varios servidores…
Si tienes mucho mucho tráfico y usas WordPress, a veces ni siquiera los caches estilo SuperCache son suficientes, porque es Apache quien no da a basto a servir las páginas de tu web. Esta es una posible solución al problema….
Alex says:
20 Octubre 2009 - 13:55
Buenas, Lo que dices es basicamente una gran chapuza.. No es un balanceador. Los balanceadores no tienen puntos de ruptura. El problema de Wordpress es el gran volumen de conexiones que realizan a base de datos. Si tienes una base de datos solo estamos en lo mismo, solo quitas la carga para el uso de PHP o contenido estatico del servidor de base de datos.. Puedes usar multiples opciones, replicacion de base de datos , eso lo hace MySQL, lo puedes hacer con DRBD, etc. Usar una Cache Sabiendo que cache se ajusta a tus necesidades, no funciona igual Xcache, APC, ZendOptimizer, que caches internas de Wordpress como Supercache, wpcache, etc. No es tan facil como instalamos una y a volar. Lo ideal es que la mayoria de contenido sea estatico por eso es mejor tener soluciones tanto de PHP como de Wordpress y MySQL. Para MySQL puedes usar POOL de conexiones, Memcached.. Apache depende de la version se ajustara mas o menos a tus necesidades, no es lo mismo Apache1 que Apache2. Incluso es mejor usar Nginx, Lighttpd, Cherokee.. con FastCGI.. Vamos hay mil opciones. Pero poner dos frontales es una chapuza.
Fernando Gomez says:
20 Octubre 2009 - 16:26
Releyendo mi post, creo que mi gran pecado ha sido llamar “balancear” o simultenear. Es en lo único que tienes razón, entre otras cosas por que ni te identificas y no has debido leer el post entero porque lo mezclas todo. Ya he corregido mi pecado.
Para el típico webmaster con su servidor dedicado o sus VPS y conocimientos medios de sistemas, cuando ya ha instalado un cache de WP, tipo Supercache, 1Bloger, o similar y sigue teniendo problemas con Apache, no hay muchas más soluciones. Claro que si quieres poner una web que diga “Hola Mundo”, deja de haber problemas, no hay querys, no hay llamadas a Apache … no hay web.
¿DRBD? Claro que hay soluciones a nivel de “Balanceo real”, pero no para todos los mortales a un coste mínimo. Estamos hablando de usar Wordpress y alguna de las soluciones que planteas es hablar de Hardware.
xCache o APC efectivamente son diferentes. Yo propongo xCache, cada uno que elija el que mejor le vaya. Lo del ZendOptimizer lo doy por evidente, no pretendo ser una manual de como hacerlo todo, solo una ayuda de por donde tirar para el que se encuentre con problemas similares a los nuestros.
El problema del MySQL efectivamente se reduce mucho con los caches que convierten a html cacheado y dejan de hacer sufrir al MySQL. Tampoco son lo mismo, 1BloerCache, que superCache, que W3 Total Cache (yo prefiero este último), pero el problema continúa cuando Apache solapa las sesiones de tal manera, que pueda llegar a haber 1500 o 2000 sesiones de Apache abiertas en el puerto 80 de forma simultánea. A veces por mucho que tunees el httpd.conf, le metas RAM o procesador no hay manera. En ese momento, o reduces el peso de la web (que no siempre quieres o puedes hacerlo) o haces algo.
Yo planteo esta solución, que me han ido enseñando otros (algunos gente muy recnocida en el mercado) y que pongo a disposición de quien quiera usarla o al menos probarla. Es bastante más constructivo que lo que has hecho tu.
20 tips para desarrollar sitios de alto tráfico con Wordpress — Darío Ferrer says:
22 Diciembre 2009 - 10:35
[...] Wordpress en varios servidores simultáneamente [...]