viernes, 25 de febrero de 2011

Optimizar blog con WP en hosting propio para muchas visitas

En este post voy a hablar de mi propia experiencia y cómo solucioné que un blog corriendo en WordPress en un hosting shared (es decir compartido) con picos de 100 mil visitas por día no se caiga ni sature el servidor.
reducir consumo CPU Wordpress

Como sabemos (debes saberlo, si no haz como que ya lo sabías), WordPress es un maravilloso CMS muy (demasiadísimo) versátil y adaptable que tiene una sola contra y que versión nueva a versión nueva, no logra "solucionarse": El excesivo consumo de CPU que produce.

Mientras sean cien o mil visitas no hay problema. No es nada que no se pueda solucionar con alguno de los tantos plugins de cacheo que existen. Ahora, cuando las visitas diarias aumentan (y el tráfico dentro del blog que esas visitas generan es mucho) la cosa se complica.

Vamos al grano:

Tengo el blog Gran Hermano 2011 que cuatro días a la semana presenta picos de casi 100 mil visitas por día y casi 200 mil páginas vistas más o menos.
stats GH2011.com.ar

Lo tengo alojado en un plan Baby de Hostgator (9 USD al mes), hosting compartido. Obviamente, las primeras veces (cuando tuvo picos de 50 mil) el sitio se cayó y me mandaron tickets de soporte.

Hice algunos cambios pero volvió a caerse.Claro, los hosting shared no están preparados para soportar tamaño consumo de memoria RAM. ¿Solución? Desoí el consejo dado por HernanMDQ hace un año (en relación a otro caso similar) y contraté un plan VPS (en otra empresa). El VPS no aguantó ni media hora.

Hice de tripas corazón, lagrimeé lo malgastado y perdido en el VPS y volví arrepentido con el rabo entre las piernas a Hostgator, empresa que tras 10 años de montar webs por aquí y por allá me convencí es de las mejores que existen (y cada vez que digo que un hosting es bueno y lo recomiendo, luego me arrepiento y deja de satisfacerme, espero que esta vez no).

Y aquí vino la solución mágica que recomiendo implementar a aquellos que tengan problemas de consumo en sus blogs con WP en hosting propio (sobre todo si es un host compartido). En formato de lista, describo lo que hay que hacer:
  • Actualizar a la última versión de WP (recomendación tonta, pero necesaria)
  • Utilizar la menor cantidad de plugins posibles. Utiliza sólo aquellos realmente necesarios. (En el blog mencionado tengo sólo 9 plugins funcionando, y la mayoría son para optimizar el blog). Y actualiza los plugins a la última versión, obviamente.
  • Cuidado con los themes premium. Quedan bonitos los blogs con pirimpollos que se mueven por acá y por allá, con slides de noticias, fotitos recortadas, etc etc... Pero los themes premium, casi que por definición diría, consumen muchos recursos en el servidor.
  • Mete mano en el theme, nadie te acusará de acoso ni de nada. Mete mano para:
    a) eliminar la gran cantidad de llamadas PHP innecesarias
    que tiene. Por defecto los themes están preparados para funcionar en cualquier sitio con sólo subir y activar. Para que esto sea posible se requiere que haya varias llamadas PHP como por ejemplo a la URL del sitio o cosas como bloginfo('name'); Todo eso lo puedes reemplazar por HTML puro y duro.
    Esto:

    Es lo mismo que

    Y con la segunda forma te evitas 2 llamadas PHP que consumen los recursos de tu servidor. Haz la cuenta: 2 llamadas en cada visita X 100.000 visitas al día: 200.000 llamadas PHP innecesarias. ¿Y si eliminas las 20 consultas PHP que puedes encontrar? Haz la cuenta. Y revisa todo el theme.
    b) Yo prefiero eliminar los condicionales de las sidebar. Para qué consultar si está o no activado algún widget en el sidebar para mostrarlo o bien mostrar otro contenido, cuando la respuesta va a ser siempre la misma: mostrar el widget.
    c) Uso pocos widgets, sólo los necesarios para "comodidad" o "limpieza" o que estoy modificando seguido... El blogroll, lo incluyo a mano, HTML directo y así la mayoría de las cosas en la plantilla correspondiente... Casi no uso widgets...
    d) Nube de tags a mano. Esto puede ser tedioso. Pero el efecto de la nube de palabras claves si bien queda lindo, consume bastante recursos. Por lo que entonces a mano, selecciono yo los anchor text que prefiero que aparezcan, y que apunten a la URL que yo quiera (a veces no es a una tag, sino a un post o a otro contenido) y con el title que más me gusta. De paso hago SEO on page. 2 pájaros de 1 tiro.
  •  Reemplazar sistema de comentarios. Un blog sin comentarios no es un blog, o quizás sí, pero nos perdemos una de las partes más lindas del bloggin, el feedback. Por necesidad descubrí DISQUS, y me ha resultado grato en varios sentidos: solucioné un problema relacionado al consumo de CPU del servidor (ahora de los comentarios se encarga otro), me deshice del spam automático (los robots spammers comentadores), y otra cosa más que iba a mencionar y ahora no me acuerdo. (Al utilizar Disqus borre el plugin Askimet).
  • Utilizar algunos plugins esenciales: a) WP Super Cache o W3 Total Cache. Dicen los que saben que el segundo es mejor, aunque sino lo configuras bien es lo mismo que nada. El primero es muy sencillo de configurar. b) DB Cache o DB Cache Reloaded (el segundo en la version 3.0.1 al momento de postear esto no funciona). Hay que usar uno de cada uno (o sea 2, en conjunto). c) otros alternativos, no esenciales pero pueden ser útiles: WP Smush.it (reduce el peso de las imágenes subidas en los post), SQL Monitor (me lo recomendaron en Hostgator), Optimize DB o WP Optimize.
  • Cuida el ancho de banda que tambien consume CPU. Aunque estés en un hosting que te brinde Bandwith ilimitado (como es el caso del host mencionado), si tenemos mucho trafico de ancho de banda, indirectamente (no, directamente) estamos también consumiendo recursos del servidor.
    a) La mejor opción es usar un CDN, pero que si no tienes los suficientes recursos económicos y/o conocimientos puede ser chino básico. Si usas el plugin W3 Total Cache, este plugin hasta te cachea eso, genial.
    b) ¿Qué podemos hacer? Un CDN chapucero. Esto es: usar sitios como Photobucket (tiene una version gratuita algo limitada y una version de pago por 2 o 3 dlls mensuales ilimitada) para alojar imágenes, donde puedes poner el logo, el background y todas aquellas imágenes "estáticas" que luego puedes llamar desde tu theme. También puedes incluir algunos archivos multimedia. Coloca los archivos de JavaScript y de CSS en otro hosting (ya sea propio, alguno baratito, solo te interesará el ancho de banda, o gratis...) De esta forma, reducirás bastante el ancho de banda y las peticiones realizadas a tu servidor principal, por ende, el consumo de memora del mismo.
  • Transforma a HTML estática aquellas páginas internas que más "tráfico" atraen. Yo tenía varias, y lo hice. Es sencillo. Primero había creado en WP una pagina (page, no post) sobre ver Gran Hermano 2011 en vivo, y resultó ser casi que la más buscada, una de las principales keys de tráfico vía Google. Así que Ctrl+U en Firefox (ver código fuente), copy & paste todo el código y lo pegué en un bloc de notas vacío, guardar como "nombre-que-quiero.html" tipo: todos los archivos y a subir por FTP. Luego, en el HTACCESS agregue la siguiente línea:
              Redirect 301 /URL-de-pagina-en-WP/ /URL-archivo-HTML-nuevo.html
    Y listo. No perdí posicionamiento, no perdí tráfico, y me ahorre un montón de consumo y consultas PHP y a la base de datos. Y como el sistema de comentarios lo tengo mediante DISQUS, nada cambió...
  • Después también habría que desactivar el guardado de las revisiones automáticas y eliminar ese contenido de las bases de datos, y algunas otras cositas que si bien no ayudan en forma directa a reducir el consumo en el servidor ayudan a que el blog cargue más rápido y en forma indirecta también nos terminarán beneficiando en este aspecto. Para ellos recomiendo 10 hack para optimizar y aumentar la velocidad de carga de Wordpress en Blogger Recursos.
Y con esto creo que doy por terminado mi aporte a la blogocosa wordpressera que ve crecer su blog en tráfico y no sabe como hacer aguantar el hosting.

Me queda una cosita no resulta aún: Sacar el Home del Sitio del flujo de Wordpress (es decir, que no la administre el CMS) pero a la vez que sea dinámico y automático.... Estoy haciendo algunas pruebas con magpierss, pero aún nada interesante para mostrar....

Y puf! me cansé de escribir.