WordPress sobre Azure

Windows Azure es una plataforma interoperable. Un buen ejemplo de ello es el siguiente post de Mario Cortés Flores, MVP en Office365, que nos enseña cómo configurar WordPress y PHP sobre Azure utilizando WordPress Accelerator:

 

WordPress es una herramienta de código libre pensada para la publicación de contenidos en Internet y blogging, basada en PHP utiliza como base de datos por defecto MySql. Utilizando Windows Azure y Sql Azure como plataforma de WordPress se pueden conseguir ahorro en costes de mantenimientos e infraestructuras además de conseguir una alta disponibilidad en el servicio y los datos.

Configurar WordPress sobre Azure no se diferencia mucho de configurar WordPress sobre Windows, en lugar de una instancia de Sql Server local se utilizará SqlAzure y en lugar de almacenar las imágenes en una carpeta local se utilizará el Blob Storage. A la hora de instalar WordPress en Azure para no tener que empezar desde cero dispone en CodePlex de Windows Azure WordPress Accelerator, que consiste en una solución gratuita que facilita el despliegue de WordPress sobre Windows Azure utilizando como base de datos SQL Azure.

WordPress Accelerator contiene dos soluciones distintas:

 

image

Antes de empezar

Antes de empezar a trabajar con Windows Azure puede que necesites tener instaladas algunas herramientas:

image

Visual Studio. Si ya tienes VS instalado perfecto, pero por si acaso, aquí tienes el enlace de descarga de la versión gratuita express o de la Ultimate Trial

image

SDK de Windows Azure. Contiene las herramientas para Visual Studio y las librerías necesarias para trabajar en proyectos de Windows Azure.

 

Trial gratuita de Azure y SQL Azure. Consigue recursos gratis durante 90 días en Azure y SQL Azure.

Para desplegar la solución debe obtener una suscripción de Azure, puede obtener una subscripción de prueba con hasta 750 horas de proceso y almacenamiento gratuito. Desde el portal de configuración de Azure https://windows.azure.com/ podrá crear un servicio hospedado y disponer de almacenamiento no relacional mediante el Blob Storage o almacenamiento relacional con SqlAzure.

La configuración y despliegue de WordPress sobre Azure se realiza mediante un paquete de Azure .cspkg que contiene todos los ficheros que se copiarán en las instancias de Azure y mediante un fichero .cscfg la configuración a aplicar. La creación de estos paquetes se realiza desde Visual Studio 2010 mediante un proyecto del tipo Windows Azure Project. Sobre estas soluciones podremos crear dos tipos de proyectos: los WebRole para dar soporte a páginas y servicios web, y los WorkerRole pensados para procesos en background. Para disponer de PHP sobre Windows Azure se utiliza un proyecto del tipo CGI Web Role que permite la ejecución de extensiones no ASP.Net como puedan ser PHP, Phyton o Ruby. Copie en el proyecto las extensiones de PHP que encontrará desde la página https://windows.php.net/download/ como versión “Non thread Safe”. Los valores de configuración de PHP se indican mediante el fichero “PHP.ini”, asegúrese de cambiar desde Visual Studio en las propiedades del fichero la propiedad “Build action” a “Content” para que se copie como contenido.

Sobre el fichero PHP.ini se deben realizar algunas modificaciones indicadas en el siguiente listado:

upload_tmp_dir="C:\Windows\Temp"

session.save_path="C:\Windows\Temp"

error_log="C:\Windows\temp\php-errors.log"

cgi.force_redirect=0

fastcgi.impersonate=1

fastcgi.logging=0

error_reporting = E_ERROR

display_errors = Off

track_errors = Off

A continuación modifique el fichero ServiceDefinition.csdef y comente el elemento “Sites”:

<ServiceDefinition name="MiProyecto" xmlns="https://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">

  <WebRole name="WebCgiRole1" enableNativeCodeExecution="true">

   <!--<Sites>

     <Site name="Web">

        <Bindings>

          <Binding name="Endpoint1" endpointName="Endpoint1" />

        </Bindings>

     </Site>

   </Sites>-->

   <Endpoints>

     <InputEndpoint name="Endpoint1" protocol="http" port="80" />

   </Endpoints>

   <Imports>

     <Import moduleName="Diagnostics" />

   </Imports>

  </WebRole>

Para mejorar el rendimiento de PHP sobre Windows se utiliza FastCGI sobre IIS, desde el proyecto tendrá que configurarlo modificando el fichero web.roleconfig de la aplicación web, desde la sección “fastCgi” agregue un elemento “Application” indicando en el atributo “fullPath” la ruta donde se encuentra el fichero “php-cgi.exe” en su proyecto como se indica en el siguiente listado. Observe que para indicar una carpeta a partir del proyecto en lugar de utilizar rutas absolutas se ha utilizado “%RoleRoot%\approot” que corresponde a la carpeta en la instancia de Azure donde se copiarán los ficheros del proyecto.

upload_tmp_dir="C:\Windows\Temp"

session.save_path="C:\Windows\Temp"

error_log="C:\Windows\temp\php-errors.log"

cgi.force_redirect=0

fastcgi.impersonate=1

fastcgi.logging=0

error_reporting = E_ERROR

display_errors = Off

track_errors = Off

A continuación modifique el fichero web.config para registrar el manejador de FastCGI en su aplicación web para todas las peticiones a páginas con extensión .PHP:

<handlers>

         <add name="FastGGIHandler"

                  verb="*"

                  path="*.php"

                  scriptProcessor="%RoleRoot%\approot\php\php-cgi.exe"

                  modules="FastCgiModule"

                  resourceType="Unspecified" />

Para probar el funcionamiento de PHP pruebe a crear un fichero con extensión .php y agregue el contenido del siguiente listado y ejecute el emulador de Azure presionando F5. En caso de haber configurado correctamente las extensiones PHP aparecerá una pantalla con las configuraciones de PHP.

<?php

phpinfo();

?>

El siguiente paso consistirá en configurar el driver de Sql server para PHP, descargue SQL Server driver for php 2.0 y copie la librería “php_sqlsrv_53_nts_vc9.dll” a la carpeta de extensiones de PHP “ext” en su proyecto. Vuelva a modificar su fichero PHP.ini para registrar el nuevo driver como se indica a continuación:

extension_dir = "./ext"

extension= php_sqlsrv_53_nts_vc9.dll

extension=php_curl.dll

Descargue la versión de WordPress para Sql Server desde la página https://wordpress.visitmix.com/ . Descomprima el fichero y extraiga el contenido de la carpeta “wordpress” al directorio de su proyecto Visual Studio. La configuración de WordPress se realiza desde el fichero “wp-config.php”. Edite este fichero y especifique los valores de conexión a su base de datos de forma similar al siguiente ejemplo.

define('DB_NAME', 'wordpress');

define('DB_USER', 'username@servername');

define('DB_PASSWORD', 'MyPassword');

define('DB_HOST', 'servername.database.windows.net');

define('DB_CHARSET', 'utf8');

define('DB_COLLATE', '');

 

define('DB_TYPE', 'sqlsrv');

Antes de realizar un despliegue sobre Azure podrá probar previamente su proyecto desde Windows Azure Emulator utilizando una instancia de Sql local en lugar de Sql Azure, utilizando un usuario de tipo Sql Server.

image

Para utilizar una base de datos de SqlAzure debe conseguir una subscripción de Sql Azure desde la página https://windows.azure.com/Default.aspx desde la sección “Base de datos” cree una nueva suscripción a SQL Azure y un nuevo servidor SQL Azure. Sobre el nuevo servidor tendrá que crear una nueva base de datos del tipo Web o Bussiness en función de sus necesidades de volumen.

Puede probar la conexión a SQL Azure desde Sql ServerManagement 2008 abriendo una conexión indicando en “nombre de servidor” un valor del tipo servername.database.windows.net donde servername corresponde con el nombre de la instancia de SQL Azure, seleccione autenticación Sql e introduzca el usuario y password de su usuario Sql Azure. Si en el momento de conectar encuentra un error del tipo “Cannot open server 'ServerName' requested by the login. Client with IP address ‘xx.xx.xx.xx' is not allowed to access the server… ” tendrá que registrar en SQL Azure su IP pública como segura desde la sección “Firewall rules” añadiendo un rango de IP el que se encuentra el equipo desde donde intenta acceder a SQL Azure. Para que las instancias de Azure puedan acceder a su base de datos de SQL Azure marque “Permitir que otros servicios de Azure tengan acceso a este servidor”.

El almacenamiento de imágenes en WordPress se hace desde una carpeta física ubicada en la ruta wp-contents/uploads del directorio de WordPress. El problema con el que nos encontraremos es que todo lo que almacenemos físicamente en carpetas de las instancias de Azure se perderá cuando la instancia se recicle. De manera que tendrá que utilizar el Blob Storage como sistema de almacenamiento de ficheros de forma permanente, permitiendo además compartirlo entre todas las instancias.

Mediante el plugin WordPress Azure Storage podrá almacenar las imágenes de WordPress en el Blob Storage. Al utilizar este plugin puede que la subida de imágenes resulte un poco más compleja para algunos usuarios e incluso algunos plugins puede que no entiendan las nuevas rutas de las imágenes.

Como alternativa al plugin WordPress Azure Storage se puede abstraer el almacenamiento en el Blob Storage mediante Azure Drive. Azure Drive permite cargar en las instancias de Azure un disco virtual VHD almacenado en el Blob Storage. De esta forma en lugar de acceder por URL a una imagen WordPress accederá como si fuera una unidad local en la instancia de Azure.

Puede crear un VHD vacío o subir uno creado previamente con sus imágenes ya copiadas, encontrará más información sobre cómo preparar y subir su fichero VHD a Azure desde el Training Kit de Azure mediante VHDUpload.

Azure Drive solo permite la escritura en una instancia de azure al mismo tiempo, para que todas puedan compartir la unidad en modo escritura se podrá compartir mediante SMB (carpetas compartidas). Encontrará un ejemplo sobre cómo compartir Azure Drive entre las distintas instancias en WordPress Accelerator using Windows Azure Drive.

Por último se ha utilizado un manejador de ASP.Net para simular un directorio virtual que devuelva las imágenes ubicadas en Azure Drive.

image

Algunos aspectos a tener en cuenta

Debemos ser conscientes que nuestro WordPress ya no se ejecutará en una sola máquina por lo que debemos realizar todas las actualizaciones de plugins y versiones de WordPress generando de nuevo el paquete de Azure ya que de lo contrario solo se actualizará una de las instancias. También debemos entender que al reiniciarse alguna de las instancias se perderán todos los ficheros locales por lo que se perdería también cualquier actualización.

En ocasiones nos encontraremos con que algunos plugins de WordPress no están pensados para funcionar en múltiples instancias o no para permiten cambiar las rutas locales de WordPress. Por lo que habrá que asegurarse que los plugins utilizados admiten estas casuísticas.

Por último hemos aprendido que si nuestros desarrollos o plugins no están pensados para trabajar en múltiples servidores tendremos que adaptarlos o cambiarlos por otros.

Resumen

Windows Azure nos proporciona una plataforma completa pensada para poder publicar distintos tipos de servicios no solo .NET. Hemos visto además como configurar PHP sobre Windows Azure y adaptar WordPress para funcionar sobre Azure.

Para no tener que empezar de cero en nuestro despliegue disponemos de Windows Azure WordPress Accelerator disponiendo además del código para poder adaptarlo y conocer el mejor su funcionamiento.

Autor

Mario Cortés Flores es MVP en Office365, trabaja como SharePoint Lead en Plain Concepts donde desempeña tareas de consultoría, mentoring y formación en SharePoint, Office 365 y Azure.

Es coautor del libro en español “SharePoint 2010 de principio a fin”, colabora asiduamente con la comunidad y es speaker habitual en eventos relacionados con SharePoint y Office365. Es coordinador de SUGES, HISPAPOINT y CLOUDES.

https://geeks.ms/blogs/mcortes/ 

@mariocortesf

 

Gracias a Mario por colaborar con nosotros y por poder compartir este post con vosotros :)

Un saludo,

El equipo de MSDN España