Existem várias maneiras baratas de hospedar um site estático gerado com um gerador de site estático como Jekyll, Hugo ou Pelican:
Todo este blog é gerado estaticamente usando Jekyll. No entanto, não posso usar nenhuma das opções acima porque, ao longo da existência deste blog, mudei nomes de domínio, mudei esquemas de URL e renomeei posts, e quero mantenha vivas todas as URLs antigas
Tenho hospedado este blog usando Apache e, mais recentemente, nginx em uma única máquina virtual, e os recursos de redirecionamento de qualquer um dos softwares funcionam muito bem, mas eu estava pronto para hospedá-lo em algum lugar novo e diferente
Uma postagem anterior descreve como redireciono URLs de um domínio antigo para um novo domínio usando o Google App Engine e Python, mas agora eu precisava de uma maneira de fornecer conteúdo estático
**e** URLs de redirecionamento do mesmo domínio. Esse mesmo requisito de redirecionamento de domínio é o motivo pelo qual não posso simplesmente usar o recurso somente de conteúdo estático do Google App Engine (link na lista acima). No entanto, posso usar o Google App Engine em combinação com um aplicativo Golang simples para fornecer conteúdo estático **e** redirecionamentos do mesmo domínio
## Por que o Google App Engine?
Antes de mergulhar no restante da postagem, talvez você esteja se perguntando: por que hospedar um blog no Google App Engine? Aqui estão meus motivos:
- Se o seu tráfego se encaixa no nível gratuito do App Engine de 28 horas de instância e 1 GB de tráfego de saída por dia, a hospedagem do blog é praticamente gratuita
- O envio de atualizações é feito com um comando
- O registro e o monitoramento são integrados usando o Stackdriver
- Escala automática para cima e para baixo com base nos padrões de tráfego
- Com alguns cliques, os logs da web podem ser facilmente enviados para algo como o BigQuery para armazenamento de longo prazo e análise ad hoc
- Certificados SSL gerenciados usando o Letâ¢ÃÂÃÂs Encrypt
## Pré-requisitos
Esta postagem pressupõe o seguinte:
- Você está familiarizado com o Google Cloud Platform (GCP) e já criou um projeto GCP
- Você instalou o Google Cloud SDK
- Você autenticou o
gcloudcommand contra sua Conta do Google
Criar um projeto do GCP
Se você ainda não criou um
** Projeto GCP siga estas etapas:
- Abra um navegador da Web e crie ou faça login em uma Conta do Google
- Navegue até o Console do GCP
- Se este for seu primeiro projeto GCP, você será solicitado a criar um projeto GCP. Cada Conta do Google recebe US$ 300 em crédito para usar em 12 meses no GCP. Você é obrigado a inserir um cartão de crédito para criar um projeto GCP, mas não será cobrado até que o crédito de $ 300 seja consumido ou 12 meses expirem
- Se este for um novo projeto do GCP, você precisará ativar a API do Compute Engine navegando até a seção Compute Engine do console do GCP e aguardar a conclusão da inicialização
Instale o SDK do Google Cloud
Se você ainda não instalou o
** Google Cloud SDK siga as instruções aqui
Autenticar gcloud
Depois de criar um projeto do GCP e instalar o Google Cloud SDK, a última etapa é autenticar o
comando gcloud para sua Conta do Google. Abra seu aplicativo de terminal e execute o seguinte comando:
gcloud login de autenticação
Uma página da web será aberta em seu navegador. Selecione sua Conta do Google e dê permissão para acessar o GCP. Depois de concluído, você será autenticado e pronto para seguir em frente
## Crie um diretório
Em seguida, crie um diretório em algum lugar de sua estação de trabalho para armazenar seu aplicativo do Google App Engine:
mkdir ~/Sites/example.com/app_engine
Mude para esse diretório:
cd ~/Sites/example.com/app_engine
O restante desta postagem assumirá que você está trabalhando dentro deste diretório
Além disso, crie um diretório dentro do
diretório **app_engine** chamado **estático
mkdir ~/Sites/example.com/app_engine/static
Você revisitará este diretório mais tarde
## Criar app.yaml
O Google App Engine geralmente requer dois arquivos:
**app.yaml** e um **arquivo de aplicativo** escrito em Python, Golang, Java ou PHP - neste caso, será Golang. **app.yaml** fornece a configuração necessária para executar seu aplicativo. Há muitos parâmetros diferentes que podem existir em **app.yaml Esses parâmetros podem diferir com base na linguagem de programação usada. Para esta postagem, o Golang será usado e você pode encontrar todos os parâmetros disponíveis do Golang aqui
Criar arquivo
**app.yaml** com o seguinte conteúdo:
tempo de execução: go api_version: go1 manipuladores: - url:script: _go_app seguro: sempre redirecionar_http_response_code: 301
Notar que
**seguro: sempre** foi definido. Isso significa que o aplicativo Golang sempre será servido por HTTPS. Se um usuário final navegar para o aplicativo da web por HTTP, ele será, por padrão, redirecionado 302 para a versão HTTPS. É por isso que **redirect_http_response_code: 301** também foi definido. Sempre desejo que o aplicativo da Web seja servido por HTTPS e não quero que os mecanismos de pesquisa interpretem o redirecionamento de HTTP para HTTPS como um redirecionamento temporário; é um redirecionamento permanente
Se você tiver recursos estáticos, e provavelmente tem, é uma prática recomendada informar o App Engine sobre isso e permitir que ele exiba esses recursos do armazenamento de objetos em vez de seu aplicativo. Fazer isso é fácil e também é feito através do
Arquivo **app.yaml**
Por exemplo, se você tiver um arquivo favicon, um diretório CSS, um diretório Javascript e um diretório de imagens, use o seguinte
Arquivo **app.yaml**:
runtime: go api_version: go1 handlers: - url: /favicon.png$ static_files: static/favicon.png upload: static/favicon.png - url: /css static_dir: static/css - url: /js static_dir: static/js - url: /images static_dir: static/images - url:script: _go_app seguro: sempre redirecionar_http_response_code: 301
## Criar main.go
Em seguida, você precisa do arquivo de aplicativo Golang
Para que o código a seguir atenda às suas necessidades, crie o arquivo
**main.go copie e cole o código abaixo, e faça as seguintes modificações:
- No
variável de domínio, altere o valor para corresponder ao seu nome de domínio com o protocolo HTTP correto
- No
urlsmap, substitua todos os pares de valores-chave para corresponder aos redirecionamentos necessários. Substitua cada chave apenas pela parte do caminho ( /example-post-1.html em vez de httpsexample.com/example-post-1.html) do URL antigo do domínio atual que você deseja mantenha vivo. Em seguida, substitua cada valor pela parte do caminho do novo URL do domínio atual para o qual você deseja redirecionar
Todos os redirecionamentos serão redirecionamentos 301. Isso pode ser modificado alterando
**301** no código abaixo para um código de status de redirecionamento HTTP diferente, como **302**
package main import ( "net/http""os""strings") func init() { http.HandleFunc handler) } func handler(w http.ResponseWriter, r *http.Request) { // Verdadeiro (ok) se solicitado path está no mapa de urls if value, ok := urls[r.URL.Path]; ok { value = domínio + value http.Redirect(w, r, value, 301) } else { path := "static/"+ r.URL.Path // Retorna 403 se a requisição HTTP for para um diretório que existe e não não contém um arquivo index.html if f, err := os.Stat(path); err == nil&& f.IsDir() { index := strings.TrimSuffix(path,+ "/index.html"if _, err := os.Open(index); err != nil { w.WriteHeader (403) w.Writebytehtml>