Dela via


Självstudie: Distribuera en PHP-, MySQL- och Redis-app till Azure App Service

Den här självstudien visar hur du skapar en säker PHP-app i Azure App Service som ansluter till en MySQL-databas (med Azure Database for MySQL – flexibel server). Du distribuerar också en Azure Cache for Redis för att aktivera cachelagringskoden i ditt program. Azure App Service är en mycket skalbar, självuppdaterande webbvärdtjänst som enkelt kan distribuera appar på Windows eller Linux. När du är klar har du en Laravel-app som körs på Azure App Service på Linux.

Skärmbild av Azure-appexemplet med titeln Uppgiftslista som visar nya aktiviteter som lagts till.

Förutsättningar

1 – Kör exemplet

Först konfigurerar du en exempeldatadriven app som utgångspunkt. Exempellagringsplatsen innehåller för enkelhetens skull en konfiguration av utvecklingscontainer. Utvecklingscontainern har allt du behöver för att utveckla ett program, inklusive databasen, cachen och alla miljövariabler som krävs av exempelprogrammet. Utvecklingscontainern kan köras i ett GitHub-kodområde, vilket innebär att du kan köra exemplet på valfri dator med en webbläsare.

Steg 1: I ett nytt webbläsarfönster:

  1. Logga in på ditt GitHub-konto.
  2. Navigera till https://github.com/Azure-Samples/laravel-tasks/fork.
  3. Välj Skapa förgrening.

Steg 2: I GitHub-förgreningen:

  1. Välj Kod>Skapa kodområde på main. Det tar några minuter att konfigurera kodområdet. Dessutom innehåller den angivna .env-filen redan en dummyvariabelAPP_KEY som Laravel behöver köra lokalt.

Steg 3: I kodområdesterminalen:

  1. Kör composer install.
  2. Kör databasmigreringar med php artisan migrate.
  3. Kör appen med php artisan serve.
  4. När du ser meddelandet Your application running on port 80 is available.väljer du Öppna i webbläsare. Du bör se exempelprogrammet på en ny webbläsarflik. Om du vill stoppa programmet skriver du Ctrl+C.

Har du problem? Kontrollera felsökningsavsnittet.

2 – Skapa App Service, databas och cache

I det här steget skapar du Azure-resurserna. Stegen som används i den här självstudien skapar en uppsättning resurser med säkerhet som standard, vilka inkluderar App Service, Azure Database for MySQL och Azure Cache for Redis. För skapandeprocessen anger du:

  • Webbappens namn . Den används som en del av DNS-namnet för din app.
  • Regionen som ska köra appen fysiskt i världen. Den används också som en del av DNS-namnet för din app.
  • Runtime-stacken för appen. Det är där du väljer vilken version av PHP som ska användas för din app.
  • Hostingplanen för appen. Det är prisnivån som innehåller uppsättningen funktioner och skalningskapacitet för din app.
  • Resursgruppen för appen. Med en resursgrupp kan du gruppera (i en logisk container) alla Azure-resurser som behövs för programmet.

Logga in på Azure Portal och följ dessa steg för att skapa dina Azure App Service-resurser.

Steg 1: I Azure-portalen:

  1. I det övre sökfältet skriver du App Service.
  2. Välj objektet med etiketten App Service under rubriken Tjänster .
  3. Välj Skapa>webbapp. Du kan också navigera direkt till skapa guiden.

Steg 2: På sidan Skapa webbapp fyller du i formuläret på följande sätt.

  1. Namn: msdocs-laravel-mysql-XYZ. En resursgrupp med namnet msdocs-laravel-mysql-XYZ_group genereras åt dig.
  2. Körningsstack: PHP 8.4.
  3. Operativsystem: Linux.
  4. Region: Alla Azure-regioner nära dig.
  5. Linux-plan: Skapa ny och använd namnet msdocs-laravel-mysql-XYZ.
  6. Prisplan: Basic. När du är redo kan du skala upp till en annan prisnivå.

Steg 3:

  1. Välj fliken Databas .
  2. Välj Skapa en databas.
  3. I Motor väljer du MySQL – flexibel server.
  4. Välj Skapa en Azure Cache for Redis.
  5. I Namn (under Cache) anger du ett namn för cachen.
  6. I SKU väljer du Grundläggande.

Steg 4:

  1. Välj fliken Distribution .
  2. Aktivera kontinuerlig distribution.
  3. I Organisation väljer du ditt GitHub-alias.
  4. I Lagringsplats väljer du laravel-tasks.
  5. Välj Branch och sedan main.
  6. Kontrollera att Grundläggande autentisering är inaktiverat.
  7. Välj Granska + skapa.
  8. När valideringen är klar väljer du Skapa.

Steg 5: Implementeringen tar några minuter att bli klar. När distributionen är klar väljer du knappen Gå till resurs . Du tas direkt till App Service-appen, men följande resurser skapas:

  • Resursgrupp: Containern för alla skapade resurser.
  • App Service-plan: Definierar beräkningsresurserna för App Service. En Linux-plan på Basic-nivån skapas.
  • App Service: Representerar din app och körs i App Service-planen.
  • Virtuellt nätverk: Integrerat med App Service-appen och isolerar serverdelsnätverkstrafik.
  • Privata slutpunkter: Åtkomstslutpunkter för databasservern och Redis-cachen i det virtuella nätverket.
  • Nätverksgränssnitt: Representerar privata IP-adresser, en för var och en av de privata slutpunkterna.
  • Azure Database for MySQL Flexible Server: Endast tillgänglig från sin privata slutpunkt. En databas och en användare skapas åt dig på servern.
  • Azure Cache for Redis: Endast tillgänglig bakom den privata slutpunkten.
  • Privata DNS-zoner: Aktivera DNS-upplösning för databasservern och Redis-cachen inom det virtuella nätverket.

3 – Skydda anslutningshemligheter

Guiden skapade redan anslutningsvariablerna åt dig som appinställningar. Bästa praxis för säkerhet är dock att hålla hemligheter borta från App Service helt. Du flyttar dina hemligheter till ett nyckelvalv och ändrar appinställningen till Key Vault-referenser med hjälp av Service Connectors.

Steg 1: Hämta den befintliga anslutningssträng

  1. På den vänstra menyn på sidan App Service väljer du Inställningar > Miljövariabler.
  2. Välj Anslutningssträngar.
  3. Välj AZURE_MYSQL_CONNECTIONSTRING.
  4. I inställningen Lägg till/redigera program i fältet Värde kopierar du användarnamnet och lösenordet för senare användning. Med anslutningssträngen kan du ansluta till MySQL-databasen som skyddas bakom privata slutpunkter. Hemligheterna sparas dock direkt i App Service-appen, vilket inte är det bästa. Du kommer att ändra det här.

Steg 2: Skapa ett nyckelvalv för säker hantering av hemligheter

  1. I det övre sökfältet skriver du "key vault" och väljer sedan Marketplace>Key Vault.
  2. I Resursgrupp väljer du msdocs-laravel-mysql-XYZ_group.
  3. I Key Vault-namn skriver du ett namn som endast består av bokstäver och siffror.
  4. I Region anger du den till samma plats som resursgruppen.

Steg 3: Skydda nyckelvalvet med en privat slutpunkt

  1. Välj fliken Nätverk.
  2. Avmarkera Aktivera offentlig åtkomst.
  3. Välj Skapa en privat slutpunkt.
  4. I Resursgrupp väljer du msdocs-laravel-mysql-XYZ_group.
  5. I dialogrutan i Plats väljer du samma plats som din App Service-app.
  6. I Namn skriver du msdocs-laravel-mysql-XYZVaultEndpoint.
  7. I Virtuellt nätverk väljer du det virtuella nätverket i gruppen msdocs-laravel-mysql-XYZ_group .
  8. I Undernät väljer du det tillgängliga kompatibla undernätet. Webbappsguiden skapade den för din bekvämlighet.
  9. Välj OK.
  10. Välj Granska + skapaoch välj sedan Skapa. Vänta tills nyckelvalv-implementeringen är klar. Du ska se "Din utrullning är klar."

Steg 4: Skapa MySQL-anslutningsappen

  1. I det övre sökfältet skriver du msdocs-laravel-mysql och väljer sedan App Service-resursen msdocs-laravel-mysql-XYZ.
  2. På sidan App Service går du till den vänstra menyn och väljer Inställningar > Tjänstanslutning.
  3. Välj Skapa.
  4. Som Tjänsttyp väljer du DB för Flexibel MySQL-server.
  5. För Flexibel MySQL-server väljer du din server (till exempel msdocs-laravel-mysql-235-server).
  6. För MySQL-databas väljer du din databas (till exempel msdocs-laravel-mysql-235-database).

Steg 5: Konfigurera autentisering för MySQL-anslutningsappen

  1. Välj fliken autentisering.
  2. Välj Anslutningssträng.
  3. I Lösenord klistrar du in lösenordet som du kopierade tidigare.
  4. Välj Lagra hemlighet i Key Vault.
  5. Under Key Vault-anslutning väljer du Skapa ny. Dialogrutan Skapa anslutning öppnas ovanpå redigeringsdialogrutan.

Steg 6: Upprätta Key Vault-anslutningen

  1. I dialogrutan Skapa anslutning för Key Vault-anslutningen går du till Key Vault och väljer det nyckelvalv som du skapade tidigare.
  2. Välj Granska + Skapa.
  3. När verifieringen är klar väljer du Skapa.

Steg 6: Slutför MySQL-anslutningsinställningarna

  1. Du är tillbaka i dialogrutan för MySQL-anslutning. På fliken Autentisering väntar du tills key vault-anslutningsappen har skapats. När det är klart väljer listrutan Key Vault-anslutning automatiskt.
  2. Välj Granska + Skapa.
  3. Välj Skapa. Vänta tills meddelandet Uppdatera lyckades visas.

Steg 7: Konfigurera Redis-anslutningen för att använda Key Vault-hemligheter

  1. På sidan Tjänstanslutningsprogram markerar du kryssrutan bredvid Cache for Redis-anslutningsappen och väljer sedan Redigera.
  2. Välj fliken autentisering.
  3. Välj Lagra hemlighet i Key Vault.
  4. Under Key Vault-anslutning väljer du det nyckelvalv som du skapade.
  5. Välj Nästa: Nätverk.
  6. Välj Konfigurera brandväggsregler för att aktivera åtkomst till måltjänsten. Guiden för att skapa appar har redan skyddat SQL-databasen med en privat slutpunkt.
  7. Välj Spara. Vänta tills meddelandet Uppdatera lyckades visas.

Steg 8: Verifiera Key Vault-integreringen

  1. På den vänstra menyn väljer du Inställningar > Miljövariabler igen.
  2. Bredvid AZURE_MYSQL_PASSWORD väljer du Visa värde. Värdet ska vara @Microsoft.KeyVault(...), vilket innebär att det är en nyckelvalvsreferens eftersom hemligheten nu hanteras i nyckelvalvet.
  3. Om du vill verifiera Redis-anslutningssträng väljer du Visa värde bredvid AZURE_REDIS_CONNECTIONSTRING.

För att sammanfatta processen för att skydda dina anslutningshemligheter:

  • Hämtar anslutningshemligheterna från App Service-appens miljövariabler.
  • Skapa ett nyckelvalv.
  • Skapa en Key Vault-anslutning med den systemtilldelade hanterade identiteten.
  • Uppdatera tjänstanslutningarna för att lagra konfidentiella uppgifter i nyckelvalvet.

Har du problem? Kontrollera felsökningsavsnittet.


4 – Konfigurera Laravel-variabler

Steg 1: Skapa CACHE_DRIVER som en appinställning.

  1. På fliken Appinställningar väljer du Lägg till.
  2. I fältet Namn anger du CACHE_DRIVER.
  3. I fältet Värde anger du redis.
  4. Välj Använd och sedan Tillämpa igen och sedan Bekräfta.

Steg 2: Skapa följande appinställningar med samma steg i steg 1:

  • MYSQL_ATTR_SSL_CA: Använd /home/site/wwwroot/ssl/DigiCertGlobalRootCA.crt.pem som värde. Den här appinställningen pekar på sökvägen till det TLS/SSL-certifikat som du behöver för att komma åt MySQL-servern. Det ingår i exempelarkivet för bekvämlighet.
  • LOG_CHANNEL: Använd stderr som värde. Den här inställningen instruerar Laravel att skicka loggar till stderr, vilket gör den tillgänglig för App Service-loggarna.
  • APP_DEBUG: Använd true som värde. Det är en Laravel-felsökningsvariabel som aktiverar sidor i felsökningsläge.
  • APP_KEY: Använd base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= som värde. Det är en Laravel-krypteringsvariabel.

Viktigt!

Värdet APP_KEY används här för enkelhetens skull. För produktionsscenarier bör den genereras specifikt för distributionen med hjälp av php artisan key:generate --show kommandoraden.

Helst bör appinställningen APP_KEY också konfigureras som en nyckelvalvsreferens, vilket är en process i flera steg. Mer information finns i Hur ändrar jag inställningen APP_KEY app till en Key Vault-referens?

5 – Distribuera exempelkod

I det här steget konfigurerar du GitHub-distribution med GitHub Actions. Det är bara ett av många sätt att distribuera till App Service, men också ett bra sätt att ha kontinuerlig integrering i distributionsprocessen. Som standard startar varje git push till din GitHub-lagringsplats bygg- och distributionsåtgärden.

Steg 1: Kör i din GitHub-kodmiljö för exempel-forken git pull origin main. Detta drar in den nyligen slutförda arbetsflödesfilen i ditt kodutrymme.

Steg 2 (alternativ 1: med GitHub Copilot):

  1. Starta en ny chattsession genom att välja vyn Chatt och sedan välja +.
  2. Fråga: "@workspace Hur ansluter appen till databasen och redis?" Copilot kan ge dig en förklaring av hur inställningarna konfigureras i config/database.php.
  3. Fråga: "@workspace I produktionsläge körs min app i en App Service-webbapp som använder Azure Service Connector för att ansluta till en flexibel MySQL-server. Vilka miljövariabelnamn behöver jag använda? Copilot kan ge dig ett kodförslag som liknar det i alternativ 2: utan GitHub Copilot-stegen nedan och till och med be dig att göra ändringen i filen config/database.php .
  4. Öppna konfiguration/database.php i utforskaren och lägg till kodförslaget.
  5. Fråga: "@workspace Min App Service-app använder också Azure Service Connector för att ansluta till en Cache for Redis med hjälp av Django-klienttypen. Vilka miljövariabelnamn behöver jag använda?*" Copilot kan ge dig ett kodförslag som liknar det i alternativ 2: utan GitHub Copilot-stegen nedan och till och med be dig att göra ändringen i filen config/database.php . Om du uppmanas att göra det loggar du in på GitHub Copilot för Azure för att få mer exakta svar.
  6. Lägg till kodförslaget. GitHub Copilot ger dig inte samma svar varje gång, och det är inte alltid korrekt. Du kan behöva ställa fler frågor för att finjustera svaret. Tips finns i Vad kan jag göra med GitHub Copilot i mitt kodområde?.

Steg 2 (alternativ 2: utan GitHub Copilot):

  1. Öppna konfiguration/database.php i utforskaren. Leta upp avsnittet mysql och gör följande ändringar:
  2. Ersätt DB_HOST (rad 49) med AZURE_MYSQL_HOST.
  3. Ersätt DB_DATABASE (rad 51) med AZURE_MYSQL_DBNAME.
  4. Ersätt DB_USERNAME (rad 52) med AZURE_MYSQL_USERNAME.
  5. Ersätt DB_PASSWORD (rad 53) med AZURE_MYSQL_PASSWORD.
  6. Ersätt DB_PORT (rad 50) med AZURE_MYSQL_PORT.
  7. Bläddra till avsnittet Redis cache och gör följande ändringar:
  8. Ersätt REDIS_HOST (rad 142) med AZURE_REDIS_HOST.
  9. Ersätt REDIS_PASSWORD (rad 144) med AZURE_REDIS_PASSWORD.
  10. Ersätt REDIS_PORT (rad 145) med AZURE_REDIS_PORT.
  11. Ersätt REDIS_CACHE_DB (rad 146) med AZURE_REDIS_DATABASE.
  12. I samma avsnitt lägger du till en rad med 'scheme' => 'tls',. Den här konfigurationen instruerar Laravel att använda kryptering för att ansluta till Redis.

Steg 3:

  1. Välj källkontrolltillägget.
  2. I textrutan skriver du ett incheckningsmeddelande som Configure Azure database and cache connections. Eller välj och låt GitHub Copilot generera ett incheckningsmeddelande åt dig.
  3. Välj Checka in och bekräfta sedan med Ja.
  4. Välj Synkronisera ändringar 1 och bekräfta sedan med OK.

Steg 4: Tillbaka på sidan Distributionscenter i Azure-portalen:

  1. Välj fliken Loggar och välj sedan Uppdatera för att se den nya distributionskörningen.
  2. I loggobjektet för distributionskörningen väljer du posten Skapa/distribuera loggar med den senaste tidsstämpeln .

Steg 5: Du tas till din GitHub-lagringsplats och ser att GitHub-åtgärden körs. Arbetsflödesfilen definierar två separata steg, skapa och distribuera. Vänta tills GitHub-körningen visar statusen Lyckades. Det tar ungefär 10 minuter.

Har du problem? Kontrollera felsökningsavsnittet.

6 – Generera databasschema

Skapelseguiden placerar MySQL-databasservern bakom en privat slutpunkt, så den är endast tillgänglig från det virtuella nätverket. Eftersom App Service-appen redan är integrerad med det virtuella nätverket är det enklaste sättet att köra databasmigreringar med databasen direkt från App Service-containern.

Steg 1: Tillbaka i App Service-sidan, i den vänstra menyn,

  1. Välj Utvecklingsverktyg>SSH.
  2. Välj .

Steg 2: I SSH-terminalen:

  1. Kör cd /home/site/wwwroot. Här är alla dina distribuerade filer.
  2. Kör php artisan migrate --force. Om det lyckas ansluter App Service till MySQL-databasen.

Tips

I SSH-sessionen kan endast ändringar av filer i /home sparas utöver omstarter av appar. Ändringar utanför /home sparas inte.

7 – Ändra webbplatsens rot

Laravel-programmets livscykel börjar i katalogen /public i stället. Php-standardcontainern för App Service använder Nginx, som startar i programmets rotkatalog. Om du vill ändra platsroten måste du ändra Nginx-konfigurationsfilen i PHP-containern (/etc/nginx/sites-available/default). För din bekvämlighet innehåller exempellagringsplatsen en anpassad konfigurationsfil som kallas standard. Som tidigare nämnts vill du inte ersätta den här filen med hjälp av SSH-gränssnittet, eftersom ändringen ligger utanför och kommer att gå förlorad efter en omstart av /home appen.

Steg 1 :

  1. Välj Konfiguration på den vänstra menyn.
  2. Välj fliken Allmänt inställningar.

Steg 2: På fliken Allmänna inställningar:

  1. I rutan Startkommando anger du följande kommando: cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload.
  2. Välj Spara och välj sedan Fortsätt. Kommandot ersätter Nginx-konfigurationsfilen i PHP-containern och startar om Nginx. Den här konfigurationen säkerställer att samma ändring görs i containern varje gång den startas.

8 – Bläddra till appen

Steg 1: På App Service-sidan:

  1. Välj Översikt på den vänstra menyn.
  2. Välj appens standarddomän .

Steg 2: Lägg till några uppgifter i listan. Grattis, du kör en säker datadriven PHP-app i Azure App Service.

Tips

Exempelprogrammet implementerar cache-aside-mönstret . När du läser in sidan igen när du har gjort dataändringar visas svarstiden på webbsidan mycket snabbare eftersom den läser in data från cachen i stället för databasen.

9 – Överföra diagnostikloggar

Azure App Service samlar in alla meddelanden som loggas till konsolen för att hjälpa dig att diagnostisera problem med ditt program. Exempelappen matar ut konsolloggmeddelanden i var och en av sina slutpunkter för att demonstrera den här funktionen. Som standard matas Laravels loggningsfunktion (till exempel Log::info()) ut till en lokal fil. Appinställningen LOG_CHANNEL från tidigare gör loggposter tillgängliga från App Service-loggströmmen.

Steg 1: På App Service-sidan:

  1. Välj App Service-loggar på den vänstra menyn.
  2. Under Programloggning väljer du Filsystem.

Steg 2: Välj Loggström på den vänstra menyn. Du ser loggarna för din app, inklusive plattformsloggar och loggar inifrån containern.

Rensa resurser

När du är klar kan du ta bort alla resurser från din Azure-prenumeration genom att ta bort resursgruppen.

Steg 1: I sökfältet överst i Azure Portal:

  1. Ange resursgruppsnamnet.
  2. Välj resursgruppen.

Steg 2: På resursgruppssidan väljer du Ta bort resursgrupp.

Steg 3:

  1. Ange resursgruppens namn för att bekräfta borttagningen.
  2. Välj Ta bort.

2. Skapa Azure-resurser och distribuera en exempelapp

I det här steget skapar du Azure-resurserna och distribuerar en exempelapp för att App Service på Linux. Stegen som används i den här självstudien skapar en uppsättning resurser som är säkra som standard, inklusive App Service och Azure Database för MySQL.

GitHub-kodområdet har redan Azure Developer CLI (AZD).

  1. Generera en Laravel-krypteringsnyckel med php artisan key:generate --show:

    php artisan key:generate --show
    
  2. Logga in på Azure genom att köra azd auth login kommandot och följa instruktionerna:

    azd auth login
    
  3. Skapa nödvändiga Azure-resurser och distribuera appkoden med azd up kommandot . Följ uppmaningen för att välja önskad prenumeration och plats för Azure-resurserna.

    azd up
    
  4. När du uppmanas att ge följande svar:

    Fråga Svar
    Ange ett nytt miljönamn Skriv ett unikt namn. AZD-mallen använder det här namnet som en del av DNS-namnet på din webbapp i Azure (<app-name>-<hash>.azurewebsites.net). Alfanumeriska tecken och bindestreck tillåts.
    Välj en Azure-prenumeration som ska användas Välj din prenumeration.
    Välj en Azure-plats att använda Välj en plats.
    Ange ett värde för infrastrukturskyddad parameter för "appKey" Använd utdata php artisan key:generate --show här. AZD-mallen skapar en Key Vault-hemlighet för den som du kan använda i din app.
    Ange ett värde för infrastruktursäkrad parameter för "databasePassword" Databaslösenord för MySQL. Den måste vara minst 8 tecken lång och innehålla versaler, gemener, siffror och specialtecken.

    Kommandot azd up tar cirka 15 minuter att slutföra (Redis-cachen tar mest tid). Den kompilerar och distribuerar även programkoden, men du ändrar koden senare så att den fungerar med App Service. När den körs innehåller kommandot meddelanden om etablerings- och distributionsprocessen, inklusive en länk till distributionen i Azure. När det är klart visar kommandot även en länk till distributionsprogrammet.

    Den här AZD-mallen innehåller filer (azure.yaml och infra-katalogen ) som genererar en säker arkitektur som standard med följande Azure-resurser:

    • Resursgrupp: Containern för alla skapade resurser.
    • App Service-plan: Definierar beräkningsresurserna för App Service. En Linux-plan på B1-nivån skapas.
    • App Service: Representerar din app och körs i App Service-planen.
    • Virtuellt nätverk: Integrerat med App Service-appen och isolerar serverdelsnätverkstrafik.
    • Azure Database for MySQL – flexibel server: Endast tillgänglig från det virtuella nätverket via DNS-zonintegrering. En databas skapas åt dig på servern.
    • Azure Cache for Redis: Endast tillgänglig inifrån det virtuella nätverket.
    • Privata slutpunkter: Åtkomstslutpunkter för nyckelvalvet och Redis-cachen i det virtuella nätverket.
    • Privata DNS-zoner: Aktivera DNS-upplösning av nyckelvalv, databaseservern och Redis-cachen på det virtuella nätverket.
    • Log Analytics-arbetsyta: Fungerar som målkontainer för din app för att leverera sina loggar, där du även kan köra frågor mot loggarna.
    • Nyckelvalv: Används för att behålla databaslösenordet på samma sätt när du distribuerar om med AZD.

Har du problem? Kontrollera felsökningsavsnittet.

3. Använd Azure-anslutningssträngar i programkod

Den AZD-mall som du använder genererade anslutningsvariablerna åt dig redan som appinställningar och matar ut dem till terminalen för din bekvämlighet. Appinställningar är ett sätt att hålla anslutningshemligheter borta från din kodlagringsplats.

  1. I AZD-utdata hittar du appinställningarna som börjar med AZURE_MYSQL_ och AZURE_REDIS_. Endast inställningsnamnen visas. De ser ut så här i AZD-utdata:

     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
     

    Inställningar som börjar med AZURE_MYSQL_ är anslutningsvariabler för MySQL-databasen, och inställningar som börjar med AZURE_REDIS_ är för Redis-cachen. Du måste använda dem i koden senare. För att underlätta för dig visar AZD-mallen direktlänken till appens appinställningar i Azure-portalen.

  2. Öppna konfiguration/database.php från utforskaren. Det här är konfigurationsfilen för databas- och Redis-cacheanslutningar.

  3. Leta reda på den del som definierar mysql anslutningen (raderna 46–64) och ersätt DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAMEoch DB_PASSWORD med AZURE_MYSQL_ appinställningarna från AZD-utdata. Anslutningen mysql bör se ut som följande kod.

    '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'),
        ]) : [],
    ],
    

    Mer information om databaskonfiguration i Laravel finns i Laravel-dokumentationen.

  4. Leta reda på den del som definierar Redis-cacheanslutningen (raderna 140–147) och ersätt REDIS_HOST, REDIS_PASSWORD, REDIS_PORToch REDIS_CACHE_DB med Azure_REDIS_ appinställningarna från AZD-utdata. Lägg också till 'scheme' => 'tls', i anslutningen. Cacheanslutningen bör se ut som följande kod:

    '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'),
    ],
    

    Mer information om Redis cachekonfiguration i Laravel finns i Laravel-dokumentationen.

    Anmärkning

    Kom ihåg att ändringarna inte har distribuerats ännu. Du distribuerar dem i slutet av nästa steg.

4. Konfigurera Laravel-inställningar i webbappen

  1. Öppna infra/resources.bicep från utforskaren. Det här är Bicep-filen som definierar de skapade Azure-resurserna.

  2. Leta reda på den del som definierar appinställningarna (raderna 510–514) och avkommentera dem. Dessa appinställningar är:

    Inställning Beskrivning
    CACHE_DRIVER Meddelar Laravel att använda Redis som cache (se Laravel-dokumentationen).
    MYSQL_ATTR_SSL_CA Krävs för att öppna en TLS-anslutning till MySQL i Azure. Certifikatfilen ingår i exempellagringsplatsen för enkelhetens skull. Den här variabeln används av mysql-anslutningen i config/database.php
    LOG_CHANNEL Instruerar Laravel att skicka loggar till stderr, vilket gör det tillgängligt för App Service-loggarna (se Laravel-dokumentationen).
    APP_DEBUG Aktivera felsökningslägessidor i Laravel (se Laravel-dokumentationen).
    APP_KEY Laravel-krypteringsvariabel. AZD-mallen har redan skapat en Key Vault-hemlighet (raderna 212-217), så du kommer åt den med en Key Vault-referens.
  3. I infra/resources.bicep hittar du resursdefinitionen för App Service-appen och avkommentera rad 315.

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

    Laravel-programmets livscykel börjar i katalogen /public i stället för programroten. Php-standardcontainern för App Service använder Nginx, som startar i programroten. Om du vill ändra platsroten måste du ändra Nginx-konfigurationsfilen i PHP-containern (/etc/nginx/sites-available/default). För att underlätta för dig innehåller exempellagringsplatsen en ersättningskonfigurationsfil som kallas standard, vilket talar om för Nginx att titta i katalogen /public . Det här anpassade kommandot i appCommandLine körs varje gång appen startar för att tillämpa filbytet var gång Linux-containern startas om från ett rent tillstånd.

  4. Gå tillbaka till kodutrymmesterminalen och kör azd up igen.

    azd up
    

Tips

azd up kör azd package, azd provision, och azd deploy tillsammans, och det är vettigt eftersom du gör både infrastruktur- och programändringar. Om du bara vill göra ändringar i infrastrukturen kör du azd provision. Om du bara vill distribuera ändringar i programkoden kör du azd deploy.

Har du problem? Kontrollera felsökningsavsnittet.

5. Generera databasschema

Med MySQL-databasen skyddad av det virtuella nätverket är det enklaste sättet att köra Laravel-databasmigreringar i en SSH-session med Linux-containern i App Service.

  1. I AZD-utdata letar du reda på URL:en för SSH-sessionen och navigerar till den i webbläsaren. Det ser ut så här i utdata:

     Open SSH session to App Service container at: <URL>
     
  2. I SSH-sessionen kör du databasmigreringar från katalogen /home/site/wwwroot :

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

    Om det lyckas ansluter App Service till databasen.

Anmärkning

Endast ändringar i filer i /home kan bevaras utöver omstarter av appar.

Har du problem? Kontrollera felsökningsavsnittet.

6. Bläddra till appen

  1. I AZD-utdata letar du reda på url:en för din app och navigerar till den i webbläsaren. URL:en ser ut så här i AZD-utdata:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: <URL>
     
  2. Lägg till några uppgifter i listan.

    En skärmbild av Laravel-webbappen med MySQL som körs i Azure som visar uppgifter.

    Grattis, du kör en webbapp i Azure App Service med säker anslutning till Azure Database for MySQL.

Har du problem? Kontrollera felsökningsavsnittet.

7. Strömma diagnostikloggar

Azure App Service samlar in alla meddelanden som loggas till konsolen för att hjälpa dig att diagnostisera problem med ditt program. För enkelhetens skull har AZD-mallen redan aktiverat loggning till det lokala filsystemet och skickar loggarna till en Log Analytics-arbetsyta.

Exempelappen matar ut konsolloggmeddelanden i var och en av sina slutpunkter för att demonstrera den här funktionen. Som standard matas Laravels loggningsfunktion (till exempel Log::info()) ut till en lokal fil. Appinställningen LOG_CHANNEL från tidigare gör loggposter tillgängliga från App Service-loggströmmen.

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]);
});

I utdata från AZD hittar du länken för att strömma App Service-loggar och navigera till den via webbläsaren. Länken ser ut så här i AZD-utdata:

Stream App Service logs at: <URL>

Har du problem? Kontrollera felsökningsavsnittet.

8. Rensa resurser

Om du vill ta bort alla Azure-resurser i den aktuella distributionsmiljön kör azd down du och följer anvisningarna.

azd down

Felsökning

Jag får felet under databasmigreringar php_network_getaddresses: getaddrinfo for mysqldb failed: No address associated with hostname...

Det anger att MySQL-anslutningsvariabler inte är korrekt konfigurerade. Kontrollera att AZURE_MYSQL_ appinställningarna är korrekt konfigurerade i 3. Använd Azure-anslutningssträngar i programkod.

Jag får en tom sida i webbläsaren.

Det anger att App Service inte kan hitta PHP-startfilerna i /public. Följ stegen i 4. Konfigurera Laravel-inställningar i webbappen.

Jag får en felsökningssida i webbläsaren som säger Unsupported cipher or incorrect key length.

Det anger att APP_KEY inställningen är inställd på en ogiltig nyckel. När du kör azd up, se till att du ställer in appKey till utdata från php artisan key:generate --show.

Jag får en felsökningssida i webbläsaren som säger Uncaught Error: Class "Illuminate\..." not found.

Det här felet och liknande fel indikerar att du inte körde composer install före azd up, eller att paketen i katalogen /vendor är inaktuella. Kör composer install och azd deploy igen.

Jag får en felsökningssida i webbläsaren som säger php_network_getaddresses: getaddrinfo for redishost failed: Name or service not known.

Det anger att Redis-anslutningsvariabler inte är korrekt konfigurerade. Kontrollera att AZURE_REDIS_ appinställningarna är korrekt konfigurerade i 3. Använd Azure-anslutningssträngar i programkod.

Jag får en felsökningssida i webbläsaren som säger SQLSTATE[42S02]: Base table or view not found: 1146 Table 'XXXX-XXXXXXXXX-mysql-database.tasks' doesn't exist

Det innebär att du inte har kört databasmigreringar eller att databasmigreringar inte lyckades. Följ stegen 5. Generera databasschema.

Vanliga frågor och svar

Hur mycket kostar den här installationen?

Prissättningen för de skapade resurserna är följande:

  • App Service-planen skapas på Basic-nivån och kan skalas upp eller ned. Se Priser för App Service.
  • Den flexibla MySQL-servern skapas på B1ms-nivån och kan skalas upp eller ned. Med ett kostnadsfritt Azure-konto är B1ms-nivån kostnadsfri i 12 månader, upp till månadsgränserna. Se Prissättning för Azure Database for MySQL.
  • Azure Cache for Redis skapas på Basic-nivån med den minsta cachestorleken. Det finns en liten kostnad som är associerad med den här nivån. Du kan skala upp den till högre prestandanivåer för högre tillgänglighet, klustring och andra funktioner. Se Priser för Azure Cache for Redis.
  • Det virtuella nätverket debiteras inte om du inte konfigurerar extra funktioner, till exempel peering. Se Priser för Azure Virtual Network.
  • Den privata DNS-zonen medför en liten avgift. Se Priser för Azure DNS.

Hur gör jag för att ansluta till MySQL-databasen som skyddas bakom det virtuella nätverket med andra verktyg?

  • För grundläggande åtkomst från ett kommandoradsverktyg kan du köra mysql från appens SSH-terminal.
  • Om du vill ansluta från ett skrivbordsverktyg som MySQL Workbench måste datorn finnas i det virtuella nätverket. Det kan till exempel vara en virtuell Azure-dator som är ansluten till ett av undernäten, eller en dator i ett lokalt nätverk som har en plats-till-plats-VPN-anslutning med det virtuella Azure-nätverket.
  • Du kan också integrera Azure Cloud Shell med det virtuella nätverket.

Hur ändrar jag inställningen APP_KEY app till en Key Vault-referens?

Från portalstegen i 4 – Konfigurera Laravel-variabler kan du ändra APP_KEY till en Key Vault-referens genom att köra följande Azure CLI-kommandon i GitHub-kodområdet:

# 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)"

Du kan också göra samma sak i portalen. Mer information finns i:

  1. Rolltilldelning av omfång för Key Vault
  2. Lägga till en hemlighet i Key Vault
  3. Hämta en hemlighet från Key Vault
  4. Konfigurera appinställningar

Hur fungerar utveckling av lokala appar med GitHub Actions?

Ta den autogenererade arbetsflödesfilen från App Service som ett exempel, varje git push startar en ny bygg- och distributionskörning. Från en lokal klon av GitHub-lagringsplatsen gör du de önskade uppdateringarna och skickar dem till GitHub. Till exempel:

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

Varför är GitHub Actions-distributionen så långsam?

Den autogenererade arbetsflödesfilen från App Service definierar bygg-då-distribuera, två-jobbs körning. Eftersom varje jobb körs i en egen ren miljö ser arbetsflödesfilen till att deploy jobbet har åtkomst till filerna från build jobbet:

Merparten av den tid som processen med två jobb tar går åt till att ladda upp och ladda ner artefakter. Om du vill kan du förenkla arbetsflödesfilen genom att kombinera de två jobben till ett, vilket eliminerar behovet av uppladdnings- och nedladdningsstegen.

Jag har inte behörighet att skapa en användartilldelad identitet

Se Konfigurera GitHub Actions-distribution från Distributionscenter.

Vad kan jag göra med GitHub Copilot i mitt kodområde?

Du kanske märker att GitHub Copilot-chattvyn redan fanns där när du skapade kodområdet. För din bekvämlighet inkluderar vi GitHub Copilot-chatttillägget i containerdefinitionen (se .devcontainer/devcontainer.json). Du behöver dock ett GitHub Copilot-konto (30 dagars kostnadsfri utvärderingsversion tillgänglig).

Några tips när du pratar med GitHub Copilot:

  • I en enda chattsession bygger frågorna och svaren på varandra och du kan justera dina frågor för att finjustera det svar du får.
  • Som standard har GitHub Copilot inte åtkomst till någon fil på lagringsplatsen. Om du vill ställa frågor om en fil öppnar du filen i redigeraren först.
  • Om du vill ge GitHub Copilot åtkomst till alla filer på lagringsplatsen när du förbereder dess svar börjar du din fråga med @workspace. Mer information finns i Use the @workspace agent.
  • I chattsessionen kan GitHub Copilot föreslå ändringar och (med @workspace) även var ändringarna ska utföras, men det är inte tillåtet att göra ändringarna åt dig. Det är upp till dig att lägga till de föreslagna ändringarna och testa dem.

Nästa steg

Gå vidare till nästa självstudie för att lära dig hur du skyddar din app med en anpassad domän och ett certifikat.

Eller kolla in andra resurser: