Editar

Padrão de Alojamento de Conteúdo Estático

Azure Storage

Implemente conteúdo estático num serviço de armazenamento baseado na cloud que o pode oferecer diretamente ao cliente. Este procedimento pode reduzir a necessidade de instâncias de computação possivelmente dispendiosas.

Contexto e problema

As aplicações Web incluem, geralmente, alguns elementos de conteúdo estático. Este conteúdo estático pode incluir páginas HTML e outros recursos, tais como imagens e documentos que estão disponíveis para o cliente, como parte de uma página HTML (por exemplo, ficheiros JavaScript do lado do cliente, folhas de estilo e imagens inline) ou como transferências separadas (por exemplo, documentos PDF).

Embora os servidores Web sejam otimizados para renderização dinâmica e cache de saída, eles ainda precisam lidar com solicitações para baixar conteúdo estático. Esse procedimento consome ciclos de processamento que, muitas vezes, poderiam ser mais bem utilizados.

Solução

Na maioria dos ambientes de hospedagem em nuvem, você pode colocar alguns dos recursos e páginas estáticas de um aplicativo em um serviço de armazenamento. O serviço de armazenamento pode atender a solicitações para esses recursos, reduzindo a carga sobre os recursos de computação que lidam com outras solicitações da Web. Normalmente, o custo do armazenamento alojado na cloud é muito inferior às instâncias de computação.

Ao alojar algumas partes de uma aplicação num serviço de armazenamento, as principais considerações estão relacionadas com a implementação da aplicação e com a proteção dos recursos que não se destinam a estar disponíveis para utilizadores anónimos.

Problemas e considerações

Na altura de decidir como implementar este padrão, considere os seguintes pontos:

  • O serviço de armazenamento alojado tem de expor um ponto final de HTTP ao qual os utilizadores podem aceder para transferir os recursos estáticos. Alguns serviços de armazenamento também suportam HTTPS, pelo que pode alojar recursos de anfitrião nos serviços de armazenamento que exigem SSL.

  • Para o máximo de desempenho e disponibilidade, considere utilizar uma rede de entrega de conteúdos (CDN) para colocar em cache o conteúdo do contentor de armazenamento em vários datacenters em todo o mundo. No entanto, provavelmente, terá de pagar para utilizar a CDN.

  • As contas de armazenamento são frequentemente georreplicadas por predefinição para proporcionar resiliência contra eventos que podem afetar um datacenter. Tal significa que o endereço IP poderá ser alterado, mas o URL permanece o mesmo.

  • Quando algum conteúdo está localizado em uma conta de armazenamento e outro conteúdo está em uma instância de computação hospedada, torna-se mais difícil implantar e atualizar o aplicativo. Talvez seja necessário executar implantações separadas e fazer a versão do aplicativo e do conteúdo para gerenciá-lo mais facilmente, especialmente quando o conteúdo estático inclui arquivos de script ou componentes da interface do usuário. No entanto, se apenas recursos estáticos tiverem de ser atualizados, estes poderão simplesmente ser carregados para a conta de armazenamento sem ter de voltar a implementar o pacote de aplicações.

  • Os serviços de armazenamento podem não suportar a utilização de nomes de domínio personalizados. Neste caso, é necessário especificar a URL completa dos recursos em links, pois eles estarão em um domínio diferente do conteúdo gerado dinamicamente que contém os links.

  • Os contentores de armazenamento têm de ser configurados para o acesso de leitura público, mas é vital garantir que não estão configurados para o acesso de escrita público para impedir que os utilizadores possam carregar conteúdo.

  • Considere usar uma chave de manobrista ou token para controlar o acesso a recursos que não deveriam estar disponíveis anonimamente. Consulte o padrão de chave de manobrista para obter mais informações.

Quando utilizar este padrão

Este padrão é útil nas seguintes situações:

  • Minimizar o custo de alojamento de sites e aplicações que contém alguns recursos estáticos.

  • Minimizar o custo de alojamento para sites que consistem apenas em conteúdo estático e recursos. Dependendo dos recursos do sistema de armazenamento do provedor de hospedagem, talvez seja possível hospedar totalmente um site totalmente estático em uma conta de armazenamento.

  • Expor conteúdos e recursos estáticos para aplicações em execução noutros ambientes de alojamento ou nos servidores no local.

  • Localizar conteúdo em mais de uma área geográfica através de uma rede de entrega de conteúdos que coloca em cache os conteúdos da conta de armazenamento em vários datacenters em todo o mundo.

  • Monitorizar a utilização da largura de banda e os custos. Utilizar uma conta de armazenamento separada para algum ou todo o conteúdo estático permite que os custos sejam mais facilmente separados dos custos de tempo de execução e do alojamento.

Este padrão pode não ser prático nas seguintes situações:

  • A aplicação tem de realizar algum processamento no conteúdo estático antes de o entregar ao cliente. Por exemplo, poderá ser necessário adicionar um carimbo a um documento.

  • O volume de conteúdo estático é muito pequeno. A sobrecarga de obtenção deste conteúdo do armazenamento separado pode prevalecer sobre as vantagens de custo ao separá-lo do recurso de computação.

Design da carga de trabalho

Um arquiteto deve avaliar como o padrão de Hospedagem de Conteúdo Estático pode ser usado no design de sua carga de trabalho para abordar as metas e os princípios abordados nos pilares do Azure Well-Architected Framework. Por exemplo:

Pilar Como esse padrão suporta os objetivos do pilar
A Otimização de Custos está focada em sustentar e melhorar o retorno do investimento da sua carga de trabalho. Os hosts de aplicativos dinâmicos geralmente são mais caros do que os hosts estáticos porque os hosts dinâmicos podem executar sua lógica de negócios codificada. Usar uma plataforma de aplicativos para fornecer conteúdo estático não é econômico.

- CO:09 Custos de fluxo
- CO:10 Custos de dados
A Eficiência de Desempenho ajuda sua carga de trabalho a atender às demandas de forma eficiente por meio de otimizações em escala, dados e código. Transferir a responsabilidade para um host externalizado ajuda a reduzir o congestionamento e permite que você use sua plataforma de aplicativos apenas para fornecer lógica de negócios.

- PE:07 Código de uma infraestrutura

Como em qualquer decisão de design, considere quaisquer compensações em relação aos objetivos dos outros pilares que possam ser introduzidos com esse padrão.

Exemplo

O Armazenamento do Azure dá suporte ao fornecimento de conteúdo estático diretamente de um contêiner de armazenamento. Os ficheiros são servidos através de pedidos de acesso anónimos. Por padrão, os arquivos têm uma URL em um subdomínio de core.windows.net, como https://contoso.z4.web.core.windows.net/image.png. Você pode configurar um nome de domínio personalizado e usar a CDN do Azure para acessar os arquivos por HTTPS. Para obter mais informações, consulte Hospedagem de site estático no Armazenamento do Azure.

Fornecimento de partes estáticas de um aplicativo diretamente de um serviço de armazenamento

A hospedagem estática de sites disponibiliza os arquivos para acesso anônimo. Se precisar controlar quem pode acessar os arquivos, você pode armazenar arquivos no armazenamento de blob do Azure e, em seguida, gerar assinaturas de acesso compartilhado para limitar o acesso.

Os links nas páginas entregues ao cliente devem especificar a URL completa do recurso. Se o recurso estiver protegido com uma chave de manobrista, como uma assinatura de acesso compartilhado, essa assinatura deverá ser incluída na URL.

Um aplicativo de exemplo que demonstra o uso de armazenamento externo para recursos estáticos está disponível no GitHub. Este exemplo usa arquivos de configuração para especificar a conta de armazenamento e o contêiner que contém o conteúdo estático.

<Setting name="StaticContent.StorageConnectionString"
         value="UseDevelopmentStorage=true" />
<Setting name="StaticContent.Container" value="static-content" />

A classe Settings, no ficheiro Settings.cs do projeto StaticContentHosting.Web, contém métodos para extrair estes valores e criar um valor de cadeia que contém o URL do contentor da conta de armazenamento na cloud.

public class Settings
{
  public static string StaticContentStorageConnectionString {
    get
    {
      return RoleEnvironment.GetConfigurationSettingValue(
                              "StaticContent.StorageConnectionString");
    }
  }

  public static string StaticContentContainer
  {
    get
    {
      return RoleEnvironment.GetConfigurationSettingValue("StaticContent.Container");
    }
  }

  public static string StaticContentBaseUrl
  {
    get
    {
        var blobServiceClient = new BlobServiceClient(StaticContentStorageConnectionString);

        return string.Format("{0}/{1}", blobServiceClient.Uri.ToString().TrimEnd('/'), StaticContentContainer.TrimStart('/'));
    }
  }
}

A classe StaticContentUrlHtmlHelper, no ficheiro StaticContentUrlHtmlHelper.cs, expõe um método denominado StaticContentUrl, que gerará um URL com o caminho para a conta de armazenamento na cloud se o URL transmitido começar com o caráter do caminho da raiz do ASP.NET (~).

public static class StaticContentUrlHtmlHelper
{
  public static string StaticContentUrl(this HtmlHelper helper, string contentPath)
  {
    if (contentPath.StartsWith("~"))
    {
      contentPath = contentPath.Substring(1);
    }

    contentPath = string.Format("{0}/{1}", Settings.StaticContentBaseUrl.TrimEnd('/'),
                                contentPath.TrimStart('/'));

    var url = new UrlHelper(helper.ViewContext.RequestContext);

    return url.Content(contentPath);
  }
}

O ficheiro Index.cshtml, na pasta Vistas\Início, contém um elemento de imagem que utiliza o método StaticContentUrl para criar o URL para o seu atributo src.

<img src="@Html.StaticContentUrl("~/media/orderedList1.png")" alt="Test Image" />

Próximos passos

  • Exemplo de hospedagem de conteúdo estático. Um aplicativo de exemplo que demonstra esse padrão.
  • Padrão de Chave Valet. Se os recursos de destino não devem estar disponíveis para usuários anônimos, use esse padrão para restringir o acesso direto.
  • Aplicativo Web sem servidor no Azure. Uma arquitetura de referência que usa hospedagem de site estático com o Azure Functions para implementar um aplicativo Web sem servidor.