Azure, ¿la mejor manera de almacenar e implementar contenido estático (por ejemplo, imágenes/css)?


Estamos a punto de implementar nuestra aplicación web.NET en un rol Web de Azure. Me pregunto cómo otros han manejado su contenido estático, específicamente imágenes y CSS. Por el momento, nuestro paquete de aplicaciones es de aproximadamente 25 mb, pero 18 mb de eso se deriva puramente de imágenes, cosas como botones de navegación, iconos y componentes de plantilla que rara vez se actualizan. ¿Sería prudente particionar esto del paquete de implementación y moverlo al almacenamiento de blob?

Tengo algunas dudas sobre este enfoque que me pregunto son válidos...

  1. 80% de nuestro sitio se ejecuta en un entorno HTTPS. ¿El acceso a imágenes en una tienda de blobs introducirá problemas de cross-scripting?

  2. Vulnerabilidad a las fugas de dinero, si alguien intenta golpear maliciosamente nuestras imágenes (la mayoría están por debajo de 20kb)?

  3. Estoy luchando para ver cómo es posible cargar archivos a un contenedor de blob (desde VS2010 + Azure SDK) con la convención de nomenclatura de directorios, por lo que no necesito reescribir ¿1000s de referencias de caminos? Aprecio que los directorios sean un concepto abstracto en contenedores blob, pero puedo escribir archivos con una barra diagonal para imitar esto en el código. Obviamente Windows no me permite hacer esto antes de subir en Visual Studio.

Cualquier pensamiento o estrategia alternativa sería bienvenida. El objetivo realmente es reducir nuestro paquete de implementación para acelerar el tiempo de implementación. También me gusta bastante la idea de descargar la imagen sirviendo a un nodo dedicado para mejorar la rendimiento en el servidor web, tal vez mi colección de imágenes es tan pequeña que apenas vale la pena molestarse?

Actualización 16 de Mayo ------------------------------------------------------------------------

Esto es lo que hice al final:

1.Transferido todas las imágenes + css a contenedores de almacenamiento blob. Mantuve la estructura de cualquier subdirectorio dentro de las carpetas de imágenes y css.

2.Se aplicó una regla de reescritura de URL en nuestra web.archivo de configuración como seguir..

  <rewrite>
    <rules>
      <rule name="imagestoazure">
      <match url="images/(.*)" />
      <action type="Redirect" url="https://xxxxx.vo.msecnd.net/images/{R:1}" />
    </rule>
  </rules>
  </rewrite>

3.Se excluyeron las carpetas images + css de la aplicación y se implementaron.

Mi despliegue ahora es mucho más pequeño y las imágenes se ejecutan desde una CDN liberando ancho de banda, mejorando las velocidades de descarga y liberando algo de carga del servidor web.

Actualización: Septiembre de 2015

Al revisar esto recientemente me encontré con la siguiente guía de Microsoft. Entra en más detalles sobre cómo puede automatizar la implementación de sus activos y cache bust usando querystrings.

Servir Contenido desde Azure CDN en Su Aplicación Web

Author: QFDev, 2013-03-05

3 answers

Algunos comentarios:

¿Sería prudente particionar esto del paquete de implementación y moverlo al almacenamiento de blob?

Absolutamente. Puedo ver muchos beneficios de hacer esto:

  1. Como ha mencionado, esto reduciría considerablemente el tamaño de su paquete, por lo que el despliegue se vuelve mucho más rápido.
  2. Una vez más, como usted mencionó, quitaría la carga de su servidor web, por lo tanto, hará que su sitio sea más receptivo.
  3. Si necesita actualizar imágenes, js, css archivos solo puede reemplazar esos archivos en el almacenamiento de blob. Si se dejaran en su paquete, tendría que volver a implementar su paquete.
  4. También podría aprovechar Windows Azure CDN que funciona fuera del almacenamiento de blob.

El 80% de nuestro sitio se ejecuta en un entorno HTTPS. Accederá a las imágenes en una tienda de blob introduce problemas de cross-scripting?

Mientras no estés leyendo el contenido a través de AJAX, no creo que te encuentres con cross-scripting problemas ( Cómo acceder a XML alojado como blob de Azure desde el sitio web de azure). Sin embargo, si su página se sirve a través de https y hace referencia a recursos estáticos a través de http, los usuarios pueden recibir mensajes de contenido mixto (seguro y no seguro).

Vulnerabilidad a fugas de dinero, si alguien intenta maliciosamente martillo nuestras imágenes (la mayoría están por debajo de 20kb)?

Eche un vistazo a los precios del ancho de banda saliente aquí: http://www.windowsazure.com/en-us/pricing/details/#header-11 . Actualmente Windows Azure está ejecutando una promoción donde hasta 5 GB de transferencia de datos es gratis y es de 0 0.12 / GB, que es bastante barato. También tendría que tener en cuenta las transacciones de almacenamiento, que también es muy barato. Yo no me preocuparía mucho por eso. En el peor de los casos, siempre podría volver a la firma de acceso compartido y proteger los recursos.

Estoy luchando para ver cómo es posibilidad de subir archivos a un blob contenedor (desde VS2010 + Azure SDK) con convención de nomenclatura de directorios así que no necesito reescribir 1000s de referencias de ruta? Agradezco los directorios son un concepto abstracto en blob containers, pero puedo escriba archivos con una barra diagonal para imitar esto en el código. Obviamente Windows no me permite hacer esto antes de cargar en Visual Studio.

Hay una serie de herramientas de terceros disponibles para usted que preservarán la estructura de carpetas de su computadora local al cargar en el almacenamiento de blob. Echa un vistazo a esta publicación del equipo de almacenamiento de Windows Azure: http://blogs.msdn.com/b/windowsazurestorage/archive/2010/04/17/windows-azure-storage-explorers.aspx. Obviamente mi favorito personal es Cloud Storage Studio de Cerebrata :) [Soy uno de los desarrolladores de ese producto]

 14
Author: Gaurav Mantri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:51

Si su paquete está creciendo demasiado grande en tamaño, tal vez pueda beneficiarse de la implementación de archivos independientes, en lugar de un solo archivo de paquete grande. Al menos en Visual Studio 2012, el Asistente de publicación ahora tiene estas opciones de implementación:

  • Web Deploy (Te animo a esto uno)
  • Paquete de implementación web
  • FTP
  • Sistema de archivos

AFAIK, Web Deploy compara los archivos de origen y destino, transfiriendo físicamente solo los diferentes files (Probablemente compara los hashes de los archivos, pero no conozco el funcionamiento interno).

De todos modos, voy a tratar de dar un poco más de información para resolver sus preguntas:

El 80% de nuestro sitio se ejecuta en un entorno HTTPS. ¿El acceso a imágenes en una tienda de blobs introducirá problemas de cross-scripting?

Gaurav Mantri ya respondió esto, pero solo para proporcionar un poco de información más reciente, HTTPS ahora es compatible para acceder a Azure CDN, por lo que podría evitar Contenido mixto mensaje. (Todavía está pendiente el soporte para el dominio personalizado / certificado SSL (solicitud de UserVoice con la información más reciente aquí).

Por cierto, usando la convención sin protocolo ( ://{domain}/{relative path}) el navegador usará exactamente el mismo protocolo HTTP o HTTPS que el documento base.

Estoy luchando para ver cómo es posible cargar archivos a un contenedor de blob (desde VS2010 + Azure SDK) con la convención de nomenclatura de directorios, por lo que no necesito reescribir 1000s de referencias de ruta? Agradezco los directorios son un concepto abstracto en contenedores blob, pero puedo escribir archivos con una barra diagonal para imitar esto en el código. Obviamente Windows no me permite hacer esto antes de subir en Visual Studio.

Sincronización de archivos estáticos con blob

Una opción de scriptable para sincronizar sus archivos estáticos es la herramienta AzCopy.

Una alternativa es este script de powershell (más información sobre este post), que, resumiendo:

  1. Hace la configuración inicial:

    $context = New-AzureStorageContext ` 
        -StorageAccountName $StorageAccount ` 
        -StorageAccountKey (Get-AzureStorageKey $StorageAccount).Primary
    
  2. Enumera todos los archivos locales en .\ Contenido y .\Scripts:

    $files = (ls -Path $ProjectPath\Content -File -Recurse) + (ls -Path $ProjectPath\Scripts -File -Recurse)
    
  3. ...y carga cada archivo en un bucle:

    foreach ($file in $files)  
        { 
            $blobFileName = (Resolve-Path $file.FullName -Relative).TrimStart('.') 
            $contentType = switch ([System.IO.Path]::GetExtension($file)) 
            { 
                ".png" {"image/png"} 
                ".css" {"text/css"} 
                ".js" {"text/javascript"} 
                default {"application/octet-stream"} 
            } 
    
            Set-AzureStorageBlobContent ` 
                -Container $StorageContainer ` 
                -Context $context ` 
                -File $file.FullName ` 
                -Blob $blobFileName ` 
                -Properties @{ContentType=$contentType} ` 
                -Force 
        } 
    

Haciendo referencia a los activos de CDN

Otro problema a resolver es cómo hacer referencia a los archivos en la CDN, en lugar de los archivos relativos. Existen diferentes soluciones, la mayoría de ellas usando funciones auxiliares para inyectar el prefijo adecuado a la ruta relativa (Algunas respuestas a la siguiente pregunta pueden ayudarlo: ASP.NET MVC Relative Paths ).

Sugiero tener una forma centralizada de construir urls de activos de CDN, incluso podría implementar algún tipo asesino de caché (para esto necesita habilitar los parámetros de cadena de consulta en Azure CDN):

Razor:

<img src="@Helper.ToCdnUrl("images/asset1.png")">

Método de ayuda:

public static string ToCdnUrl(string relativePath)
{
    string prefix = ConfigurationManager.AppSettings["CdnUrlBasePath"];
    string sufix = ConfigurationManager.AppSettings["StaticFilesVersion"];
    return String.concat(prefix, relativePath, "?v=", sufix);
}

AppSettings:

<add key="CdnUrlBasePath" value="://<yourCDNName>.vo.msecnd.net/" />
<add key="StaticFilesVersion" value="1.01" />

HTML renderizado:

<img src="://<yourCDNName>.vo.msecnd.net/images/asset1.png?v=1.01">
 4
Author: Jorge Pestano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:29:31

Si CDN o Blob Storage no son opciones, una forma sencilla de hacer que una carpeta sirva archivos en Azure (o IIS estándar) es crear un archivo Web.config dentro de la carpeta, de la siguiente manera:

<configuration>
    <system.webServer>
        <handlers>
           <clear />
            <add 
                name="StaticFile" 
                path="*" verb="*" 
                modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" 
                resourceType="Either" 
                requireAccess="Read" />
        </handlers>
        <staticContent>
            <mimeMap fileExtension=".*" mimeType="application/octet-stream" />
        </staticContent>
    </system.webServer>
</configuration> 
 3
Author: Cigano Morrison Mendez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-25 07:36:42