Dave Rendón Microsoft Azure MVP, embracing and fostering tech intensity to benefit society and thrive in a digital world.

Montar tu Blog WordPress en Azure, ¿seguro?

4 min read

wordpress Azure - wikiazure

Como sabes wikiazure es un Blog WordPress en Azure…sin embargo hace un par de semanas decidí cambiar del soporte de Clear DB hacia MySQL in App  Preview, pero algo muy repentino sucedió…acompáñame a ver esta triste historia…

Viernes 7 Abril, 2017…

Se me ha ocurrido cambiar por fin de Clear DB a otra oferta de base de datos compatible con wordpress sobre Azure, considerando varios caminos:

  • Analizando las ofertas del marketplace:

wordpress-wikiazure

  • MySql in App…creando desde cero la web app + la base de datos y después restarurar la base de datos
  • Generar la VM con mySQL y asociarlo a la instancia de webapp…

Ninguna parecía muy viable, pero para mi suerte estaba MySql in App como preview dentro del ambiente de webapp que ya tenía provisionado en Azure!

Viendo esta opción, analicé a detalle pros y cons de tener MySql in App, entre lo que resaltaban con el equipo de producto de Azure era que MySql in App no estaba diseñado para entornos de producción ni lo sería en un futuro… shit…. y ahora?

Pero… somos apasionados a aprender cierto? Entonces vamos a tratar de migrar a MySql In App Preview en un viernes por la tarde, qué podría pasar? Pues lo esperado…morimos en el intento…

Configurando MySQL in App

Configurar tu nueva base de datos MySQL es muy sencillo, todo lo que tienes que hacer es abrir tu aplicación web en el portal Azure y hacer clic en MySQL in App en la opción de la aplicación.

wordpress1-wikiazure

Cambia la opción MySQL en la aplicación a On y guarda esta configuración. Una vez realizada la creación de MySQL, das clic en la opción Administrar en la parte superior izquierda:

mysqlinapp - wikiazure

Si das click en manage, verás que se trata de un administrador de sitio PHPMyAdmin…la historia va mejorando…. Pero un momento, estamos migrando de ClearDB, Para migrar de ClearDB, te recomiendo guarda la cadena de conexion de ClearDB y obviamente un backup previo por favor!

phpmyadmin - wikiazure

Al dar export en mySQL in App te llevará un buen tiempo, dependiendo del tamaño de tu base de datos…en mi caso tuve que realizar la tarea 2 veces ya que Azure arrojó un error en ese momento sobre  mantenimiento….

MySQL in App - wikiazure

Horas después, terminó de exportar, que sigue?

Finalizar Migración de ClearDB a MySQL in App

Ir a Manage, e importar la base de datos de ClearDB, es por esto que necesitabamos la cadena de conexion, ya que con esa cadena puedes dar el siguiente paso de manera sencilla, una vez que realizas esta exportación, puedes ir a tus App Settings y eliminar la cadena de conexion de ClearDB, pero un segundo!  Antes de hacer eso necesitas hacer algunos cambios en tu wp-config…tiene sentido no?

Por default, tu conexion wordpress a tu base de datos se ve así:

define('DB_NAME', 'databasename');
define('DB_USER', 'username');
define('DB_PASSWORD', 'password');
define('DB_HOST', 'mydatabase.cloudapp.net');

En este caso, vamos a cambiar a como sigue:

$connectstr_dbhost = '';
$connectstr_dbname = '';
$connectstr_dbusername = '';
$connectstr_dbpassword = '';
 
foreach ($_SERVER as $key => $value) {
 if (strpos($key, "MYSQLCONNSTR_") !== 0) {
 continue;
 }
 
 $connectstr_dbhost = preg_replace("https://wikiazure.azureedge.net/^.*Data Source=(.+?);.*$/", "\\1", $value);
 $connectstr_dbname = preg_replace("https://wikiazure.azureedge.net/^.*Database=(.+?);.*$/", "\\1", $value);
 $connectstr_dbusername = preg_replace("https://wikiazure.azureedge.net/^.*User Id=(.+?);.*$/", "\\1", $value);
 $connectstr_dbpassword = preg_replace("https://wikiazure.azureedge.net/^.*Password=(.+?)$/", "\\1", $value);
}
 
define('DB_NAME', $connectstr_dbname);
define('DB_USER', $connectstr_dbusername);
define('DB_PASSWORD', $connectstr_dbpassword);
define('DB_HOST', $connectstr_dbhost);

TIP: 

La instancia de MySql in App sólo escucha localmente, así que sólo el puerto será lo que debas cambiar en tu caso. Es por eso que necesitas descargar la cadena, que es administrada por AppService.

Todo user id es ‘azure’ y la contraseña es ‘password’

OK…hasta aquí todo iba bien…parecía que estaba logrando el objetivo, hasta que horas después intento entrar al sitio y aparece el casi perfecto 404…  

Qué hago? Reviso la configuración, la instancia de la webapp, el wp-config, el ASE, nada…. simplemente no había manera de volver…. así que restauré la conexion de ClearDB mientras conseguía hacer funcionar mySQL in App… volví a realizar todo el proceso… nada funcionó… (a este punto ya había creado otro post y un demo el cual se perdió y tuve que volver a realizar)… abrí un ticket de soporte…

 10 Abril, 2017

Soporte de Azure y recomendaciones ?

Abrí un ticket… primer respuesta:

  1. ¿Qué tipo de base de datos tienes? MySQL in App o ClearDB
  2. ¿Qué información perdiste despúes de la caida?
  3. ¿Qué día y hr tuviste el problema?
  4. ¿Generaste algun backup de esta base de datos?

la caída que tuviste fue por que se actualizó el WordPress. Hemos visto algunos casos en que estas actualizaciones corrompen los sitios con algunos temas y plugins, les recomendamos a los clientes desactivar estas actualizaciones y hacer siempre backups antes de actualizar a una version actual.

 
 
Para desactivar estas actualizaciones debes colocar en tu archivo wp-config.php
define( ‘AUTOMATIC_UPDATER_DISABLED’, true ); para desactivar todas las actualizaciones
o
define( ‘WP_AUTO_UPDATE_CORE’, false ); para desactivar a nivel core.
 
 
Si quieres manejar las actualizaciones de los temas y plugins, puedes agregar estas líneas en tu wp-config.php para cancelar las actualizaciones automáticas y que puedas manejar las actualizaciones manuales en un ambiente de QA.
 
add_filter( ‘auto_update_plugin’, ‘__return_false’ );
add_filter( ‘auto_update_theme’, ‘__return_false’ );
 
You can use __return_false instead of __return_true to specifically disable all plugin & theme updates, even forced security pushes from the WordPress security team.
 
 
 
¿Queria preguntarte si tienes activado Local Cache en este sitio web en los App Settings?
 
local-cache-wikiazure
 
Te pregunto si tienes esta opción activado por que esta opción no la recomendamos para ambientes con WordPress ya que todos los post o archivos estáticos se guardan en cache y no en filesystem.
 
Lamentablemente los clientes que ocupan MySQL in App deben realizar backups periodicos por si hay necesidad de restaurar la base de datos por alguna actualización.
 
En este escenario, le recomiendo desactivar Local Cache y Dynamic Cache
 
-Para desactivar Local cache, simplemente elimine el setting.
-Para desactivar Dynamic Cache, coloque WEBSITE_DYNAMIC_CACHE con el valor de 0

Resolución final del equipo de soporte de Azure?

 La respuesta de soporte fue:
“Oficialmente no hay solución para este incidente”, se sugiere automatizar backups con esta herramienta: https://codex.wordpress.org/Backing_Up_Your_Database#Using_WordPress_Database_Backup_Plugin…



Probando varios caminos, personalmente sugiero automatizar Backups por medio de BackWPup, por que permite enviar el backup hacia Dropbox, Azure storage y varias opciones adicionales

Al final logré restaurar MySQL in App , pero ahora al punto, ¿vale la pena migrar a MySQL in App? ¿ Cómo va el Performance?

En resumen, si tu webapp wordpress es crítica pero tienes posibilidar generar un slot y probar, adelante! a mi punto personal con esta instancia específica de wordpress ha ido bastante bien, he añadido un CDN endpoint para mejorar el rendimiento, caching y compression. Por otro lado también funciona muy bien el soporte hacia instancias con mySQL sobre alguna VM.

¿Cómo mejorar el performance de tu Azure WebApp?

Para optimizar WordPress las recomendaciones son las siguientes:

1.- Instalar WP Super Cache plugin, y habilitar Cache

caching-on-wikiazure
 

2. Utilizar CDN en WordPress

https://blogs.msdn.microsoft.com/azureossds/2015/04/27/improving-wordpress-performance-use-azure-cdn/ https://docs.microsoft.com/en-us/azure/cdn/cdn-create-new-endpoint

¿Qué tipo de CDN estas utilizando?  ¿Azure o uno externo? 

Tu configuración con el Azure CDN debe ser como el siguiente ejemplo:

-Tu endpoint:

cdn-endpoint

 

Compresion habilitada y debe tener estas opciones:

cdn-configure wikiazure

 En Cache es mejor dejar el default, ya que generará un key por cada query string y tratandose de WordPress son demasiadas keys.

 
cdn-configure2 wikiazure
 

Te recomiendo que instales este plugin WP Super Cache para activar cache a nivel WordPress y tambien configurar tu CDN con este cache.

 

caching-wikiazure
 

Instala un plugin adicional: “CDN Enabler”

 

cdn-enabler wikiazure
 

Haciendo esto se redujo de 512 ms a 113 ms, se incrementó el performance.

TIP: Si estas utilizando alguna fuente o recurso específico que no esté cargando correctamente o muestre un error de CORS: En el wp-caché elimina el cdn support, y en el cdn-enabler añade wp-content y wp-includes como directorios para el cdn pero excluye el directorio de algunos plugins específicos que te generen conflicto y adicionalmente prueba cambiar el endpoint de azure, a un custom sin el www. y haz un purge.
 

Mejores prácticas complementarias. 

Configura los backups automáticos de tu webapp(Backups en Azure y a través del plugin BackWPup) y monitorea el servicio de tu webapp con alguna herramienta, podría ser Operations Management Suite.

Si estás utilizando tu Web app con MySQL in-app en modo Basic, Standard o Premium, configura ALWAYS ON en los app settings. Por default,  las web apps no cargan de manera correcta si permanecen en un estado inactivo durante un período de tiempo. Con ALWAYS ON, puedes asegurar que tu web app no caerá en algún estado inactivo.

Es la solución final? No, Azure siempre mejora y vamos buscando el mejor performance de nuestro aplicativo con las nuevas características!

Dave Rendón Microsoft Azure MVP, embracing and fostering tech intensity to benefit society and thrive in a digital world.

One Reply to “Montar tu Blog WordPress en Azure, ¿seguro?”

Leave a Reply

Your email address will not be published. Required fields are marked *