Compartilhar via


Tutorial: Implantar um aplicativo PHP, MySQL e Redis no Serviço de Aplicativo do Azure

Este tutorial mostra como criar um aplicativo PHP seguro no Serviço de Aplicativo do Azure que se conecta a um banco de dados MySQL (usando o Banco de Dados do Azure para Servidor Flexível MySQL). Você também implantará um Cache do Azure para Redis para habilitar o código de cache em seu aplicativo. O Serviço de Aplicativo do Azure é um serviço de hospedagem na Web com aplicação de patch automática altamente escalonável que pode implantar facilmente aplicativos no Windows ou no Linux. Quando terminar, você terá um aplicativo Laravel em execução no Serviço de Aplicativo do Azure no Linux.

Captura de tela do exemplo de aplicativo do Azure intitulado Lista de Tarefas mostrando novas tarefas adicionadas.

Pré-requisitos

1 – Executar o exemplo

Primeiro, você configura um aplicativo de exemplo baseado em dados como um ponto de partida. Para sua conveniência, o repositório de amostra inclui uma configuração de contêiner de desenvolvimento. O contêiner de desenvolvimento tem tudo o que você precisa para desenvolver um aplicativo, incluindo o banco de dados, o cache e todas as variáveis de ambiente necessárias para o aplicativo de exemplo. O contêiner de desenvolvimento pode ser executado em um codespace do GitHub, o que significa que você pode executar o exemplo em qualquer computador com um navegador da Web.

Etapa 1: em uma nova janela do navegador:

  1. Entre em sua conta do GitHub.
  2. Navegue até https://github.com/Azure-Samples/laravel-tasks/fork.
  3. Selecione Criar fork.

Uma captura de tela que mostra como criar um fork do repositório do GitHub de exemplo.

Etapa 2: na bifurcação do GitHub:

  1. Selecione Código>Criar codespace no principal. O codespace leva alguns minutos para ser configurado. Além disso, o arquivo .env fornecido já contém uma variável fictíciaAPP_KEY que o Laravel precisa executar localmente.

Uma captura de tela mostrando como criar um codespace no GitHub.

Etapa 3: Na janela de comando do codespace:

  1. Execute composer install.
  2. Execute as migrações de banco de dados com php artisan migrate.
  3. Execute o aplicativo com php artisan serve.
  4. Quando vir a notificação Your application running on port 80 is available., selecione Abrir no Navegador. Você deve ver o aplicativo de exemplo em uma nova guia do navegador. Para interromper o aplicativo, digite Ctrl+C.

Uma captura de tela mostrando como executar o aplicativo de exemplo dentro do codespace do GitHub.

Está enfrentando problemas? Confira a seção de Solução de problemas.

2 – Criar o Serviço de Aplicativo, o banco de dados e o cache

Nesta etapa, você criará os recursos do Azure. As etapas usadas neste tutorial criam um conjunto de recursos seguros por padrão que incluem o Serviço de Aplicativo, o Banco de Dados do Azure para MySQL e o Cache do Azure para Redis. Para o processo de criação, você especificará:

  • O Nome do aplicativo Web. É usado como parte do nome DNS para o seu aplicativo na forma de https://<app-name>-<hash>.<region>.azurewebsites.net.
  • A Região para executar o aplicativo fisicamente no mundo. Também é usado como parte do nome DNS para o seu aplicativo.
  • A pilha de runtime para o aplicativo. É aqui que você seleciona a versão do PHP a ser usada para seu aplicativo.
  • O plano de hospedagem para o aplicativo. É o plano de preço que inclui o conjunto de recursos e a capacidade de escalonamento do seu aplicativo.
  • O Grupo de Recursos para o aplicativo. Um grupo de recursos permite agrupar (em um contêiner lógico) todos os recursos necessários do Azure para o aplicativo.

Entre no portal do Azure e siga estas etapas para criar seus recursos do Serviço de Aplicativo do Azure.

Etapa 1: no portal do Azure:

  1. Insira “banco de dados do aplicativo Web” na caixa de pesquisa na parte superior do portal do Azure.
  2. Selecione o item Web App + Banco de Dados no título Marketplace. Você também pode navegar diretamente para o assistente de criação.

Uma captura de tela mostrando como usar a caixa de pesquisa na barra de ferramentas superior para localizar o assistente de criação de Aplicativo Web + Banco de dados.

Etapa 2: na página Criar aplicativo Web + Banco de dados, preencha o formulário conforme mostrado a seguir.

  1. Grupo de Recursos: selecione Criar novo e use um nome de msdocs-laravel-mysql-tutorial.
  2. Região: qualquer região do Azure próxima a você.
  3. Nome: msdocs-laravel-mysql-XYZ em que XYZ tem três caracteres aleatórios. Esse nome deve ser exclusivo no Azure.
  4. Pilha de runtime: PHP 8.3.
  5. Adicionar o Cache do Azure para Redis?: Sim.
  6. Plano de hospedagem: Básico. Quando estiver pronto, você poderá escalar verticalmente até um tipo de preço de produção posteriormente.
  7. MySQL – Servidor Flexível é selecionado para você por padrão como o mecanismo de banco de dados. O Banco de Dados do Azure para MySQL é um banco de dados MySQL como serviço totalmente gerenciado no Azure, compatível com as edições mais recentes da comunidade.
  8. Selecione Examinar + criar.
  9. Depois de concluir a validação, selecione Criar.

Uma captura de tela que mostra como configurar um novo aplicativo e banco de dados no assistente Aplicativo Web + Banco de Dados.

Etapa 3: a implantação leva alguns minutos para ser concluída. Depois que a implantação for concluída, selecione o botão Ir para o recurso. Você é levado diretamente para o aplicativo do Serviço de Aplicativo, mas os seguintes recursos são criados:

  • Grupo de recursos: o contêiner para todos os recursos criados.
  • Plano do Serviço de Aplicativo: define os recursos de computação para o Serviço de Aplicativo. É criado um plano do Linux na camada Básico.
  • Serviço de Aplicativo: representa seu aplicativo e é executado no plano de Serviço de Aplicativo.
  • Rede virtual: integrada ao aplicativo do App Service e isola o tráfego de rede de backend.
  • Pontos de extremidade privados: acesse os pontos de extremidade para o servidor de banco de dados e o Cache Redis na rede virtual.
  • Interfaces de rede: representam os endereços IP privados, um para cada um dos pontos de extremidade privados.
  • Servidor Flexível do Banco de Dados do Azure para MySQL: acessível somente por trás de seu ponto de extremidade privado. Um banco de dados e um usuário são criados para você no servidor.
  • Cache do Azure para Redis: acessível somente por trás de seu ponto de extremidade privado.
  • Zonas de DNS privado: habilitar a resolução DNS do servidor de banco de dados e o cache Redis na rede virtual.

Uma captura de tela mostrando o processo de implantação concluído.

3 – Proteger segredos de conexão

O assistente de criação gerou as variáveis de conectividade para você já como configurações de aplicativo. No entanto, a melhor prática de segurança é manter os segredos fora do Serviço de Aplicativo completamente. Você moverá seus segredos para um cofre de chaves e alterará a configuração do aplicativo para referências do Key Vault com a ajuda dos Conectores de Serviço.

Etapa 1: Recuperar a cadeia de conexão existente

  1. No menu à esquerda da página Serviço de Aplicativo, selecione Configurações > Variáveis de Ambiente.
  2. Selecione AZURE_MYSQL_PASSWORD.
  3. Na configuração Adicionar/Editar aplicativo, no campo Valor , copie a cadeia de caracteres de senha para uso posterior. As configurações de aplicativo que você vê permitem que você se conecte ao banco de dados MySQL e ao cache Redis protegidos por pontos de extremidade privados. No entanto, os segredos são salvos diretamente no aplicativo do Serviço de Aplicativo, o que não é a melhor opção. Você vai mudar isso.

Captura de tela mostrando como ver o valor de uma configuração de aplicativo.

Etapa 2: Criar um cofre de chaves para o gerenciamento seguro de segredos

  1. Na barra de pesquisa superior, digite "cofre de chaves" e selecione Marketplace>Cofre de Chaves.
  2. No Grupo de Recursos, selecione msdocs-laravel-mysql-tutorial.
  3. Em Nome do cofre de chaves, digite um nome que consista apenas em letras e números.
  4. Em Região, configure-a como o mesmo local do grupo de recursos.

Captura de tela mostrando como criar um cofre de chaves.

Etapa 3: Proteja o cofre de chaves usando um Private Endpoint

  1. Selecione a guia Rede.
  2. Desmarque Habilitar acesso público.
  3. Selecione Criar um ponto de extremidade privado.
  4. No Grupo de Recursos, selecione msdocs-laravel-mysql-tutorial.
  5. Na caixa de diálogo, em Local, selecione o mesmo local do seu aplicativo do Serviço de Aplicativo.
  6. Em Nome, digite msdocs-laravel-mysql-XYZVaultEndpoint.
  7. Na rede virtual, selecione msdocs-laravel-mysql-XYZVnet.
  8. Na Sub-rede, msdocs-laravel-mysql-XYZSubnet.
  9. Selecione OK.
  10. Selecione Examinar + criare Criar. Aguarde a conclusão da implantação do cofre de chaves. Você deverá ver "Sua implantação está concluída".

Captura de tela mostrando como proteger um cofre de chaves com um ponto de extremidade privado.

Etapa 4: Configurar o conector MySQL

  1. Na barra de pesquisa superior, digite msdocs-laravel-mysql e selecione o recurso do Serviço de Aplicativo chamado msdocs-laravel-mysql-XYZ.
  2. Na página do Serviço de Aplicativo, no menu à esquerda, selecione Configurações > Conector de serviço. Já existem dois conectores, que o assistente de criação de aplicativo criou para você.
  3. Marque a caixa de seleção ao lado do conector MySQL e selecione Editar.
  4. Selecione a guia Autenticação.
  5. Em Senha, cole a senha copiada anteriormente.
  6. Selecione Armazenar Segredo no Key Vault.
  7. Em Conexão do Azure Key Vault, selecione Criar nova. Uma caixa de diálogo Criar conexão é aberta na parte superior da caixa de diálogo de edição.

Captura de tela mostrando como editar um conector de serviço com uma conexão de cofre de chaves.

Etapa 5: Estabelecer a conexão do Key Vault

  1. Na caixa de diálogo Criar conexão para a conexão do Key Vault, no Key Vault, selecione o cofre de chaves que você criou anteriormente.
  2. Selecione Examinar + criar.
  3. Após a conclusão da validação, selecione Criar.

Uma captura de tela que mostra como configurar um conector de serviço do Key Vault.

Etapa 6: Finalizar as configurações do conector do MySQL

  1. Você está de volta à caixa de diálogo de edição para o defaultConnector. Na guia Autenticação, aguarde até que o conector do cofre de chaves seja criado. Quando terminar, a lista suspensa Conexão do Key Vault a selecionará automaticamente.
  2. Selecione Avançar: Rede.
  3. Selecione Salvar. Aguarde até que a notificação Atualização bem-sucedida seja exibida.

Captura de tela mostrando a conexão do cofre de chaves selecionada no defaultConnector.

Etapa 7: Configurar o conector Redis para usar segredos do Key Vault

  1. Na página Conectores de Serviço, marque a caixa de seleção ao lado do conector Cache para Redis e, em seguida, selecione Editar.
  2. Selecione a guia Autenticação.
  3. Selecione Armazenar Segredo no Key Vault.
  4. Em Conexão do Key Vault, selecione o cofre de chaves que você criou.
  5. Selecione Avançar: Rede.
  6. Selecione Configurar regras de firewall para habilitar o acesso ao serviço de destino. O assistente de criação de aplicativo já protegeu o banco de dados SQL com um ponto de extremidade privado.
  7. Selecione Salvar. Aguarde até que a notificação Atualização bem-sucedida seja exibida.

Uma captura de tela mostrando como editar o conector de serviço do Cache para Redis com uma conexão de cofre de chaves.

Etapa 8: Verificar a integração do Key Vault

  1. No menu do lado esquerdo, selecione Configurações > Variáveis ​​de ambiente.
  2. Ao lado de AZURE_MYSQL_PASSWORD, selecione Mostrar valor. O valor deve ser @Microsoft.KeyVault(...), o que significa que é uma referência do cofre de chaves, porque o segredo agora é gerenciado no cofre de chaves.
  3. Para verificar a cadeia de conexão Redis, selecione Mostrar valor ao lado de AZURE_REDIS_CONNECTIONSTRING.

Uma captura de tela mostrando como ver o valor da senha MySQL no Azure.

Para resumir, o processo para proteger seus segredos de conexão envolveu:

  • Recuperando os segredos de conexão das variáveis de ambiente do aplicativo do Serviço de Aplicativo.
  • Criando um cofre de chaves.
  • Criando uma conexão do Key Vault com a identidade gerenciada atribuída pelo sistema.
  • Atualizando os conectores de serviço para armazenar os segredos no cofre de chaves.

Está enfrentando problemas? Confira a seção de Solução de problemas.


4 – Configurar variáveis laravel

Etapa 1: Crie CACHE_DRIVER como uma configuração de aplicativo.

  1. Na guia Configurações do aplicativo, selecione Adicionar.
  2. No campo Nome, insira CACHE_DRIVER.
  3. No campo Valor, insira redis.
  4. Selecione Aplicar, depois Aplicar novamente e, em seguida, Confirmar.

Uma captura de tela mostrando a caixa de diálogo Adicionar/Editar configuração do aplicativo para a configuração de CACHE_DRIVER.

Etapa 2: Usando as mesmas etapas na Etapa 1, crie as seguintes configurações de aplicativo:

  • MYSQL_ATTR_SSL_CA: Use /home/site/wwwroot/ssl/DigiCertGlobalRootCA.crt.pem como o valor. Essa configuração de aplicativo aponta para o caminho do certificado TLS/SSL que você precisa para acessar o servidor MySQL. Ele está incluído no repositório de exemplo para maior conveniência.
  • LOG_CHANNEL: use stderr como o valor. Essa configuração informa ao Laravel para redirecionar os logs para stderr, o que o disponibiliza para os logs do Serviço de Aplicativo.
  • APP_DEBUG: use true como o valor. É uma variável de depuração do Laravel que habilita as páginas do modo de depuração.
  • APP_KEY: Use base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= como o valor. É uma variável de criptografia do Laravel.

Uma captura de tela mostrando como salvar as configurações na página de configuração.

Importante

O valor APP_KEY é usado aqui para maior conveniência. Para cenários de produção, ele deve ser gerado especificamente para sua implantação usando php artisan key:generate --show na linha de comando.

O ideal é que a configuração do aplicativo APP_KEY também seja ajustada como uma referência do cofre de chaves, que é um processo de várias etapas. Para obter mais informações, veja Como alterar a configuração do aplicativo APP_KEY para uma referência do Key Vault?

5 – Implantar código de exemplo

Nesta etapa, você configurará a implantação do GitHub usando o GitHub Actions. É apenas uma das muitas maneiras de implantar no App Service, mas também uma excelente forma de ter integração contínua em seu processo de implantação. Por padrão, cada git push em seu repositório GitHub inicia a ação de compilação e implantação.

Etapa 1: No menu à esquerda, selecione Implantação>Centro de implantação.

Uma captura de tela que mostra como abrir o Centro de Implantação no Serviço de Aplicativo.

Etapa 2: na página Centro de Implantação:

  1. Em Origem, selecione GitHub. Por padrão, o GitHub Actions é selecionado como o provedor de build.
  2. Entre em sua conta do GitHub e siga o prompt para autorizar o Azure.
  3. Em Organização, selecione sua conta.
  4. No Repositório, selecione msdocs-postgresql-sample-app.
  5. Em Branch, selecione main.
  6. Para Tipo de autenticação, selecione Identidade atribuída pelo usuário.
  7. No menu superior, selecione Salvar. O Serviço de Aplicativo confirma um arquivo de fluxo de trabalho no repositório GitHub escolhido, no diretório .github/workflows. Por padrão, o centro de implantação cria uma identidade atribuída pelo usuário para que o fluxo de trabalho seja autenticado usando o Microsoft Entra (autenticação OIDC). Para obter opções alternativas de autenticação, consulte Implantar no Serviço de Aplicativo usando o GitHub Actions.

Uma captura de tela que mostra como configurar o CI/CD usando o GitHub Actions (Django).

Etapa 3: De volta ao codespace do GitHub da sua bifurcação de exemplo, execute git pull origin main. Isso puxa o arquivo de fluxo de trabalho recém-confirmado para o seu codespace.

Uma captura de tela mostrando o git pull dentro de um codespace do GitHub.

Etapa 4 (Opção 1: com o GitHub Copilot):

  1. Inicie uma nova sessão de chat selecionando a exibição Chat e escolha +.
  2. Pergunte: "@workspace Como o aplicativo se conecta ao banco de dados e redis?". O Copilot pode fornecer uma explicação sobre como as configurações são configuradas em configuração/database.php.
  3. Pergunte: "@workspace No modo de produção, meu aplicativo está em execução em um aplicativo Web do Serviço de Aplicativo, que usa o Conector de Serviço do Azure para se conectar a um servidor flexível do MySQL. Quais são os nomes de variáveis de ambiente que preciso usar?" O Copilot pode fornecer uma sugestão de código semelhante à da Opção 2: sem as etapas do GitHub Copilot abaixo e até mesmo dizer para você fazer a alteração no arquivo de configuração/database.php .
  4. Abra a configuração/database.php no explorer e adicione a sugestão de código.
  5. Pergunte: "@workspace O aplicativo Meu Serviço de Aplicativo também usa o Conector de Serviço do Azure para se conectar a um Cache para Redis usando o tipo de cliente Django. Quais são os nomes de variáveis de ambiente que preciso usar?*" O Copilot pode fornecer uma sugestão de código semelhante àquela da Opção 2: sem as etapas do GitHub Copilot abaixo e até mesmo dizer para você fazer a alteração no arquivo de configuração/database.php . Se solicitado, entre no GitHub Copilot para o Azure para obter respostas mais precisas.
  6. Adicione a sugestão de código. O GitHub Copilot não oferece a mesma resposta todas as vezes e nem sempre está correto. Talvez seja necessário fazer mais perguntas para ajustar sua resposta. Para obter dicas, confira O que posso fazer com o GitHub Copilot no meu codespace?

Uma captura de tela mostrando como fazer uma pergunta em uma nova sessão de chat do GitHub Copilot.

Etapa 4 (Opção 2: sem o GitHub Copilot):

  1. Abra a configuração/database.php no explorer. Encontre a seção mysql e faça as seguintes alterações:
  2. Substitua DB_HOST (linha 49) por AZURE_MYSQL_HOST.
  3. Substitua DB_DATABASE (linha 51) por AZURE_MYSQL_DBNAME.
  4. Substitua DB_USERNAME (linha 52) por AZURE_MYSQL_USERNAME.
  5. Substitua DB_PASSWORD (linha 53) por AZURE_MYSQL_PASSWORD.
  6. Substitua DB_PORT (linha 50) por AZURE_MYSQL_PORT.
  7. Role até a seção Redis cache e faça as seguintes alterações:
  8. Substituir REDIS_HOST (linha) por AZURE_REDIS_HOST.
  9. Substitua REDIS_PASSWORD por AZURE_REDIS_PASSWORD.
  10. Substitua REDIS_PORT por AZURE_REDIS_PORT.
  11. Substitua REDIS_CACHE_DB por AZURE_REDIS_DATABASE.
  12. Na mesma seção, adicione uma linha com 'scheme' => 'tls',. Essa configuração indica que o Laravel deve usar a criptografia para a conexão com o Redis.

Uma captura de tela mostrando um codespace do GitHub e uma configuração/database.php abertos.

Etapa 5:

  1. Selecione a extensão Controle do código-fonte.
  2. Na caixa de texto, digite uma mensagem de commit, como Configure Azure database and cache connectons. Ou selecione e permita que o GitHub Copilot gere uma mensagem de confirmação para você.
  3. Selecione Confirmare confirme com Sim.
  4. Selecione Sincronizar alterações 1e confirme com OK.

Uma captura de tela mostrando as alterações sendo comitadas e enviadas ao GitHub.

Etapa 6: De volta à página do Centro de Implantação no portal do Azure:

  1. Selecione a guia Logs e, em seguida, selecione Atualizar para ver a nova execução de implantação.
  2. No item de log da execução da implantação, selecione a entrada Compilar/Implantar Logs com o carimbo de data/hora mais recente.

Uma captura de tela que mostra como abrir logs de implantação no Centro de Implantação.

Etapa 7: você será levado para o repositório do GitHub e verá que a ação do GitHub está em execução. O arquivo do fluxo de trabalho define dois estágios separados, compilar e implantar. Aguarde até que a execução do GitHub mostre um status de Sucesso. Leva cerca de 10 minutos.

Uma captura de tela mostrando uma execução do GitHub em andamento.

Está enfrentando problemas? Confira a seção de Solução de problemas.

6 – Gerar esquema de banco de dados

O assistente de criação coloca o servidor de banco de dados MySQL atrás de um ponto de extremidade privado, portanto, ele é acessível somente a partir da rede virtual. Como o aplicativo do Serviço de Aplicativo já está integrado à rede virtual, a maneira mais fácil de executar migrações de banco de dados com seu banco de dados é diretamente de dentro do contêiner do Serviço de Aplicativo.

Etapa 1: de volta na página do Serviço de Aplicativo, no menu à esquerda,

  1. Selecione Ferramentas de Desenvolvimento>SSH.
  2. Selecione Ir.

Uma captura de tela que mostra como abrir o shell SSH para seu aplicativo no portal do Azure.

Etapa 2: no terminal SSH:

  1. Execute cd /home/site/wwwroot. Aqui estão todos os arquivos implantados.
  2. Execute php artisan migrate --force. Se for bem-sucedido, o Serviço de Aplicativo se conectará com êxito ao banco de dados MySQL.

Uma captura de tela mostrando os comandos para executar o shell SSH e sua saída.

Dica

Na sessão SSH, somente as alterações nos arquivos em /home podem persistir além das reinicializações do aplicativo. As alterações feitas fora de /home não são persistentes.

7 – Alterar raiz do site

O ciclo de vida do aplicativo Laravel começa no diretório /public. O contêiner padrão do PHP do Serviço de Aplicativo usa o Nginx, que começa no diretório raiz do aplicativo. Para alterar a raiz do site, você precisará alterar o arquivo de configuração do Nginx no contêiner do PHP (/etc/nginx/sites-available/default). Para sua conveniência, o repositório de exemplo contém um arquivo de configuração personalizado chamado padrão. Como mencionado anteriormente, você não deve substituir esse arquivo usando o shell SSH, pois a alteração está fora de /home e será perdida após a reinicialização de um aplicativo.

Etapa 1:

  1. No menu à esquerda, selecione Configuração.
  2. Selecione a guia Configurações Gerais.

Uma captura de tela que mostra como abrir a guia Configurações Gerais na página de configurações do Serviço de Aplicativo.

Etapa 2: na guia Configurações Gerais:

  1. Na caixa Comando de Inicialização, insira o seguinte comando: cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload.
  2. Selecione Salvar e, em seguida, selecione Continuar. O comando substitui o arquivo de configuração do Nginx no contêiner do PHP e reinicia o Nginx. Essa configuração garante que a mesma alteração seja feita no contêiner sempre que ele for iniciado.

Uma captura de tela que mostra como configurar um comando de inicialização no Serviço de Aplicativo.

8 – Navegar até o aplicativo

Etapa 1: na página Serviço de Aplicativo:

  1. No menu esquerdo, selecione Visão geral.
  2. Selecione o domínio padrão do seu aplicativo.

Captura de tela que mostra como inicializar um Serviço de Aplicativo no portal do Azure.

Etapa 2: adicione algumas tarefas à lista. Parabéns! Você está executando um aplicativo PHP seguro controlado por dados no Serviço de Aplicativo do Azure.

Uma captura de tela do aplicativo Laravel executando no Serviço de aplicativo.

Dica

O aplicativo de exemplo implementa o padrão cache-aside. Quando você recarrega a página depois de fazer alterações nos dados, o Tempo de resposta na página da Web mostra um tempo muito mais rápido porque está carregando os dados do cache em vez do banco de dados.

9 - Logs de diagnóstico de fluxo

O Serviço de Aplicativo do Azure captura todas as mensagens registradas no console para ajudar você a diagnosticar problemas com seu aplicativo. O aplicativo de exemplo gera mensagens de log do console em cada um de seus pontos de extremidade para demonstrar essa funcionalidade. Por padrão, a funcionalidade de registro em log do Laravel (por exemplo, Log::info()) é gerada para um arquivo local. A configuração do aplicativo LOG_CHANNEL anterior torna as entradas de log acessíveis no fluxo de logs do Serviço de Aplicativo.

Etapa 1: na página Serviço de Aplicativo:

  1. No menu à esquerda, selecione Logs do Serviço de Aplicativo.
  2. Em Log do aplicativo, selecione Sistema de arquivos.

Uma captura de tela mostrando como habilitar logs nativos no Serviço de Aplicativo no portal do Azure.

Etapa 2: no menu esquerdo, selecione Fluxo de log. Você verá os logs do seu aplicativo, incluindo os logs de plataforma e os logs de dentro do contêiner.

Captura de tela mostrando como exibir o fluxo de logs no portal do Azure.

Limpar recursos

Quando tiver terminado, você poderá excluir todos os recursos de sua assinatura do Azure ao excluir o grupo de recursos.

Etapa 1: na barra de pesquisa, na parte superior do portal do Azure:

  1. Insira o nome do grupo de recursos.
  2. Selecione o grupo de recursos.

Uma captura de tela mostrando como pesquisar e navegar para um grupo de recursos no portal do Azure.

Etapa 2: na página Grupo de recursos, selecione Excluir grupo de recursos.

Uma captura de tela mostrando o local do botão Excluir Grupo de Recursos no portal do Azure.

Etapa 3:

  1. Insira o nome do grupo de recursos para confirmar a exclusão.
  2. Selecione Excluir.

Uma captura de tela do diálogo de confirmação para excluir um grupo de recursos no portal do Azure.

2. Criar recursos do Azure e implantar um aplicativo de amostra

Nesta etapa, você criará os recursos do Azure e implantará um aplicativo de amostra no Serviço de Aplicativo no Linux. As etapas usadas neste tutorial criam um conjunto de recursos seguros por padrão que incluem o Serviço de Aplicativo e o Banco de Dados do Azure para MySQL.

O codespace do GitHub já possui a CLI do Azure para Desenvolvedores (AZD).

  1. Gerar uma chave de criptografia Laravel com php artisan key:generate --show:

    php artisan key:generate --show
    
  2. Entre em sua conta do Azure usando o comando azd auth login e seguindo o prompt:

    azd auth login
    
  3. Crie os recursos necessários do Azure e implante o código do aplicativo com o comando azd up. Siga o prompt para selecionar a assinatura e o local desejados para os recursos do Azure.

    azd up
    
  4. Quando solicitado, dê as seguintes respostas:

    Pergunta Resposta
    Insira um novo nome do ambiente Digite um nome exclusivo. O modelo do AZD usa esse nome como parte do nome DNS do seu aplicativo Web no Azure (<app-name>-<hash>.azurewebsites.net). São permitidos caracteres alfanuméricos e hífens.
    Selecione uma Assinatura do Azure a ser usada Selecione sua assinatura.
    Selecione um local do Azure a ser usado Selecione um local.
    Insira um valor para o parâmetro protegido da infraestrutura 'appKey' Use a saída de php artisan key:generate --show aqui. O modelo do AZD cria um segredo do Key Vault para ele que você pode usar em seu aplicativo.
    Insira um valor para o parâmetro seguro de infraestrutura 'databasePassword' Senha do banco de dados para MySQL. Ele deve ter pelo menos 8 caracteres e conter letras maiúsculas, letras minúsculas, números e caracteres especiais.

    O comando azd up leva cerca de 15 minutos para ser concluído (o cache Redis leva mais tempo). Ele também compila e implanta o código do aplicativo, mas você modificará seu código posteriormente para trabalhar com o Serviço de Aplicativo. Durante a execução, o comando fornece mensagens sobre o processo de provisionamento e implantação, incluindo um link para a implantação no Azure. Quando ele é concluído, o comando também exibe um link para o aplicativo de implantação.

    Esse modelo do AZD contém arquivos (azure.yaml e o diretório infra) que geram uma arquitetura segura por padrão com os seguintes recursos do Azure:

    • Grupo de recursos: o contêiner para todos os recursos criados.
    • Plano do Serviço de Aplicativo: define os recursos de computação para o Serviço de Aplicativo. É criado um plano do Linux na camada B1.
    • Serviço de Aplicativo: representa seu aplicativo e é executado no plano de Serviço de Aplicativo.
    • Rede virtual: integrada ao aplicativo do App Service e isola o tráfego de rede de backend.
    • Banco de Dados do Azure para MySQL com Servidor Flexível: acessível somente a partir da rede virtual por meio da integração da zona DNS. Um banco de dados é criado para você no servidor.
    • Cache do Azure para Redis: acessível somente de dentro da rede virtual.
    • Pontos de extremidade privados: acesse os pontos de extremidade para o cofre de chaves e o Cache Redis na rede virtual.
    • Zonas DNS privadas: habilite a resolução DNS do cofre de chaves, do servidor de banco de dados e do cache Redis na rede virtual.
    • Área de Trabalho do Log Analytics: serve como o contêiner de destino para seu aplicativo enviar seus logs, onde você também pode consultar os logs.
    • Cofre de chaves: usado para manter a mesma senha do banco de dados ao reimplantar com o AZD.

Está enfrentando problemas? Confira a seção de Solução de problemas.

3. Usar cadeias de conexão do Azure no código do aplicativo

O modelo do AZD que você usa já gerou as variáveis de conectividade como configurações do aplicativo e as envia para o terminal para sua conveniência. As configurações do aplicativo são uma maneira de manter os segredos de conexão fora do seu repositório de códigos.

  1. Na saída do AZD, localize as configurações do aplicativo que começam com AZURE_MYSQL_ e AZURE_REDIS_. Somente os nomes das configurações são exibidos. Elas têm esta aparência na saída do AZD:

     App Service app has the following app settings:
             - AZURE_KEYVAULT_RESOURCEENDPOINT
             - AZURE_KEYVAULT_SCOPE
             - AZURE_MYSQL_DBNAME
             - AZURE_MYSQL_FLAG
             - AZURE_MYSQL_HOST
             - AZURE_MYSQL_PASSWORD
             - AZURE_MYSQL_PORT
             - AZURE_MYSQL_USERNAME
             - AZURE_REDIS_DATABASE
             - AZURE_REDIS_HOST
             - AZURE_REDIS_PASSWORD
             - AZURE_REDIS_PORT
             - AZURE_REDIS_SSL
     

    As configurações que começam com AZURE_MYSQL_ são variáveis de conexão para o banco de dados MySQL e as configurações que começam com AZURE_REDIS_ são para o cache Redis. Você precisa usá-las em seu código mais tarde. Para sua conveniência, o modelo do AZD mostra o link direto para a página de configurações do aplicativo no portal do Azure.

  2. No explorer, abra a configuração/database.php. Esse é o arquivo de configuração para conexões de cache do banco de dados e do Redis.

  3. Localize a parte que define a mysql conexão (linhas 46-64) e substitua DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAMEe DB_PASSWORD com as AZURE_MYSQL_ configurações de aplicativo da saída do AZD. Sua mysql conexão deve ser semelhante ao código a seguir.

    'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('AZURE_MYSQL_HOST', '127.0.0.1'),
        'port' => env('AZURE_MYSQL_PORT', '3306'),
        'database' => env('AZURE_MYSQL_DBNAME', 'forge'),
        'username' => env('AZURE_MYSQL_USERNAME', 'forge'),
        'password' => env('AZURE_MYSQL_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],
    

    Para obter mais informações sobre a configuração do banco de dados no Laravel, consulte a documentação da Laravel.

  4. Localize a parte que define a conexão de cache Redis (linhas 140-147) e substitua REDIS_HOST, REDIS_PASSWORD, REDIS_PORT e REDIS_CACHE_DB com as configurações do aplicativo Azure_REDIS_ da saída do AZD. Além disso, adicione 'scheme' => 'tls', à conexão. Sua conexão de cache deve ser semelhante ao seguinte código:

    'cache' => [
        'scheme' => 'tls',
        'url' => env('REDIS_URL'),
        'host' => env('AZURE_REDIS_HOST', '127.0.0.1'),
        'username' => env('REDIS_USERNAME'),
        'password' => env('AZURE_REDIS_PASSWORD'),
        'port' => env('AZURE_REDIS_PORT', '6379'),
        'database' => env('AZURE_REDIS_DATABASE', '1'),
    ],
    

    Para obter mais informações sobre a configuração do cache Redis no Laravel, consulte a documentação do Laravel.

    Observação

    Lembre-se de que suas alterações ainda não foram implantadas. Você os implantará no final da próxima etapa.

4. Definir configurações do Laravel no aplicativo Web

  1. No explorer, abra infra/resources.bicep. Este é o arquivo de modelo Bicep que define os recursos do Azure criados.

  2. Localize a parte que define as configurações do aplicativo (linhas 510-514) e descompacte-as. Essas configurações de aplicativo são:

    Configurações Descrição
    CACHE_DRIVER Informa à Laravel para usar o Redis como seu cache (consulte a documentação da Laravel).
    MYSQL_ATTR_SSL_CA Necessário para abrir uma conexão TLS com o MySQL no Azure. O arquivo de certificado é incluído no repositório de exemplo para conveniência. Essa variável é usada pela conexão mysql em config/database.php
    LOG_CHANNEL Informa ao Laravel para redirecionar logs para stderr, o que o disponibiliza para os logs do Serviço de Aplicativo (consulte a documentação do Laravel).
    APP_DEBUG Habilite páginas do modo de depuração no Laravel (consulte a documentação do Laravel).
    APP_KEY Variável de criptografia Laravel. O modelo do AZD já criou um segredo do Key Vault (linhas 212-217), para que você o acesse com uma referência do Key Vault.
  3. Em infra/resources.bicep, localize a definição de recurso para o aplicativo do Serviço de Aplicativo e descompacte a linha 315:

    appCommandLine: 'cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload'
    

    O ciclo de vida do aplicativo Laravel começa no diretório /public, em vez da raiz do aplicativo. O contêiner PHP padrão para o Serviço de Aplicativo usa o Nginx, que começa na raiz do aplicativo. Para alterar a raiz do site, você precisará alterar o arquivo de configuração do Nginx no contêiner do PHP (/etc/nginx/sites-available/default). Para sua conveniência, o repositório de exemplo contém um arquivo de configuração de substituição chamado padrão, que informa ao Nginx para procurar no diretório /público . Esse comando personalizado no appCommandLine é executado toda vez que o aplicativo inicia para aplicar a substituição de arquivo sempre que o contêiner do Linux é recarregado de um estado limpo.

  4. De volta ao terminal do codespace, execute azd up novamente.

    azd up
    

Dica

azd up executa azd package, azd provisione azd deploy juntos, e faz sentido porque você está fazendo alterações de infraestrutura e de aplicativo. Para fazer apenas alterações de infraestrutura, execute azd provision. Para implantar apenas alterações no código do aplicativo, execute azd deploy.

Está enfrentando problemas? Confira a seção de Solução de problemas.

5. Gerar esquema de banco de dados

Com o banco de dados MySQL protegido pela rede virtual, a maneira mais fácil de executar migrações de banco de dados Laravel é em uma sessão SSH com o contêiner do Linux no Serviço de Aplicativo.

  1. Na saída do AZD, localize a URL da sessão SSH e navegue até ela no navegador. Fica assim na saída:

     Open SSH session to App Service container at: https://<app-name>-<hash>.scm.azurewebsites.net/webssh/host
     
  2. Na sessão SSH, execute migrações de banco de dados do diretório /home/site/wwwroot :

    cd /home/site/wwwroot
    php artisan migrate --force
    

    Se ele for bem-sucedido, o Serviço de Aplicativo está se conectando com êxito ao banco de dados.

Observação

Somente as alterações nos arquivos /home podem persistir além das reinicializações do aplicativo.

Está enfrentando problemas? Confira a seção de Solução de problemas.

6. Navegar até o aplicativo

  1. Na saída do AZD, localize a URL do seu aplicativo e navegue até ela no navegador. O URL fica assim na saída do AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>-<hash>.azurewebsites.net/
     
  2. Adicione algumas tarefas à lista.

    Uma captura de tela do aplicativo Web Laravel com o MySQL em execução no Azure mostrando tarefas.

    Parabéns, você está executando um aplicativo Web no Serviço de Aplicativo do Azure, com a conectividade segura do Banco de Dados do Azure para MySQL.

Está enfrentando problemas? Confira a seção de Solução de problemas.

7. Logs de diagnóstico de fluxo

O Serviço de Aplicativo do Azure captura todas as mensagens registradas no console para ajudar você a diagnosticar problemas com seu aplicativo. Por conveniência, o modelo do AZD já habilitou o registro em log para o sistema de arquivos local e está enviando os logs para um workspace do Log Analytics.

O aplicativo de exemplo exibe mensagens de log no console em cada um dos seus endpoints para demonstrar essa funcionalidade. Por padrão, a funcionalidade de registro em log do Laravel (por exemplo, Log::info()) é gerada para um arquivo local. A configuração do aplicativo LOG_CHANNEL anterior torna as entradas de log acessíveis no fluxo de logs do Serviço de Aplicativo.

Route::get('/', function () {
    Log::info("Get /");
    $startTime = microtime(true);
    // Simple cache-aside logic
    if (Cache::has('tasks')) {
        $data = Cache::get('tasks');
    } else {
        $data = Task::orderBy('created_at', 'asc')->get();
        Cache::add('tasks', $data);
    }
    return view('tasks', ['tasks' => $data, 'elapsed' => microtime(true) - $startTime]);
});

Na saída do AZD, localize o link para a transmissão dos logs do Serviço de Aplicativo e acesse-o no navegador. O link tem esta aparência na saída do AZD:

Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream

Está enfrentando problemas? Confira a seção de Solução de problemas.

8. Limpar os recursos

Para excluir todos os recursos do Azure no ambiente de implantação atual, execute azd down e siga os prompts.

azd down

Resolução de problemas

Recebo o erro durante migrações de banco de dados php_network_getaddresses: getaddrinfo for mysqldb failed: No address associated with hostname...

Indica que as variáveis de conexão MySQL não estão configuradas corretamente. Verifique se as configurações do AZURE_MYSQL_ aplicativo estão configuradas corretamente em 3. Use cadeias de conexão do Azure no código do aplicativo.

Eu recebo uma página em branco no navegador.

Indica que o Serviço de Aplicativo não consegue localizar os arquivos de início do PHP em /public. Siga as etapas em 4. Defina as configurações do Laravel no aplicativo Web.

Recebo uma página de depuração no navegador dizendo Unsupported cipher or incorrect key length.

Indica que a APP_KEY configuração está definida como uma chave inválida. Ao executar azd up, certifique-se de definir appKey como a saída de php artisan key:generate --show.

Recebo uma página de depuração no navegador dizendo Uncaught Error: Class "Illuminate\..." not found.

Esse erro e erros semelhantes indicam que você não executou composer install antes de azd up, ou que os pacotes no diretório /vendor estão desatualizados. Execute composer install e azd deploy novamente.

Recebo uma página de depuração no navegador dizendo php_network_getaddresses: getaddrinfo for redishost failed: Name or service not known.

Indica que as variáveis de conexão redis não estão configuradas corretamente. Verifique se as configurações do AZURE_REDIS_ aplicativo estão configuradas corretamente em 3. Use cadeias de conexão do Azure no código do aplicativo.

Recebo uma página de depuração no navegador dizendo SQLSTATE[42S02]: Base table or view not found: 1146 Table 'XXXX-XXXXXXXXX-mysql-database.tasks' doesn't exist

Isso significa que você não executou migrações de banco de dados ou as migrações de banco de dados não foram bem-sucedidas. Siga as etapas em 5. Gerar esquema de banco de dados.

Perguntas frequentes

Quanto custa essa configuração?

O preço dos recursos criados são os seguintes:

  • O plano do Serviço de Aplicativo é criado na camada Básica e pode ser ampliado ou reduzido. Confira Preço do Serviço de Aplicativo.
  • O servidor flexível do MySQL é criado na faixa B1ms e pode ser escalado para cima ou para baixo. Com uma conta gratuita do Azure, a camada B1ms é gratuita por 12 meses, respeitando os limites mensais. Veja os preços do Banco de Dados do Azure para MySQL.
  • O Cache do Azure para Redis é criado na camada Básico com o tamanho mínimo do cache. Há um pequeno custo associado a essa camada. Você pode dimensioná-la para níveis de desempenho mais altos para maior disponibilidade, clustering e outros recursos. Consulte Preço do Cache do Azure para Redis.
  • A rede virtual não incorre em cobrança, a menos que você configure uma funcionalidade extra, como emparelhamento. Consulte os Preços da Rede Virtual do Azure.
  • A zona DNS privada incorre em uma pequena cobrança. Consulte os Preços do DNS do Azure.

Como conectar-se ao banco de dados MySQL protegido por trás da rede virtual com outras ferramentas?

  • Para acesso básico de uma ferramenta de linha de comando, você pode executar mysql no terminal SSH do aplicativo.
  • Para se conectar a partir de uma ferramenta de área de trabalho, como o MySQL Workbench, seu computador deve estar dentro da rede virtual. Por exemplo, pode ser uma VM do Azure conectada a uma das sub-redes ou um computador em uma rede local que tenha uma conexão VPN site a site com a rede virtual do Azure.
  • Você também pode integrar o Azure Cloud Shell à rede virtual.

Como alterar a configuração do aplicativo APP_KEY para uma referência do Key Vault?

Nas etapas do portal em 4 – Configurar variáveis laravel, você pode alterar APP_KEY para uma referência do Key Vault executando os seguintes comandos da CLI do Azure no codespace do GitHub:

# Change the following variables to match your environment
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
KEY_VAULT_NAME=<key-vault-name>
APP_SERVICE_NAME=<app-name>
SECRET_NAME=laravelAppKey

# Set the subscription ID
az account set --subscription $SUBSCRIPTION_ID

# Assign 'Key Vault Secrets Officer' role to your user at the scope of the key vault
az role assignment create \
  --assignee $(az ad signed-in-user show --query id -o tsv) \
  --role $(az role definition list --name "Key Vault Secrets Officer" --query "[].id" -o tsv) \
  --scope $(az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --query id --output tsv)

# Add the secret to the key vault
az keyvault secret set \
  --vault-name $KEY_VAULT_NAME \
  --name $SECRET_NAME \
  --value $(php artisan key:generate --show)

# Add Key Vault reference to the App Service configuration
az webapp config appsettings set \
  --resource-group $RESOURCE_GROUP \
  --name $APP_SERVICE_NAME \
  --settings "APP_KEY=@Microsoft.KeyVault(SecretUri=https://$KEY_VAULT_NAME.vault.azure.net/secrets/$SECRET_NAME)"

Você também pode fazer a mesma coisa no portal. Para obter mais informações, consulte:

  1. Atribuição de função no escopo do Key Vault
  2. Adicione um segredo ao Key Vault
  3. Recuperar um segredo do Key Vault
  4. Definir as configurações do aplicativo

Como o desenvolvimento de aplicativos local funciona com o GitHub Actions?

Use o arquivo de fluxo de trabalho gerado automaticamente do Serviço de Aplicativo como exemplo, cada git push inicia uma nova execução de build e implantação. Em um clone local do repositório do GitHub, você faz as atualizações desejadas efetuarem push para o GitHub. Por exemplo:

git add .
git commit -m "<some-message>"
git push origin main

Por que a implantação do GitHub Actions é tão lenta?

O arquivo de fluxo de trabalho gerado automaticamente do Serviço de Aplicativo define uma execução de dois trabalhos: compilar e, em seguida, implantar. Como cada trabalho é executado em seu próprio ambiente limpo, o arquivo de fluxo de trabalho garante que o trabalho deploy tenha acesso aos arquivos do trabalho build:

A maior parte do tempo gasto pelo processo de dois trabalhos é carregando e baixando artefatos. Se desejar, você pode simplificar o arquivo de fluxo de trabalho combinando os dois trabalhos em um, o que elimina a necessidade das etapas de carregar e baixar.

Não tenho permissões para criar uma identidade atribuída pelo usuário

Veja como configurar a implantação do GitHub Actions a partir do Centro de Implantação.

O que posso fazer com o GitHub Copilot em meu codespace?

Você pode perceber que a janela de chat do GitHub Copilot já estava lá quando você criou o codespace. Para sua conveniência, incluímos a extensão de chat do GitHub Copilot na definição de contêiner (confira .devcontainer/devcontainer.json). No entanto, você precisa de uma conta do GitHub Copilot (avaliação gratuita de 30 dias disponível).

Algumas dicas para você ao falar com o GitHub Copilot:

  • Em uma única sessão de chat, as perguntas e respostas se baseiam umas nas outras e você pode ajustar suas perguntas para ajustar a resposta que receber.
  • Por padrão, o GitHub Copilot não tem acesso a nenhum arquivo em seu repositório. Para fazer perguntas sobre um arquivo, abra o arquivo no editor primeiro.
  • Para permitir que o GitHub Copilot tenha acesso a todos os arquivos no repositório ao preparar suas respostas, comece sua pergunta com @workspace. Para obter mais informações, consulte Use the @workspace agent.
  • Na sessão de chat, o GitHub Copilot pode sugerir alterações e (com @workspace) até mesmo onde fazer as alterações, mas não tem permissão para fazer as alterações para você. Cabe a você adicionar as alterações sugeridas e testá-las.

Próximas etapas

Avance para o próximo tutorial para saber como proteger seu aplicativo com um domínio e um certificado personalizados.

Se preferir, confira outros recursos: