Implante conteúdo estático em um serviço de armazenamento baseado em nuvem que pode enviá-lo diretamente para o cliente. Isso pode reduzir a necessidade de instâncias de computação potencialmente caras.
Contexto e problema
Aplicativos Web geralmente incluem alguns elementos de conteúdo estático. Este conteúdo estático pode incluir páginas HTML e outros recursos como imagens e documentos que estão disponíveis para o cliente, como parte de uma página HTML (tal como imagens embutidas, folhas de estilo e arquivos JavaScript do lado do cliente) ou como downloads separados (como documentos PDF).
Embora os servidores Web sejam otimizados para renderização dinâmica e cache de saída, eles ainda precisarão lidar com solicitações para fazer o download de conteúdo estático. Isso consome ciclos de processamento que muitas vezes poderiam ser melhor usados em outros locais.
Solução
Na maioria dos ambientes de hospedagem em nuvem, você pode colocar alguns dos recursos e páginas estáticas do aplicativo em um serviço de armazenamento. O serviço de armazenamento pode atender solicitações para esses recursos, reduzindo a carga nos recursos de computação que lidam com outras solicitações da Web. O custo do armazenamento hospedado em nuvem normalmente é muito menor que o de instâncias de computação.
Ao hospedar algumas partes de um aplicativo em um serviço de armazenamento, as principais considerações estão relacionadas à implantação do aplicativo e à proteção de recursos que não devem estar disponíveis para os usuários anônimos.
Problemas e considerações
Considere os seguintes pontos ao decidir como implementar esse padrão:
O serviço de armazenamento hospedado deve expor um ponto de extremidade HTTP que os usuários podem acessar para baixar os recursos estáticos. Alguns serviços de armazenamento também dão suporte a HTTPS, portanto, é possível hospedar recursos nos serviços de armazenamento que exigem SSL.
Para obter o máximo de desempenho e disponibilidade, considere usar uma CDN (rede de distribuição de conteúdo) para armazenar em cache o conteúdo do contêiner de armazenamento em vários datacenters ao redor do mundo. No entanto, você provavelmente precisará pagar para usar a CDN.
Geralmente, as contas de armazenamento são replicados geograficamente por padrão para oferecer resiliência contra eventos que podem afetar um data center. Isso significa que o endereço IP pode mudar, mas a URL permanecerá a mesma.
Quando parte do conteúdo está localizado em uma conta de armazenamento e outras partes do conteúdo estão em uma instância de computação hospedada, é mais difícil implantar e atualizar o aplicativo. Pode ser necessário executar implantações separadas e controlar a versão do aplicativo e do conteúdo para gerenciá-la mais facilmente, especialmente quando o conteúdo estático inclui arquivos de script ou componentes de interface do usuário. No entanto, se apenas recursos estáticos devem ser atualizados, eles podem simplesmente ser carregados para a conta de armazenamento sem precisar reimplantar o pacote de aplicativos.
Os serviços de armazenamento podem não dar suporte ao uso de nomes de domínio personalizados. Nesse caso é necessário especificar a URL completa dos recursos nos links porque eles estarão em um domínio diferente do conteúdo gerado dinamicamente que contém os links.
Os contêineres de armazenamento devem ser configurados para acesso de leitura público, mas é essencial garantir que eles não estejam configurados para acesso de gravação público para impedir que os usuários possam carregar o conteúdo.
Considere usar uma chave limitada ou token para controlar o acesso aos recursos que não devem estar disponíveis anonimamente. Confira o padrão de Chave Limitada para ver mais informações.
Quando usar esse padrão
Esse padrão é útil para:
Minimizar o custo de hospedagem de sites e aplicativos que contêm alguns recursos estáticos.
Minimizar o custo de hospedagem de sites compostos somente por conteúdo e recursos estáticos. Dependendo das funcionalidades do sistema de armazenamento do provedor de hospedagem, seria possível hospedar inteiramente um site totalmente estático em uma conta de armazenamento.
Expor os recursos e conteúdo estático para aplicativos em execução em outros ambientes de hospedagem ou nos servidores locais.
Localizar conteúdo em mais de uma área geográfica usando uma rede de distribuição de conteúdo que armazena em cache o conteúdo da conta de armazenamento em vários datacenters ao redor do mundo.
Monitorar os custos e uso de largura de banda. Usar uma conta de armazenamento separada para parte ou todo o conteúdo estático permite que os custos sejam separados mais facilmente dos custos de hospedagem e de runtime.
Esse padrão pode não ser útil nas seguintes situações:
O aplicativo precisa executar processamento no conteúdo estático antes de distribuí-lo para o cliente. Por exemplo, pode ser necessário adicionar um carimbo de data/hora a um documento.
O volume do conteúdo estático é muito pequeno. A sobrecarga de recuperar o conteúdo do armazenamento separado pode superar o benefício de custo de separá-lo do recurso de computação.
Design de carga de trabalho
Um arquiteto deve avaliar como o padrão Hospedagem de Conteúdo Estático pode ser usado no design das suas cargas de trabalho para abordar os objetivos e os princípios discutidos nos pilares do Azure Well-Architected Framework. Por exemplo:
Pilar | Como esse padrão apoia os objetivos do pilar |
---|---|
A otimização de custos se concentra em sustentar e melhorar o retorno sobre o 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 aplicativo para fornecer conteúdo estático não é econômico. - CO:09 Custos de fluxo - CO:10 Custos dos dados |
A eficiência de desempenho ajuda sua carga de trabalho a atender com eficiência às demandas por meio de otimizações em dimensionamento, dados e código. | Descarregar a responsabilidade para um host externalizado ajuda a mitigar o congestionamento e permite que você use sua plataforma de aplicativos apenas para fornecer lógica de negócios. - PE:07 Codificar uma infraestrutura |
Tal como acontece com qualquer decisão de design, considere quaisquer compensações em relação aos objetivos dos outros pilares que possam ser introduzidos com este padrão.
Exemplo
O Armazenamento do Azure dá suporte ao fornecimento de conteúdo estático diretamente de um contêiner de armazenamento. Os arquivos são atendidos por meio de solicitações de acesso anônimo. Por padrão, os arquivos têm uma URL em um subdomínio 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 saber mais, confira Hospedagem de site estático no Armazenamento do Azure.
A hospedagem de site estático torna os arquivos disponíveis para acesso anônimo. Caso você precise controlar quem pode acessar os arquivos, você pode armazenar arquivos no blob do Azure e gerar um tempo e escopo limitado de assinaturas de acesso compartilhado para acesso restrito. As assinaturas de acesso geradas devem usar tokens delegados pelo usuário do Microsoft Entra e ter vida curta.
Os links nas páginas distribuídas para o cliente devem especificar a URL completa do recurso. Se o recurso estiver protegido por uma chave limitada, como uma assinatura de acesso compartilhado do Azure, essa assinatura deverá ser incluída na URL.
Um aplicativo de exemplo que demonstra o uso do armazenamento externo para recursos estáticos está disponível no GitHub. Este exemplo usa uma configuração de arquivo que especificam a URL da conta de armazenamento e o contêiner que contém o conteúdo estático público.
A classe StaticContentUrlHtmlHelper
no arquivo StaticContentUrlHtmlHelper.cs expõe um método chamado StaticContentUrl
que gera uma URL que contém o caminho para a conta de armazenamento de nuvem se a URL passada para ele começar com o caractere de caminho 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 arquivo Index.cshtml na pasta Views\Home contém um elemento de imagem que usa o método StaticContentUrl
para criar a URL para o seu atributo src
.
<img src="@Html.StaticContentUrl("~/media/orderedList1.png")" alt="Test Image" />
Próximas etapas
- Exemplo de hospedagem de conteúdo estático. Um aplicativo de exemplo que demonstra esse padrão.
Recursos relacionados
- Padrão de Chave de Manobrista. Se os recursos de destino não estiverem 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 a hospedagem de site estático com o Azure Functions para implementar um aplicativo Web sem servidor.