image - started - Azure, la mejor manera de almacenar e implementar contenido estático(por ejemplo, imágenes/css)?
storage azure c# (3)
Algunos comentarios:
¿Sería aconsejable dividir esto del paquete de implementación y moverlo al almacenamiento de blobs?
Absolutamente. Puedo ver muchos beneficios de hacer esto:
- Como mencionó, esto reduciría considerablemente el tamaño de su paquete, por lo que el despliegue se vuelve mucho más rápido.
- Nuevamente, como mencionaste, quitaría la carga de tu servidor web, por lo que tu sitio responderá mejor.
- Si necesita actualizar archivos de imágenes, js, css, puede reemplazar esos archivos en almacenamiento de blobs. Si se dejaran en su paquete, necesitaría volver a implementar su paquete.
- También puede aprovechar Windows Azure CDN, que funciona sin almacenamiento de blobs.
El 80% de nuestro sitio se ejecuta en un entorno HTTPS. ¿El acceso a las imágenes en una tienda de blob introduce problemas de scripting cruzado?
Siempre y cuando no estés leyendo los contenidos a través de AJAX, no creo que te encuentres con problemas de scripts cruzados ( Cómo acceder a XML alojado como blob azul desde el sitio web de azure ). Sin embargo, si su página se sirve a través de https y usted hace referencia a recursos estáticos a través de http, sus usuarios pueden recibir mensajes de contenido mixto (seguro y no seguro).
¿Vulnerabilidad a fugas de dinero, si alguien intenta martillar maliciosamente nuestras imágenes (la mayoría tienen menos de 20kb)?
Eche un vistazo a los precios del ancho de banda de salida aquí: http://www.windowsazure.com/en-us/pricing/details/#header-11 . Actualmente, Windows Azure está ejecutando una promoción en la que hasta 5 GB de transferencia de datos son gratuitos y cuesta $ 0,12 / GB, lo que es bastante barato. También necesitaría tener en cuenta las transacciones de almacenamiento, que también son muy baratas. No me preocuparía demasiado al respecto. En el peor de los casos, siempre puede volver a la firma de acceso compartido y proteger los recursos.
Estoy luchando para ver cómo es posible cargar archivos en un contenedor blob (desde VS2010 + Azure SDK) con la convención de nomenclatura de directorios, así que no necesito reescribir miles de referencias de ruta. Aprecio que los directorios sean un concepto abstracto en contenedores blob, pero puedo escribir archivos con una barra inclinada 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 cuando cargue en almacenamiento de blobs. Eche un vistazo a esta publicación del blog 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]
Estamos a punto de implementar nuestra aplicación web .NET en una función 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 se deriva exclusivamente de imágenes, como botones de navegación, iconos y componentes de plantillas que rara vez se actualizan. ¿Sería aconsejable dividir esto del paquete de implementación y moverlo al almacenamiento de blobs?
Tengo algunas dudas sobre este enfoque que me pregunto son válidas ...
El 80% de nuestro sitio se ejecuta en un entorno HTTPS. ¿El acceso a las imágenes en una tienda de blob introduce problemas de scripting cruzado?
¿Vulnerabilidad a fugas de dinero, si alguien intenta martillar maliciosamente nuestras imágenes (la mayoría tienen menos de 20kb)?
Estoy luchando para ver cómo es posible cargar archivos en un contenedor blob (desde VS2010 + Azure SDK) con la convención de nomenclatura de directorios, así que no necesito reescribir miles de referencias de ruta. Aprecio que los directorios sean un concepto abstracto en contenedores blob, pero puedo escribir archivos con una barra inclinada para imitar esto en el código. Obviamente, Windows no me permite hacer esto antes de cargar 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 que se sirve a un nodo dedicado para mejorar el 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 los contenedores de almacenamiento de blob. Mantuve la estructura de cualquier subdirectorio dentro de las imágenes y las carpetas css.
2. Aplicamos una regla de reescritura de URL en nuestro archivo web.config de la siguiente manera ..
<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 implementación ahora es mucho más pequeña y las imágenes se están ejecutando en un CDN, lo que libera ancho de banda, mejora las velocidades de descarga y libera algo de carga del servidor web.
Actualización: septiembre de 2015
Al revisar esto recientemente, encontré la siguiente guía de Microsoft. Incluye más detalles sobre cómo puede automatizar la implementación de sus activos y el descando de caché utilizando cadenas de caracteres.
Si CDN o Blob Storage no son opciones, una manera simple de hacer que una carpeta sirva archivos en Azure (o IIS estándar) es crear un archivo Web.config
dentro de la carpeta, como este:
<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>
Si su paquete crece demasiado, tal vez pueda beneficiarse de la implementación de archivos independientes, en lugar de un gran archivo de paquete único. Al menos en Visual Studio 2012, el asistente de publicación ahora tiene estas opciones de implementación:
- Web Deploy (te animo a ti)
- Paquete de implementación web
- FTP
- Sistema de archivos
AFAIK, Web Deploy compara los archivos de origen y de destino, transfiriendo físicamente solo los diferentes archivos (Probablemente compara los hashes de los archivos, pero no conozco las partes internas).
De todos modos, trataré de darle más información para resolver sus preguntas:
El 80% de nuestro sitio se ejecuta en un entorno HTTPS. ¿El acceso a las imágenes en una tienda de blob introduce problemas de scripting cruzado?
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 el mensaje de contenido mixto . (Todavía está pendiente el soporte para el dominio personalizado / Certificado SSL (solicitud de UserVoice con la información más reciente here ).
Por cierto, utilizando la convención sin protocolo ( ://{domain}/{relative path}
), el navegador utilizará exactamente el mismo protocolo HTTP o HTTPS que el documento base.
Estoy luchando para ver cómo es posible cargar archivos en un contenedor blob (desde VS2010 + Azure SDK) con la convención de nomenclatura de directorios, así que no necesito reescribir miles de referencias de ruta. Aprecio que los directorios sean un concepto abstracto en contenedores blob, pero puedo escribir archivos con una barra inclinada para imitar esto en el código. Obviamente, Windows no me permite hacer esto antes de cargar en Visual Studio.
Sincronizando archivos estáticos a blob
Una opción de scripts para sincronizar sus archivos estáticos es la herramienta AZCopy .
Una alternativa es este script de PowerShell (más información sobre esta post ), que, resumiendo:
¿La configuración inicial:
$context = New-AzureStorageContext ` -StorageAccountName $StorageAccount ` -StorageAccountKey (Get-AzureStorageKey $StorageAccount).Primary
Enumera todos los archivos locales en. / Content y. / Scripts:
$files = (ls -Path $ProjectPath/Content -File -Recurse) + (ls -Path $ProjectPath/Scripts -File -Recurse)
... 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 }
Hacer referencia a los activos de CDN
Otro problema para resolver es cómo hacer referencia a los archivos en el CDN, en lugar de los archivos relativos. Existen diferentes soluciones, la mayoría de ellas usan funciones auxiliares para inyectar al prefijo apropiado en 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 de asesino de caché (para esto debe habilitar los parámetros de cadena de consulta en Azure CDN):
Maquinilla de afeitar:
<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);
}
Ajustes de Aplicacion:
<add key="CdnUrlBasePath" value="://<yourCDNName>.vo.msecnd.net/" />
<add key="StaticFilesVersion" value="1.01" />
HTML procesado:
<img src="://<yourCDNName>.vo.msecnd.net/images/asset1.png?v=1.01">