Partilhar via


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

Este tutorial mostra como criar uma aplicação PHP segura no Azure App Service, conectando-se a uma base de dados MySQL (usando o Banco de Dados do Azure para MySQL Flexible Server). Você também implantará um Cache Redis do Azure para habilitar o código de cache em seu aplicativo. O Serviço de Aplicativo do Azure é um serviço de hospedagem na Web altamente escalável, auto-corrigido que pode implantar facilmente aplicativos no Windows ou Linux. Quando terminar, você terá um aplicativo Laravel em execução no Serviço de Aplicativo do Azure no Linux.

Captura de ecrã do exemplo de aplicação do Azure intitulada Lista de Tarefas a mostrar as novas tarefas adicionadas.

Pré-requisitos

1 - Execute o exemplo

Primeiro, você configura um aplicativo controlado por dados de exemplo como ponto de partida. Para sua conveniência, o repositório de exemplo 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 espaço de código GitHub, o que significa que você pode executar o exemplo em qualquer computador com um navegador da Web.

Passo 1: Em uma nova janela do navegador:

  1. Iniciar sessão na sua conta do GitHub.
  2. Navegue para https://github.com/Azure-Samples/laravel-tasks/fork.
  3. Selecione Criar ramificação.

Passo 2: Na bifurcação do GitHub:

  1. Selecione Code>Criar espaço de código em principal. O codespace leva alguns minutos para ser configurado. Além disso, o arquivo .env fornecido já contém uma variável fictícia APP_KEY que o Laravel precisa executar localmente.

Passo 3: No terminal do codespace:

  1. Executar composer install.
  2. Execute migrações de banco de dados com php artisan migrate.
  3. Execute a aplicação 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 parar o aplicativo, digite Ctrl+C.

Tem problemas? Verifique a seção Solução de problemas.

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

Nesta etapa, você cria 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ê especifica:

  • O Nome do aplicativo Web. Ele é usado como parte do nome DNS do seu aplicativo.
  • A região para executar o aplicativo no mundo físico. Ele também é usado como parte do nome DNS do seu aplicativo.
  • A pilha de tempo de execução para o aplicativo. É onde você seleciona a versão do PHP para usar em seu aplicativo.
  • O plano de hospedagem para o aplicativo. É a camada de preço que inclui o conjunto de recursos e a capacidade de dimensionamento para seu aplicativo.
  • O Grupo de Recursos para o aplicativo. Um grupo de recursos permite agrupar (em um contêiner lógico) todos os recursos do Azure necessários 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. Na barra de pesquisa superior, digite serviço de aplicativo.
  2. Selecione o item rotulado Serviço de Aplicativo sob o título Serviços.
  3. Selecione Criar>Aplicação Web. Você também pode navegar diretamente para o assistente de criação.

Etapa 2: Na página Criar aplicativo Web, preencha o formulário da seguinte maneira.

  1. Nome: msdocs-laravel-mysql-XYZ. Um grupo de recursos chamado msdocs-laravel-mysql-XYZ_group será gerado para você.
  2. Pilha de tempo de execução: PHP 8.4.
  3. Sistema operacional: Linux.
  4. Região: qualquer região do Azure perto de você.
  5. Plano Linux: Crie novos e use o nome msdocs-laravel-mysql-XYZ.
  6. Plano de preços: Básico. Quando estiver pronto, você poderá escalar para um nível de preço diferente.

Passo 3:

  1. Selecione a guia Banco de dados .
  2. Selecione Criar um banco de dados.
  3. Em Engine, selecione MySQL - Flexible Server.
  4. Selecione Criar um Cache do Azure para Redis.
  5. Em Nome (em Cache), insira um nome para o cache.
  6. Em SKU, selecione Básico.

Passo 4:

  1. Selecione o separador Implantação.
  2. Habilite a implantação contínua.
  3. Em Organização, selecione seu alias do GitHub.
  4. Em Repositório, selecione laravel-tasks.
  5. Em Ramo, selecione principal.
  6. Certifique-se de que a autenticação básica está desativada.
  7. Selecione Revisar + criar.
  8. Após a conclusão da validação, selecione Criar.

5º Passo: A implantação leva alguns minutos para ser concluída. Quando a implantação for concluída, selecione o botão Ir para o recurso . Você é levado diretamente para a aplicação do Serviço de Aplicações, 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. Um plano Linux na camada Basic é criado.
  • Serviço de Aplicativo: representa seu aplicativo e é executado no plano do Serviço de Aplicativo.
  • Rede virtual: integrada com a aplicação do serviço App Service e isola o tráfego de rede back-end.
  • Pontos de extremidade privados: pontos de extremidade de acesso para o servidor de banco de dados e o cache Redis na rede virtual.
  • Interfaces de rede: Representa endereços IP privados, um para cada um dos pontos de extremidade privados.
  • Banco de Dados do Azure para Servidor Flexível MySQL: Acessível apenas por trás de seu ponto de extremidade privado. Um banco de dados e um usuário são criados para você no servidor.
  • Azure Cache para Redis: acessível apenas a partir de seu ponto de extremidade privado.
  • Zonas DNS privadas: habilite a resolução DNS do servidor de banco de dados e do cache Redis na rede virtual.

3 - Segredos de conexão seguros

O assistente de criação gerou as variáveis de conectividade para você já como configurações do aplicativo. No entanto, a prática recomendada de segurança é manter os segredos completamente fora do Serviço de Aplicativo. Você vai mover os seus segredos para um Cofre de Chaves e mudar as definições da aplicação para Referências do Cofre de Chaves com a ajuda dos Connectores de Serviço.

Etapa 1: Recuperar a cadeia de conexão existente

  1. No menu esquerdo da página Serviço de Aplicativo, selecione Configurações > Variáveis de ambiente.
  2. Selecione Cadeias de conexão.
  3. Selecione AZURE_MYSQL_CONNECTIONSTRING.
  4. Na configuração Adicionar/Editar aplicativo, no campo Valor , copie o nome de usuário e a senha para uso posterior. A cadeia de conexão permite que você se conecte ao banco de dados MySQL protegido por endpoints privados. No entanto, os segredos são salvos diretamente na aplicação do App Service, o que não é a melhor prática. Você vai mudar isso.

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

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

Etapa 3: Proteger o cofre de chaves com um Endpoint Privado

  1. Selecione a aba Rede.
  2. Desmarque Ativar acesso público.
  3. Selecione Criar um ponto de extremidade privado.
  4. Em Grupo de Recursos, selecione msdocs-laravel-mysql-XYZ_group.
  5. No diálogo, em Local, selecione o mesmo local da sua aplicação App Service.
  6. Em Nome, digite msdocs-laravel-mysql-XYZVaultEndpoint.
  7. Em Rede virtual, selecione a rede virtual no grupo msdocs-laravel-mysql-XYZ_group .
  8. Em Sub-rede, selecione a sub-rede compatível disponível. O assistente de Aplicativo Web o criou para sua conveniência.
  9. Selecione OK.
  10. Selecione Rever + criar e, em seguida, selecione Criar. Aguarde a conclusão da implantação do cofre de chaves. Você deve ver "Sua implantação está concluída".

Etapa 4: Criar 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 Serviço de Aplicativo, no menu à esquerda, selecione Configurações > do Conector de Serviço.
  3. Selecione Criar.
  4. Para Tipo de serviço, selecione DB para servidor flexível MySQL.
  5. Para o servidor flexível MySQL, selecione seu servidor (por exemplo, msdocs-laravel-mysql-235-server).
  6. Para o banco de dados MySQL, selecione seu banco de dados (por exemplo, msdocs-laravel-mysql-235-database).

Etapa 5: Configurar a autenticação para o conector MySQL

  1. Selecione o separador Autenticação.
  2. Selecione Cadeia de conexão.
  3. Em Senha, cole a senha copiada anteriormente.
  4. Selecione Armazenar segredo no Cofre da chave.
  5. Em Conexão do Cofre de Chaves, selecione Criar novo. Uma caixa de diálogo Criar conexão é aberta na parte superior da caixa de diálogo de edição.

Etapa 6: Estabelecer a ligação ao Cofre de Chaves

  1. Na caixa de diálogo Criar conexão para a conexão do Cofre da Chave, no Cofre da Chave, selecione o cofre da chave criado anteriormente.
  2. Selecione Revisar + Criar.
  3. Quando a validação for concluída, selecione Criar.

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

  1. Você está de volta na caixa de diálogo do conector MySQL. Na guia Autenticação, aguarde até que o conector do cofre de chaves seja criado. Quando termina, o menu suspenso Cofre de Chaves seleciona-o automaticamente.
  2. Selecione Revisar + Criar.
  3. Selecione Criar. Aguarde até que a notificação Atualização bem-sucedida seja exibida.

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 para Cache Redis e selecione Editar.
  2. Selecione o separador Autenticação.
  3. Selecione Armazenar segredo no Cofre da chave.
  4. Em Conexão do Cofre de Chaves, selecione o cofre de chaves que criou.
  5. Selecione Next: Networking.
  6. Selecione Configurar regras de firewall para habilitar o acesso ao serviço de destino. O assistente de criação de aplicativos já assegurou o banco de dados SQL com um ponto de extremidade privado.
  7. Selecione Guardar. Aguarde até que a notificação Atualização bem-sucedida seja exibida.

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

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

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

  • Recuperando os segredos de conexão das variáveis de ambiente da aplicação do App Service.
  • Criação de um cofre de chaves.
  • Criação de uma conexão com o Cofre de Chaves usando a identidade gerenciada atribuída pelo sistema.
  • Atualizar os conectores de serviço para armazenar os segredos no cofre de chaves.

Tem problemas? Verifique a seção Solução de problemas.


4 - Configurar variáveis Laravel

1º Passo: Criar CACHE_DRIVER como uma configuração de aplicativo.

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

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

  • MYSQL_ATTR_SSL_CA: Use /home/site/wwwroot/ssl/DigiCertGlobalRootCA.crt.pem como o valor. Esta configuração do 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 por conveniência.
  • LOG_CHANNEL: Use stderr como valor. Essa configuração informa ao Laravel para canalizar os logs para o stderr, o que faz com que estejam disponíveis para os logs do Serviço de Aplicativo.
  • APP_DEBUG: Use true como valor. É uma variável de depuração do Laravel que ativa as páginas do modo de depuração.
  • APP_KEY: Use base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= como o valor. É uma variável de criptografia Laravel.

Importante

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

Idealmente, a definição da aplicação APP_KEY também deve ser configurada como uma referência ao cofre de chaves, o que é um processo em várias etapas. Para obter mais informações, consulte Como alterar a configuração do aplicativo APP_KEY para uma referência do Cofre da Chave?

5 - Implantar código de exemplo

Nesta etapa, você configura a implantação do GitHub usando as Ações do GitHub. É apenas uma das muitas formas de publicar no App Service, mas também uma excelente forma de ter integração contínua no seu processo de implantação. Por padrão, cada git push no seu repositório do GitHub inicia a ação de compilação e implantação.

1º Passo: De volta ao espaço de código do GitHub da bifurcação de exemplo, execute git pull origin main. Isto importa o arquivo de fluxo de trabalho recém-adicionado para o seu ambiente de desenvolvimento.

Passo 2 (Opção 1: com o Copilot do GitHub):

  1. Inicie uma nova sessão de chat selecionando a vista Chat e, em seguida, selecionando +.
  2. Pergunte: "@workspace Como o aplicativo se conecta ao banco de dados e redis?" O Copilot pode lhe dar algumas explicações sobre como as configurações são configuradas em config/database.php.
  3. Pergunte: "@workspace No modo de produção, meu aplicativo está sendo executado em um aplicativo Web do Serviço de Aplicativo, que usa o Azure Service Connector para se conectar a um servidor flexível do MySQL. Quais são os nomes das variáveis de ambiente que preciso usar?" O Copilot pode lhe dar uma sugestão de código semelhante à da Opção 2: sem as etapas do Copilot do GitHub abaixo e até mesmo dizer para você fazer a alteração no arquivo config/database.php .
  4. Abra config/database.php no explorador e adicione a sugestão de código.
  5. Pergunte: "@workspace 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 das variáveis de ambiente que preciso usar?*" Copilot pode lhe dar uma sugestão de código semelhante à da Opção 2: sem GitHub Copilot etapas abaixo e até mesmo dizer-lhe para fazer a alteração no arquivo config/database.php . Se solicitado, entre no GitHub Copilot for Azure para obter respostas mais precisas.
  6. Adicione a sugestão de código. O GitHub Copilot não lhe dá a mesma resposta todas as vezes, e nem sempre é correto. Talvez seja necessário fazer mais perguntas para ajustar a resposta. Para obter dicas, consulte O que posso fazer com o GitHub Copilot no meu codespace?.

Passo 2 (Opção 2: sem o Copilot do GitHub):

  1. Abra config/database.php no explorador. Encontre a mysql seção 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. Substitua REDIS_HOST (linha 142) por AZURE_REDIS_HOST.
  9. Substitua REDIS_PASSWORD (linha 144) por AZURE_REDIS_PASSWORD.
  10. Substitua REDIS_PORT (linha 145) por AZURE_REDIS_PORT.
  11. Substitua REDIS_CACHE_DB (linha 146) por AZURE_REDIS_DATABASE.
  12. Na mesma seção, adicione uma linha com 'scheme' => 'tls',. Essa configuração diz ao Laravel para usar criptografia para se conectar ao Redis.

Passo 3:

  1. Selecione a extensão Controlo de Código.
  2. Na caixa de texto, digite uma mensagem de confirmação como Configure Azure database and cache connections. Ou selecione e deixe o GitHub Copilot gerar uma mensagem de confirmação para você.
  3. Selecione Confirmar e, em seguida, confirme com Sim.
  4. Selecione Sincronizar alterações 1 e, em seguida, confirme com OK.

4º passo: De volta à página Centro de Implementação no portal do Azure:

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

5º Passo: Você é levado ao repositório do GitHub e vê que a ação do GitHub está em execução. O arquivo de fluxo de trabalho define dois estágios separados, build e deploy. Aguarde até que a execução do GitHub mostre um status de Sucesso. Demora cerca de 10 minutos.

Tem problemas? Verifique a seção 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 endpoint privado, para que seja acessível apenas 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 à página do Serviço de Aplicativo, no menu à esquerda,

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

Passo 2: No terminal SSH:

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

Gorjeta

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

7 - Alterar raiz do site

Em vez disso, o ciclo de vida do aplicativo Laravel começa no diretório /public . O contêiner PHP padrão para o Serviço de Aplicativo usa Nginx, que começa no diretório raiz do aplicativo. Para alterar a raiz do site, você precisa alterar o arquivo de configuração do Nginx no contêiner 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, não quer substituir este arquivo usando o shell SSH, porque a alteração está fora de /home e será perdida após uma reinicialização do aplicativo.

Passo 1:

  1. No menu à esquerda, selecione Configuração.
  2. Selecione o separador Configurações gerais.

Passo 2: No separador Definições gerais:

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

8 - Navegue até o aplicativo

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

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

Passo 2: Adicione algumas tarefas à lista. Parabéns, você está executando um aplicativo PHP seguro orientado por dados no Serviço de Aplicativo do Azure.

Gorjeta

A aplicação de exemplo implementa o padrão cache-aside. Quando você recarrega a página depois de fazer alterações de 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 transmissão

O Serviço de Aplicativo do Azure captura todas as mensagens registradas no console para ajudá-lo 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 esse recurso. Por padrão, a funcionalidade de registro em log do Laravel (por exemplo, Log::info()) produz saídas para um arquivo local. Sua LOG_CHANNEL configuração de aplicativo anterior torna as entradas de log acessíveis a partir do fluxo de log 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 Registo de aplicações, selecione Sistema de ficheiros.

Passo 2: No menu à esquerda, selecione Log stream. Você vê os logs do seu aplicativo, incluindo logs da plataforma e logs de dentro do contêiner.

Limpar recursos

Quando terminar, pode eliminar todos os recursos da sua subscrição do Azure eliminando 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.

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

Passo 3:

  1. Introduza o nome do grupo de recursos para confirmar a sua eliminação.
  2. Selecione Eliminar.

2. Crie recursos do Azure e implante um aplicativo de exemplo

Nesta etapa, você cria os recursos do Azure e implanta um aplicativo de exemplo 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 espaço de código do GitHub já tem a CLI do Desenvolvedor do Azure (AZD).

  1. Gere uma chave de encriptação Laravel com php artisan key:generate --show:

    php artisan key:generate --show
    
  2. Entre no Azure executando o azd auth login comando e seguindo o prompt:

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

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

    Pergunta Resposta
    Insira um novo nome de ambiente Escreva um nome exclusivo. O modelo 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ífenes.
    Selecione uma Assinatura do Azure para usar Selecione a sua subscrição.
    Selecione um local do Azure para usar Selecione uma localização.
    Insira um valor para o parâmetro seguro de infraestrutura 'appKey' Utilize a saída de php artisan key:generate --show aqui. O modelo AZD cria um segredo do Azure Key Vault que pode usar na sua aplicação.
    Insira um valor para o parâmetro protegido da infraestrutura 'databasePassword' Senha do banco de dados para MySQL. Deve ter pelo menos 8 caracteres e conter letras maiúsculas, minúsculas, números e caracteres especiais.

    O azd up comando 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ê modifica o código posteriormente para trabalhar com o Serviço de Aplicativo. Enquanto está em execução, o comando fornece mensagens sobre o processo de provisionamento e implantação, incluindo um link para a implantação no Azure. Quando terminar, o comando também exibirá um link para a aplicação de implementação.

    Este modelo 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. Um plano Linux na camada B1 é criado.
    • Serviço de Aplicativo: representa seu aplicativo e é executado no plano do Serviço de Aplicativo.
    • Rede virtual: integrada com a aplicação do serviço App Service e isola o tráfego de rede back-end.
    • Banco de Dados do Azure para Servidor Flexível MySQL: Acessível somente a partir da rede virtual por meio da integração de zona DNS. Um banco de dados é criado para você no servidor.
    • Cache do Azure para Redis: acessível apenas a partir da rede virtual.
    • Pontos de extremidade privados: pontos de extremidade de acesso 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.
    • Espaço de trabalho do Log Analytics: atua como o contêiner de destino para seu aplicativo enviar seus logs, onde você também pode consultar os logs.
    • Key Vault: usado para manter a mesma palavra-passe do banco de dados quando se reimplementa com o AZD.

Tem problemas? Verifique a seção Solução de problemas.

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

O modelo AZD que você usa gerou as variáveis de conectividade para você já 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ódigo.

  1. Na saída 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. Eles parecem assim no resultado 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á-los em seu código mais tarde. Para sua conveniência, o modelo AZD mostra o link direto para a página de configurações do aplicativo no portal do Azure.

  2. No explorador, abra config/database.php. Este é o arquivo de configuração para conexões de banco de dados e cache Redis.

  3. Encontre a parte que define a mysql conexão (linhas 46-64) e substitua DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, e DB_PASSWORD pelas configurações do AZURE_MYSQL_ aplicativo na saída AZD. A sua mysql conexão deve assemelhar-se 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 do Laravel.

  4. Encontre a parte que define a conexão de cache Redis (linhas 140-147) e substitua REDIS_HOST, REDIS_PASSWORD, REDIS_PORTe REDIS_CACHE_DB pelas configurações do Azure_REDIS_ aplicativo na saída AZD. Além disso, adicione 'scheme' => 'tls', à conexão. A sua conexão de cache deverá assemelhar-se 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 as configurações do Laravel no aplicativo Web

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

  2. Encontre a parte que define as configurações do aplicativo (linhas 510-514) e descomente-as. Estas definições da aplicação são:

    Configurações Descrição
    CACHE_DRIVER Diz ao Laravel para usar o Redis como cache (consulte a documentação do 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 por conveniência. Esta variável é usada pela conexão mysql em config/database.php
    LOG_CHANNEL Diz ao Laravel para canalizar os logs para stderr, disponibilizando-os para os logs do Serviço de Aplicativo (consulte a documentação do Laravel).
    APP_DEBUG Habilite as páginas do modo de depuração no Laravel (consulte a documentação do Laravel).
    APP_KEY Variável de encriptação Laravel. O modelo AZD já criou um segredo do Cofre da Chave (linhas 212-217), para que você o acesse com uma referência do Cofre da Chave.
  3. Em infra/resources.bicep, localize a definição de recurso para a aplicação do App Service e descomente 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 Nginx, que começa na raiz do aplicativo. Para alterar a raiz do site, você precisa alterar o arquivo de configuração do Nginx no contêiner 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 default, que diz ao Nginx para procurar no diretório /public . Este comando personalizado em appCommandLine é executado todas as vezes que a aplicação inicia, para aplicar a substituição de arquivo sempre que o contêiner Linux é recarregado de um estado limpo.

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

    azd up
    

Gorjeta

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

Tem problemas? Verifique a seção 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 Linux no Serviço de Aplicativo.

  1. Na saída AZD, localize o URL da sessão SSH e navegue até ele no navegador. Tem esta aparência na saída:

     Open SSH session to App Service container at: <URL>
     
  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 for bem-sucedido, o Serviço de Aplicativo está se conectando com êxito ao banco de dados.

Observação

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

Tem problemas? Verifique a seção Solução de problemas.

6. Navegue até o aplicativo

  1. Na saída AZD, localize a URL do seu aplicativo e navegue até ela no navegador. O URL tem esta aparência na saída AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: <URL>
     
  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 conectividade segura ao Banco de Dados do Azure para MySQL.

Tem problemas? Verifique a seção 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 ajudá-lo a diagnosticar problemas com seu aplicativo. Por conveniência, o modelo AZD já ativou o registo no sistema de ficheiros local e está a enviar os registos para uma área de trabalho do Log Analytics.

O aplicativo de exemplo gera mensagens de log do console em cada um de seus pontos de extremidade para demonstrar esse recurso. Por padrão, a funcionalidade de registro em log do Laravel (por exemplo, Log::info()) produz saídas para um arquivo local. Sua LOG_CHANNEL configuração de aplicativo anterior torna as entradas de log acessíveis a partir do fluxo de log 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 AZD, localize o link para transmitir em fluxo contínuo os logs do Serviço de Aplicações e acesse-o no navegador. O link tem esta aparência na saída AZD:

Stream App Service logs at: <URL>

Tem problemas? Verifique a seção 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

Solução de problemas

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

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

Recebo uma página em branco no navegador.

Isso indica que o Serviço de Aplicativo não consegue encontrar os arquivos de início do PHP em /public. Siga os passos indicados em 4. Defina as configurações do Laravel no aplicativo Web.

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

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

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

Este erro e erros semelhantes indicam que você não executou composer install antes azd upou que os pacotes no diretório /vendor estão obsoletos. Execute composer install e azd deploy novamente.

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

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

Aparece uma página de depuração no meu 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 os passos em 5. Gerar esquema de banco de dados.

Perguntas mais frequentes

Quanto custa esta configuração?

O preço dos recursos criados é o seguinte:

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

Como faço para me conectar ao banco de dados MySQL que está protegido atrás da rede virtual com outras ferramentas?

  • Para acesso básico a partir de uma ferramenta de linha de comando, você pode executar mysql a partir do terminal SSH do aplicativo.
  • Para se conectar a partir de uma ferramenta de desktop como o MySQL Workbench, sua máquina deve estar dentro da rede virtual. Por exemplo, pode ser uma VM do Azure conectada a uma das sub-redes ou uma máquina 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 faço para alterar a configuração do aplicativo APP_KEY para uma referência ao Cofre de Chaves?

Nas etapas do portal em 4 - Configurar variáveis Laravel, você pode alterar APP_KEY para uma referência do Cofre da Chave executando os seguintes comandos da CLI do Azure no espaço de código 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. Adicionar um segredo ao Cofre de Chaves
  3. Recuperar um segredo do Cofre de Chaves
  4. Definir definições da aplicação

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

Utilize o ficheiro de fluxo de trabalho gerado automaticamente pelo App Service como exemplo; cada git push inicia uma nova execução de compilação e implantação. A partir de um clone local do repositório GitHub, você faz com que as atualizações desejadas o enviem 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 a execução de dois trabalhos de compilação e implantação. Como cada trabalho é executado em seu próprio ambiente limpo, o arquivo de fluxo de trabalho garante que o deploy trabalho tenha acesso aos arquivos do build trabalho:

A maior parte do tempo gasto pelo processo de dois trabalhos é gasto 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 upload e download.

Não tenho permissões para criar uma identidade atribuída pelo utilizador

Consulte Configurar a implantação de ações do GitHub no Centro de Implantação.

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

Você pode notar que a visualização de bate-papo do GitHub Copilot já estava lá para você quando você criou o espaço de código. Para sua conveniência, incluímos a extensão de chat do GitHub Copilot na definição de contêiner (consulte .devcontainer/devcontainer.json). No entanto, você precisa de uma conta GitHub Copilot (teste gratuito de 30 dias disponível).

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

  • Em uma única sessão de bate-papo, as perguntas e respostas se baseiam umas nas outras e você pode ajustar suas perguntas para ajustar a resposta obtida.
  • 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 é permitido fazer as alterações para você. Cabe a você adicionar as alterações sugeridas e testá-las.

Próximos passos

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

Ou confira outros recursos: