Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa esercitazione illustra come creare un'app PHP sicura nel servizio app di Azure si connette a un database MySQL (usando il server flessibile di Database di Azure per MySQL). Si distribuirà anche una Cache Redis di Azure per abilitare il codice di memorizzazione nella cache nell'applicazione. Il servizio app di Azure è un servizio di hosting Web altamente scalabile e scalabile che può distribuire facilmente app in Windows o Linux. Al termine, sarà disponibile un'app Laravel in esecuzione nel Servizio app di Azure in Linux.
Prerequisiti
- Un account Azure con una sottoscrizione attiva. Se non si ha un account Azure, è possibile crearne uno gratuitamente.
- Un account GitHub. è anche possibile ottenerne uno gratuitamente.
- Conoscenza di PHP con sviluppo Laravel.
- (Facoltativo) Per provare GitHub Copilot, un account GitHub Copilot. È disponibile una versione di valutazione gratuita di 30 giorni.
1 - Eseguire l'esempio
Prima di tutto, configurare un'app guidata dai dati di esempio come punto di partenza. Per praticità, il repository di esempio include una configurazione del contenitore di sviluppo. Il contenitore di sviluppo include tutti gli elementi necessari per sviluppare un'applicazione, tra cui il database, la cache e tutte le variabili di ambiente necessarie per l'applicazione di esempio. Il contenitore di sviluppo può essere eseguito in un codespace GitHub, il che significa che è possibile eseguire l'esempio in qualsiasi computer con un Web browser.
Passaggio 1: in una nuova finestra del browser:
- Accedi all'account GitHub.
- Accedere a https://github.com/Azure-Samples/laravel-tasks/fork.
- Selezionare Crea fork.
Passaggio 2: Nel fork di GitHub:
- Selezionare Codice>Crea codespace nel file main.
La configurazione del codespace richiede alcuni minuti. Inoltre, il file con estensione env fornito contiene già una variabile fittizia
APP_KEY
che Laravel deve eseguire in locale.
Passaggio 3: nel terminale codespace:
- Eseguire
composer install
. - Eseguire le migrazioni del database con
php artisan migrate
. - Esegui l'app con
php artisan serve
. - Quando viene visualizzata la notifica
Your application running on port 80 is available.
, selezionare Apri nel browser. L'applicazione di esempio dovrebbe essere visualizzata in una nuova scheda del browser. Per arrestare l'applicazione, digitareCtrl
+C
.
Problemi? Controllare la sezione Risoluzione dei problemi.
2 - Creare il servizio app, il database e la cache
In questo passaggio si creano le risorse di Azure. Questa esercitazione utilizza passaggi per creare un set di risorse protette per impostazione predefinita che includono il Servizio App, il Database di Azure per MySQL e Azure Cache per Redis. Per il processo di creazione, devi specificare:
- Nome dell'app Web. Viene usato come parte del nome DNS per l'app.
- Area in cui eseguire l'app fisicamente nel mondo. Viene usato anche come parte del nome DNS per l'app.
- Stack di runtime per l'app. È qui che si seleziona la versione di PHP da usare per l'app.
- Piano di hosting per l'app. Si tratta del piano tariffario che include il set di funzionalità e la capacità di ridimensionamento per l'app.
- Gruppo di risorse per l'app. Un gruppo di risorse consente di raggruppare (in un contenitore logico) tutte le risorse di Azure necessarie per l'applicazione.
Per creare risorse del Servizio app di Azure, accedere al portale di Azure e seguire questa procedura.
Passaggio 1: nel portale di Azure:
- Nella barra di ricerca superiore digitare app service.
- Selezionare l'elemento etichettato servizio app sotto l'intestazione Servizi.
- Selezionare Crea>App Web. È anche possibile passare direttamente alla creazione guidata.
Passaggio 2: nella pagina Crea app Web compilare il modulo come indicato di seguito.
- Nome: msdocs-laravel-mysql-XYZ. Verrà generato automaticamente un gruppo di risorse denominato msdocs-laravel-mysql-XYZ_group .
- Stack di Runtime: PHP 8.4.
- Sistema operativo: Linux.
- Regione: Qualsiasi regione di Azure nelle tue vicinanze.
- Piano Linux: creare un nuovo e usare il nome msdocs-laravel-mysql-XYZ.
- Piano tariffario: Basic. Quando si è pronti, è possibile passare a un piano tariffario diverso.
Passaggio 3:
- Selezionare la scheda Database .
- Selezionare Crea un database.
- In Motore selezionare MySQL - Server flessibile.
- Selezionare Crea una cache di Azure per Redis.
- In Nome (in Cache) immettere un nome per la cache.
- In SKU selezionare Basic.
Passaggio 4:
- Selezionare la scheda Distribuzione .
- Abilitare la distribuzione continua.
- In Organizzazione selezionare l'alias GitHub.
- In Repository selezionare laravel-tasks.
- Per Ramo selezionare principale.
- Assicurarsi che l'autenticazione di base sia disabilitata.
- Selezionare Rivedi e crea.
- Al termine della convalida selezionare Crea.
Passaggio 5: Il completamento della distribuzione richiede alcuni minuti. Al termine della distribuzione, selezionare il pulsante Vai alla risorsa. Si accede direttamente all'app del servizio app, ma vengono create le risorse seguenti:
- Gruppo di risorse: contenitore per tutte le risorse create.
- Piano di servizio app: definisce le risorse di calcolo per il servizio app. Viene creato un piano Linux nel livello Basic.
- App Service: rappresenta la tua app e viene eseguita nel piano App Service.
- Rete virtuale: integrata con l'App Service e isola il traffico di rete interno.
- Endpoint privati: accedere agli endpoint per il server di database e la cache Redis nella rete virtuale.
- Interfacce di rete: rappresenta gli indirizzi IP privati, uno per ognuno degli endpoint privati.
- Server flessibile di Database di Azure per MySQL: accessibile solo da dietro l'endpoint privato. Vengono automaticamente creati un database e un utente nel server.
- Cache Redis di Azure: accessibile solo da dietro l'endpoint privato.
- Zone DNS private: abilitare la risoluzione DNS del server di database e la cache Redis nella rete virtuale.
3 - Proteggere i segreti di connessione
La procedura guidata di creazione ha già generato le variabili di connettività così come le impostazioni dell'applicazione. Tuttavia, le procedure consigliate in materia di sicurezza prevedono di tenere i segreti completamente al di fuori del Servizio app. Sposterai i tuoi segreti in un Key Vault e cambierai l'impostazione dell'app in riferimenti Key Vault con l'aiuto dei Connettori di Servizi.
Passaggio 1: Recuperare la stringa di connessione esistente
- Nel menu a sinistra della pagina Servizio app selezionare Impostazioni Variabili > di ambiente.
- Selezionare Stringhe di connessione.
- Selezionare AZURE_MYSQL_CONNECTIONSTRING.
- Nel campo Valoredell'impostazione Aggiungi/Modifica applicazione copiare il nome utente e la password da usare in un secondo momento. La stringa di connessione consente di connettersi al database MySQL protetto dietro gli endpoint privati. Tuttavia, i segreti vengono salvati direttamente nell'app di App Service, che non è l'ideale. Cambierai questo.
Passaggio 2: Creare un Key Vault per l'amministrazione sicura dei segreti
- Nella barra di ricerca superiore digitare "Key Vault", quindi selezionare Marketplace>Key Vault.
- In Gruppo di risorse selezionare msdocs-laravel-mysql-XYZ_group.
- In Nome del Key Vault, digitare un nome composto solo da lettere e numeri.
- In Area impostarlo sulla stessa posizione del gruppo di risorse.
Passaggio 3: Proteggere il Key Vault con un endpoint privato
- Selezionare la scheda Rete.
- Deselezionare Abilita l'accesso pubblico.
- Selezionare Creare un endpoint privato.
- In Gruppo di risorse selezionare msdocs-laravel-mysql-XYZ_group.
- Nella finestra di dialogo, in Località, selezionare la stessa località dell'app di App Service.
- In Nome, scrivi msdocs-laravel-mysql-XYZVaultEndpoint.
- In Rete virtuale selezionare la rete virtuale nel gruppo msdocs-laravel-mysql-XYZ_group .
- In Subnet selezionare la disponibile subnet compatibile. La procedura guidata per l'app Web è stata creata per la tua comodità.
- Seleziona OK.
- Selezionare Rivedi e crea e quindi Crea. Attendere il completamento della distribuzione dell'insieme di credenziali delle chiavi. Verrà visualizzato il messaggio "La distribuzione è stata completata".
Passaggio 4: Creare il connettore MySQL
- Nella barra di ricerca superiore digitare msdocs-laravel-mysql, quindi selezionare la risorsa del servizio app denominata msdocs-laravel-mysql-XYZ.
- Nel menu a sinistra della pagina Servizio app selezionare Impostazioni > Connettore di servizi.
- Fare clic su Crea.
- In Tipo di servizio selezionare DB per il server flessibile MySQL.
- Per il server flessibile MySQL selezionare il server, ad esempio msdocs-laravel-mysql-235-server.
- Per il database MySQL selezionare il database, ad esempio msdocs-laravel-mysql-235-database.
Passaggio 5: Configurare l'autenticazione per il connettore MySQL
- Seleziona la scheda Autenticazione.
- Selezionare Stringa di connessione.
- In Password, incollare la password copiata in precedenza.
- Selezionare Memorizza il segreto in Key Vault.
- In Connessione a Key Vault selezionare Crea nuovo. Viene aperta una finestra di dialogo Crea connessione nella parte superiore della finestra di dialogo di modifica.
Passaggio 6: Stabilire la connessione a Key Vault
- Nella finestra di dialogo Crea connessione per Key Vault, in Key Vault, selezionare il Key Vault creato in precedenza.
- Selezionare Verifica e crea.
- Al termine della convalida selezionare Crea.
Passaggio 6: Finalizzare le impostazioni del connettore MySQL
- Si torna alla finestra di dialogo del connettore MySQL. Nella scheda Autenticazione attendere la creazione del connettore del Key Vault. Al termine, l'elenco a discesa Connessione a Key Vault lo seleziona automaticamente.
- Selezionare Verifica e crea.
- Fare clic su Crea. Attendere che venga visualizzata la notifica Aggiornamento riuscito.
Passaggio 7: Configurare il connettore Redis per l'uso dei segreti di Key Vault
- Nella pagina Service Connectors (Connettori di servizio) selezionare la casella di controllo accanto al connettore Cache for Redis e quindi selezionare Modifica.
- Seleziona la scheda Autenticazione.
- Selezionare Memorizza il segreto in Key Vault.
- In Connessione a Key Vault, selezionare il Key Vault che hai creato.
- Selezionare Avanti: Rete.
- Selezionare Configura regole del firewall per abilitare l'accesso al servizio di destinazione. La creazione guidata dell'app ha già protetto il database SQL con un endpoint privato.
- Seleziona Salva. Attendere che venga visualizzata la notifica Aggiornamento riuscito.
Passaggio 8: Verificare l'integrazione di Key Vault
- Nel menu a sinistra, selezionare nuovamente Impostazioni > Variabili di ambiente.
- Accanto a AZURE_MYSQL_PASSWORD selezionare Mostra valore. Il valore deve essere
@Microsoft.KeyVault(...)
, il che significa che si tratta di un riferimento al Key Vault perché il segreto è ora gestito nel Key Vault. - Per verificare la stringa di connessione Redis, selezionare Mostra valore accanto a AZURE_REDIS_CONNECTIONSTRING.
Per riepilogare, il processo per proteggere i segreti di connessione coinvolti:
- Recupero dei segreti di connessione dalle variabili di ambiente dell'app App Service.
- Creazione di un insieme di credenziali delle chiavi.
- Creazione di una connessione di Key Vault con l'identità gestita assegnata dal sistema.
- Aggiornamento dei connettori di servizio per archiviare i segreti nell'insieme di credenziali delle chiavi.
Problemi? Controllare la sezione Risoluzione dei problemi.
4 - Configurare le variabili Laravel
Passaggio 1: Crea CACHE_DRIVER
come impostazione dell'app.
- Nella scheda Impostazioni app selezionare Aggiungi.
- Nel campo Nome immettere CACHE_DRIVER.
- Nel campo Valore immettere redis.
- Selezionare Applica, quindi Applica di nuovo, quindi Conferma.
Passaggio 2: Usando gli stessi passaggi del passaggio 1, creare le impostazioni dell'app seguenti:
- MYSQL_ATTR_SSL_CA: usare /home/site/wwwroot/ssl/DigiCertGlobalRootCA.crt.pem come valore. Questa impostazione dell'app punta al percorso del certificato TLS/SSL necessario per accedere al server MySQL. È incluso nel repository di esempio per praticità.
- LOG_CHANNEL: usare stderr come valore. Questa impostazione indica a Laravel di inviare tramite pipe i log a stderr, che lo rende disponibile per i log di servizio app.
- APP_DEBUG: usare true come valore. Si tratta di una variabile di debug Laravel che abilita le pagine in modalità di debug.
- APP_KEY: usare base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= come valore. Si tratta di una variabile di crittografia Laravel.
Importante
Il APP_KEY
valore viene usato qui per praticità. Per gli scenari di produzione, deve essere generato in modo specifico per la distribuzione usando php artisan key:generate --show
nella riga di comando.
Idealmente, l'impostazione dell'app APP_KEY
deve essere configurata anche come riferimento al Key Vault, che è un processo che richiede più passaggi. Per altre informazioni, vedere Come si modifica l'impostazione dell'app APP_KEY in un riferimento a Key Vault?
5 - Distribuire il codice di esempio
In questo passaggio viene configurata la distribuzione di GitHub usando GitHub Actions. È solo uno dei molti modi per eseguire la distribuzione nel servizio app, ma anche un ottimo modo per avere l'integrazione continua nel processo di distribuzione. Per impostazione predefinita, ogni git push
nel repository GitHub avvia l'azione di compilazione e distribuzione.
Passaggio 1: Tornare allo spazio di codice GitHub del fork di esempio, eseguire git pull origin main
.
In questo modo viene eseguito il pull del file del flusso di lavoro appena eseguito nel codespace.
Passaggio 2 (opzione 1: con GitHub Copilot):
- Avviare una nuova sessione di chat selezionando la visualizzazione Chat e quindi selezionando +.
- Chiedere " @workspace Come si connette l'app al database e redis?" Copilot potrebbe fornire una spiegazione del modo in cui le impostazioni vengono configurate in config/database.php.
- Chiedere: "@workspace In modalità di produzione, l'app è in esecuzione in un'app Web del servizio app, che usa Azure Service Connector per connettersi a un server flessibile MySQL. Quali sono i nomi delle variabili di ambiente che è necessario usare?" Copilot potrebbe fornire un suggerimento di codice simile a quello dell'opzione 2: senza i passaggi di GitHub Copilot riportati di seguito e anche indicare di apportare la modifica nel file config/database.php .
- Aprire config/database.php in Explorer e aggiungere il suggerimento del codice.
- Chiedere: "@workspace La mia app del servizio app usa anche Service Connector di Azure per connettersi a una cache per Redis usando il tipo di client Django. Quali sono i nomi delle variabili di ambiente che è necessario usare?*" Copilot potrebbe fornire un suggerimento di codice simile a quello nell'opzione 2: senza i passaggi di GitHub Copilot seguenti e anche indicare di apportare la modifica nel file config/database.php . Se richiesto, accedere a GitHub Copilot per Azure per ottenere risposte più accurate.
- Aggiungere il suggerimento per il codice. GitHub Copilot non fornisce la stessa risposta ogni volta e non è sempre corretta. Potrebbe essere necessario porre altre domande per ottimizzare la risposta. Per suggerimenti, vedere Cosa posso fare con GitHub Copilot nel mio spazio di codice?.
Passaggio 2 (opzione 2: senza GitHub Copilot):
- Aprire config/database.php in Esplora risorse. Trovare la
mysql
sezione e apportare le modifiche seguenti: - Sostituire
DB_HOST
(riga 49) conAZURE_MYSQL_HOST
. - Sostituire
DB_DATABASE
(riga 51) conAZURE_MYSQL_DBNAME
. - Sostituire
DB_USERNAME
(riga 52) conAZURE_MYSQL_USERNAME
. - Sostituire
DB_PASSWORD
(riga 53) conAZURE_MYSQL_PASSWORD
. - Sostituire
DB_PORT
(riga 50) conAZURE_MYSQL_PORT
. - Scorrere fino alla sezione Redis
cache
e apportare le modifiche seguenti: - Sostituire
REDIS_HOST
(riga 142) conAZURE_REDIS_HOST
. - Sostituire
REDIS_PASSWORD
(riga 144) conAZURE_REDIS_PASSWORD
. - Sostituire
REDIS_PORT
(riga 145) conAZURE_REDIS_PORT
. - Sostituire
REDIS_CACHE_DB
(riga 146) conAZURE_REDIS_DATABASE
. - Nella stessa sezione aggiungere una riga con
'scheme' => 'tls',
. Questa configurazione indica a Laravel di usare la crittografia per connettersi a Redis.
Passaggio 3:
- Selezionare l'estensione Controllo del codice sorgente.
- Nella casella di testo digitare un messaggio di commit come
Configure Azure database and cache connections
. In alternativa, selezionaree lasciare che GitHub Copilot generi automaticamente un messaggio di commit.
- Selezionare Commit e quindi confermare con Sì.
- Selezionare Sincronizza modifiche 1, quindi confermare con OK.
Passaggio 4: Tornare alla pagina Centro distribuzione nel portale di Azure:
- Selezionare la scheda Log, quindi selezionare Aggiorna per visualizzare la nuova esecuzione della distribuzione.
- Nell'elemento di log per l'esecuzione della distribuzione selezionare la voce Compila/Distribuisci Log con il timestamp più recente.
Passaggio 5: Si viene visualizzati nel repository GitHub e si noterà che l'azione GitHub è in esecuzione. Il file del flusso di lavoro definisce due fasi separate, compilare e distribuire. Attendere che l'esecuzione di GitHub mostri lo stato Operazione riuscita. Sono necessari circa 10 minuti.
Problemi? Controllare la sezione Risoluzione dei problemi.
6 - Generare schema del database
La creazione guidata inserisce il server di database MySQL dietro un endpoint privato, quindi è accessibile solo dalla rete virtuale. Poiché l'app servizio app è già integrata con la rete virtuale, il modo più semplice per eseguire le migrazioni di database con il database è direttamente dall'interno del contenitore servizio app.
Passaggio 1: tornare alla pagina Servizio app nel menu a sinistra,
- Selezionare Strumenti di sviluppo>SSH.
- Fai clic su Vai.
Passaggio 2: nel terminale SSH:
- Eseguire
cd /home/site/wwwroot
. Ecco tutti i file distribuiti. - Eseguire
php artisan migrate --force
. Se ha esito positivo, servizio app si connette correttamente al database MySQL.
Suggerimento
Nella sessione SSH solo le modifiche apportate ai file in /home
possono essere mantenute oltre i riavvii dell'app. Le modifiche al di fuori di /home
non sono persistenti.
7 - Modificare la radice del sito
Il ciclo di vita dell'applicazione Laravel inizia invece nella directory /public . Il contenitore PHP predefinito per servizio app usa Nginx, che inizia nella directory radice dell'applicazione. Per modificare la radice del sito, è necessario modificare il file di configurazione Nginx nel contenitore PHP (/etc/nginx/sites-available/default). Per praticità, il repository di esempio contiene un file di configurazione personalizzato denominato default. Come indicato in precedenza, non si vuole sostituire questo file usando la shell SSH, perché la modifica è esterna a /home
e verrà persa dopo un riavvio dell'app.
Passaggio 1:
- Nel menu a sinistra selezionare Configurazione.
- Seleziona la scheda Impostazioni generali.
Passaggio 2: nella scheda Impostazioni generali:
- Nella casella Comando di avvio immettere il comando seguente: cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload.
- Selezionare Salva e quindi Continua. Il comando sostituisce il file di configurazione Nginx nel contenitore PHP e riavvia Nginx. Questa configurazione garantisce che la stessa modifica venga apportata al contenitore ogni volta che viene avviata.
8 - Passare all'app
Passaggio 1: nella pagina Servizio app:
- Nel menu a sinistra selezionare Panoramica.
- Selezionare il dominio predefinito dell'app.
Passaggio 2: Aggiungere alcune attività all'elenco. Congratulazioni, si sta eseguendo un'app PHP sicura basata sui dati nel servizio app Azure.
Suggerimento
L'applicazione di esempio implementa il modello cache-aside. Quando si ricarica la pagina dopo aver apportato modifiche ai dati, il tempo di risposta nella pagina Web mostra un tempo molto più rapido perché carica i dati dalla cache anziché dal database.
9 - Trasmettere i log di diagnostica
Il Servizio app di Azure acquisisce tutti i messaggi archiviati nella console per facilitare la diagnosi dei problemi con l'applicazione. L'app di esempio restituisce messaggi di log della console in ognuno dei relativi endpoint per illustrare questa funzionalità. Per impostazione predefinita, la funzionalità di registrazione di Laravel ,ad esempio , Log::info()
restituisce un file locale. L'impostazione LOG_CHANNEL
dell'app precedente rende le voci di log accessibili dal flusso di log servizio app.
Passaggio 1: nella pagina Servizio app:
- Nel menu a sinistra selezionare Log di servizio app.
- In Application Logging, selezionare File System.
Passaggio 2: dal menu a sinistra selezionare Flusso di log. Vengono visualizzati i log per l'app, inclusi i log e i log della piattaforma dall'interno del contenitore.
Pulire le risorse
Al termine, è possibile eliminare tutte le risorse dalla sottoscrizione di Azure eliminando il gruppo di risorse.
Passaggio 1: nella barra di ricerca nella parte superiore del portale di Azure:
- Immettere il nome del gruppo di risorse.
- Selezionare il gruppo di risorse.
Passaggio 2: nella pagina del gruppo di risorse selezionare Elimina gruppo di risorse.
Passaggio 3:
- Immettere il nome del gruppo di risorse per confermare l'eliminazione.
- Selezionare Elimina.
2. Creare risorse di Azure e distribuire un'app di esempio
In questo passaggio si creano le risorse di Azure e si distribuisce un'app di esempio nel servizio app in Linux. I passaggi usati in questa esercitazione creano un set di risorse sicure per impostazione predefinita che includono servizio app e Database di Azure per MySQL.
Lo spazio di codice GitHub ha già l'interfaccia della riga di comando per sviluppatori di Azure (AZD).
Generare una chiave di crittografia Laravel con
php artisan key:generate --show
:php artisan key:generate --show
Accedere ad Azure eseguendo il comando
azd auth login
e seguendo il prompt:azd auth login
Creare le risorse di Azure necessarie e distribuire il codice dell'app con il comando
azd up
. Seguire la richiesta di selezionare la sottoscrizione e il percorso desiderati per le risorse di Azure.azd up
Quando richiesto, fornire le risposte seguenti:
Domanda Risposta Immettere un nuovo nome di ambiente Digitare un nome univoco. Il modello AZD usa questo nome come parte del nome DNS dell'app Web in Azure ( <app-name>-<hash>.azurewebsites.net
). Sono consentiti caratteri alfanumerici e trattini.Selezionare una sottoscrizione di Azure da usare Selezionare la sottoscrizione. Selezionare una località di Azure da usare Selezionare una località. Immettere un valore per il parametro protetto dell'infrastruttura 'appKey' Usa l'output di php artisan key:generate --show
qui. Il modello AZD crea un segreto di Key Vault che puoi utilizzare nella tua app.Immettere un valore per il parametro protetto dell'infrastruttura 'databasePassword' Password del database per MySQL. Deve contenere almeno 8 caratteri e deve contenere lettere maiuscole, lettere minuscole, numeri e caratteri speciali. Il completamento del comando
azd up
richiede circa 15 minuti (la cache Redis richiede il tempo maggiore). Compila e distribuisce anche il codice dell'applicazione, ma si modifica il codice in un secondo momento per usarlo con servizio app. Durante l'esecuzione, il comando fornisce messaggi sul processo di provisioning e distribuzione, incluso un collegamento alla distribuzione in Azure. Al termine, il comando visualizza anche un collegamento all'applicazione di distribuzione.Questo modello AZD contiene file (azure.yaml e la directory infra ) che generano un'architettura sicura per impostazione predefinita con le risorse di Azure seguenti:
- Gruppo di risorse: contenitore per tutte le risorse create.
- Piano di servizio app: definisce le risorse di calcolo per il servizio app. Viene creato un piano Linux nel livello B1.
- App Service: rappresenta la tua app e viene eseguita nel piano App Service.
- Rete virtuale: integrata con l'App Service e isola il traffico di rete interno.
- Server flessibile di Database di Azure per MySQL: accessibile solo dalla rete virtuale tramite l'integrazione della zona DNS. Nel server viene creato un database.
- Cache di Azure per Redis: accessibile solo dall'interno della rete virtuale.
- Endpoint privati: accedere agli endpoint per l’insieme di credenziali delle chiavi e la cache Redis nella rete virtuale.
- Zone DNS private: abilita la risoluzione DNS del key vault, del server di database e della cache Redis nella rete virtuale.
- Area di lavoro Log Analytics: funge da contenitore di destinazione per l'app che spedisce i log e permette anche di eseguire query sui log.
- Key Vault: usato per mantenere invariata la password del database quando si ridistribuisce con AZD.
Problemi? Controllare la sezione Risoluzione dei problemi.
3. Usare le stringhe di connessione di Azure nel codice dell'applicazione
Il modello AZD che usi ha già generato le variabili di connettività come impostazioni dell'app e le visualizza al terminale per tua comodità. Le impostazioni dell'app sono un modo per mantenere i segreti di connessione all'esterno del repository di codice.
Nell'output AZD trovare le impostazioni dell'app che iniziano con
AZURE_MYSQL_
eAZURE_REDIS_
. Vengono visualizzati solo i nomi delle impostazioni. Nel risultato AZD appaiono così: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
Le impostazioni che iniziano con
AZURE_MYSQL_
sono variabili di connessione per il database MySQL e le impostazioni che iniziano conAZURE_REDIS_
sono per la cache Redis. È necessario usarli nel codice in un secondo momento. Per praticità, il modello AZD mostra il collegamento diretto alla pagina delle impostazioni dell'app nel portale di Azure.In Esplora risorse aprire config/database.php. Si tratta del file di configurazione per le connessioni di database e cache Redis.
Trovare la parte che definisce la
mysql
connessione (righe 46-64) e sostituireDB_HOST
,DB_PORT
,DB_DATABASE
,DB_USERNAME
, eDB_PASSWORD
con le impostazioni dell'appAZURE_MYSQL_
dall'output AZD. Lamysql
connessione dovrebbe essere simile al codice seguente.'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'), ]) : [], ],
Per altre informazioni sulla configurazione del database in Laravel, vedere la documentazione di Laravel.
Trovare la parte che definisce la connessione alla cache Redis (righe 140-147) e sostituire
REDIS_HOST
,REDIS_PASSWORD
,REDIS_PORT
eREDIS_CACHE_DB
con le impostazioni dell'appAzure_REDIS_
dall'output AZD. Aggiungi anche'scheme' => 'tls',
alla connessione. La connessione alla cache dovrebbe essere simile al codice seguente:'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'), ],
Per altre informazioni sulla configurazione della cache Redis in Laravel, vedere la documentazione di Laravel.
Annotazioni
Tenere presente che le modifiche non vengono ancora distribuite. Questi verranno distribuiti alla fine del passaggio successivo.
4. Configurare le impostazioni di Laravel nell'app Web
Dall'esplora risorse, apri infra/resources.bicep. Questo è il file Bicep che definisce le risorse di Azure che sono state create.
Trovare la parte che definisce le impostazioni dell'app (righe 510-514) e decommentarla. Queste impostazioni dell'app sono:
Impostazione Descrizione CACHE_DRIVER
Indica a Laravel di usare Redis come cache (vedere la documentazione di Laravel). MYSQL_ATTR_SSL_CA
Necessario per aprire una connessione TLS a MySQL in Azure. Il file del certificato è incluso nel repository di esempio per praticità. Questa variabile viene usata dalla connessione mysql in config/database.php LOG_CHANNEL
Indica a Laravel di inviare tramite pipe i log a stderr
, che lo rende disponibile per i log del servizio app (vedere la documentazione di Laravel).APP_DEBUG
Abilitare le pagine in modalità di debug in Laravel (vedere la documentazione di Laravel). APP_KEY
Variabile di crittografia Laravel. Il modello AZD ha già creato un segreto di Key Vault (righe 212-217), in modo da accedervi con un riferimento a Key Vault. In infra/resources.bicep, trova la definizione della risorsa per l'App Service app e rimuovi il commento dalla riga 315.
appCommandLine: 'cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload'
Il ciclo di vita dell'applicazione Laravel inizia nella directory /public anziché nella radice dell'applicazione. Il contenitore PHP predefinito per il servizio app usa Nginx, che inizia nella radice dell'applicazione. Per modificare la radice del sito, è necessario modificare il file di configurazione Nginx nel contenitore PHP (/etc/nginx/sites-available/default). Per praticità, il repository di esempio contiene un file di configurazione sostitutivo denominato default, che indica a Nginx di cercare nella directory /public . Questo comando personalizzato in
appCommandLine
viene eseguito ogni volta che l'app inizia ad applicare la sostituzione del file ogni volta che il contenitore Linux viene ricaricato da uno stato pulito.Tornare al terminale codespace, eseguire
azd up
di nuovo.azd up
Suggerimento
azd up
esegue azd package
, azd provision
e azd deploy
insieme e ha senso perché si apportano modifiche sia all'infrastruttura che all'applicazione. Per apportare solo modifiche all'infrastruttura, eseguire azd provision
. Per distribuire solo le modifiche al codice dell'applicazione, eseguire azd deploy
.
Problemi? Controllare la sezione Risoluzione dei problemi.
5. Generare lo schema del database
Con il database MySQL protetto dalla rete virtuale, il modo più semplice per eseguire le migrazioni del database Laravel si trova in una sessione SSH con il contenitore Linux nel servizio app.
Nell'output AZD, trovare l'URL per la sessione SSH e accedere a esso dal browser. L'output è simile al seguente:
Open SSH session to App Service container at: <URL>
Nella sessione SSH eseguire migrazioni di database dalla directory /home/site/wwwroot :
cd /home/site/wwwroot php artisan migrate --force
Se ha esito positivo, il Servizio app si connette correttamente al database.
Annotazioni
Solo le modifiche apportate ai file in /home
possono essere mantenute dopo i riavvii dell'app.
Problemi? Controllare la sezione Risoluzione dei problemi.
6. Passare all'app
Nell'output AZD, individua l'URL della tua app e accedi a esso tramite il browser. L'URL è simile al seguente nell'output AZD:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <URL>
Aggiungere alcune attività all'elenco.
Congratulazioni, stai eseguendo un'applicazione web su Azure App Service, con connettività sicura al database Azure per MySQL.
Problemi? Controllare la sezione Risoluzione dei problemi.
7. Eseguire lo streaming dei log di diagnostica
Il Servizio app di Azure acquisisce tutti i messaggi archiviati nella console per facilitare la diagnosi dei problemi con l'applicazione. Per praticità, il modello AZD ha già abilitato la registrazione nel file system locale e i log vengono distribuiti a un'area di lavoro Log Analytics.
L'app di esempio restituisce messaggi di log della console in ognuno dei relativi endpoint per illustrare questa funzionalità. Per impostazione predefinita, la funzionalità di registrazione di Laravel ,ad esempio , Log::info()
restituisce un file locale. L'impostazione LOG_CHANNEL
dell'app precedente rende le voci di log accessibili dal flusso di log servizio app.
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]);
});
Nell'output AZD individuare il collegamento per trasmettere in streaming i log del servizio app e passarvi nel browser. Il collegamento è simile al seguente nell'output AZD:
Stream App Service logs at: <URL>
Problemi? Controllare la sezione Risoluzione dei problemi.
8. Pulire le risorse
Per eliminare tutte le risorse di Azure nell'ambiente di distribuzione corrente, eseguire azd down
e seguire le istruzioni.
azd down
Risoluzione dei problemi
Ottengo l'errore durante le migrazioni del database php_network_getaddresses: getaddrinfo for mysqldb failed: No address associated with hostname...
Indica che le variabili di connessione MySQL non sono configurate correttamente. Verificare che le impostazioni dell'app AZURE_MYSQL_
siano configurate correttamente in 3. Usare le stringhe di connessione di Azure nel codice dell'applicazione.
Ho una pagina vuota nel browser.
Indica che il servizio app non riesce a trovare i file di avvio PHP in /public. Seguire i passaggi descritti in 4. Configurare le impostazioni di Laravel nell'app Web.
Viene visualizzata una pagina di debug nel browser che dice Unsupported cipher or incorrect key length.
Indica che l'impostazione APP_KEY
è impostata su una chiave non valida. Quando esegui azd up
, assicurati di impostare appKey
come l'output di php artisan key:generate --show
.
Viene visualizzata una pagina di debug nel browser che dice Uncaught Error: Class "Illuminate\..." not found.
Questo errore ed errori simili indicano che non è stato eseguito composer install
prima di azd up
, o che i pacchetti nella directory /vendor sono obsoleti. Eseguire composer install
e azd deploy
di nuovo.
Viene visualizzata una pagina di debug nel browser che dice php_network_getaddresses: getaddrinfo for redishost failed: Name or service not known.
Indica che le variabili di connessione Redis non sono configurate correttamente. Verificare che le impostazioni dell'app AZURE_REDIS_
siano configurate correttamente in 3. Usare le stringhe di connessione di Azure nel codice dell'applicazione.
Viene visualizzata una pagina di debug nel browser che dice SQLSTATE[42S02]: Base table or view not found: 1146 Table 'XXXX-XXXXXXXXX-mysql-database.tasks' doesn't exist
Ciò significa che non sono state eseguite migrazioni di database o che le migrazioni del database non sono state eseguite correttamente. Seguire i passaggi a 5. Generare lo schema del database.
Domande frequenti
- Quanto costa questa configurazione?
- Ricerca per categorie connettersi al database MySQL protetto dietro la rete virtuale con altri strumenti?
- Come si modifica l'impostazione dell'app APP_KEY in un riferimento a Key Vault?
- Come funziona lo sviluppo di app locali con GitHub Actions?
- Perché la distribuzione di GitHub Actions è così lenta?
- Non si dispone delle autorizzazioni per creare un'identità assegnata dall'utente
- Cosa è possibile fare con GitHub Copilot nello spazio di codice?
- Quanto costa questa configurazione?
- Ricerca per categorie connettersi al database MySQL protetto dietro la rete virtuale con altri strumenti?
- Come funziona lo sviluppo di app locali con GitHub Actions?
- Perché la distribuzione di GitHub Actions è così lenta?
- Non si dispone delle autorizzazioni per creare un'identità assegnata dall'utente
- Cosa è possibile fare con GitHub Copilot nello spazio di codice?
Quanto costa questa configurazione?
I prezzi per le risorse create sono i seguenti:
- Il piano di servizio app viene creato nel livello Basic e può essere ridimensionato verso l'alto o verso il basso. Vedere Prezzi del servizio app.
- Il server flessibile MySQL viene creato nel livello B1ms ed è possibile aumentarne o ridurne le prestazioni. Con un account gratuito di Azure, il livello B1ms è gratuito per 12 mesi, fino ai limiti mensili. Vedere Prezzi di Database di Azure per MySQL.
- Cache Redis di Azure viene creata nel livello Basic con le dimensioni minime della cache. È previsto un costo ridotto associato a questo livello. È possibile aumentare le prestazioni fino a livelli di prestazioni superiori per disponibilità, clustering e altre funzionalità più elevate. Vedere Prezzi di cache di Azure per Redis.
- La rete virtuale non comporta alcun addebito a meno che non si configurino funzionalità aggiuntive, ad esempio il peering. Vedere Prezzi della rete virtuale di Azure.
- La zona DNS privata comporta un piccolo addebito. Vedere Prezzi di DNS di Azure.
Ricerca per categorie connettersi al database MySQL protetto dietro la rete virtuale con altri strumenti?
- Per l'accesso di base da uno strumento da riga di comando, è possibile eseguire
mysql
dal terminale SSH dell'app. - Per connettersi da uno strumento desktop come MySQL Workbench, il computer deve trovarsi all'interno della rete virtuale. Ad esempio, potrebbe trattarsi di una macchina virtuale di Azure connessa a una delle subnet o di un computer in una rete locale con una connessione VPN da sito a sito con la rete virtuale di Azure.
- È anche possibile integrare Azure Cloud Shell con la rete virtuale.
Come si passa dall'impostazione APP_KEY dell'app a un riferimento a Key Vault?
Dai passaggi del portale in 4 - Configurare le variabili Laravel, è possibile passare APP_KEY
a un riferimento a Key Vault eseguendo i comandi seguenti dell'interfaccia della riga di comando di Azure nello spazio di codice 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)"
È anche possibile eseguire la stessa operazione nel portale. Per altre informazioni, vedere:
Come funziona lo sviluppo di app locali con GitHub Actions?
Prendere il file del flusso di lavoro generato automaticamente dal servizio app come esempio, ognigit push
avvia una nuova esecuzione di compilazione e distribuzione. Da un clone locale del repository GitHub si effettua il push degli aggiornamenti desiderati in GitHub. Ad esempio:
git add .
git commit -m "<some-message>"
git push origin main
Perché la distribuzione di GitHub Actions è così lenta?
Il file del flusso di lavoro generato automaticamente dal servizio app definisce l'esecuzione di due processi, build-then-deploy. Poiché ogni processo viene eseguito nel proprio ambiente pulito, il file del flusso di lavoro garantisce che il processo deploy
abbia accesso ai file dal processo build
:
- Al termine del processo
build
, caricare i file come artefatti. - All'inizio del processo
deploy
, scaricare gli artefatti.
La maggior parte del tempo impiegato dal processo a due processi viene impiegato per caricare ed effettuare il download degli artefatti. Se si desidera, è possibile semplificare il file del flusso di lavoro combinando i due processi in uno, eliminando così la necessità di eseguire i passaggi di caricamento e download.
Non ho i permessi necessari per creare un'identità assegnata dall'utente
Vedere Configurare la distribuzione di GitHub Actions dal Centro distribuzione.
Cosa è possibile fare con GitHub Copilot nel codespace?
Potresti aver notato che la finestra di chat di GitHub Copilot era già presente quando hai creato il codespace. Per praticità, includiamo l'estensione di chat di GitHub Copilot nella definizione del contenitore (vedere .devcontainer/devcontainer.json). Tuttavia, è necessario un account GitHub Copilot (disponibile una versione di valutazione gratuita di 30 giorni).
Alcuni suggerimenti per l'utente quando si parla con GitHub Copilot:
- In una singola sessione di chat, le domande e le risposte si basano l'una sull'altra e puoi regolare le tue domande per ottimizzare la risposta che ottieni.
- Per impostazione predefinita, GitHub Copilot non ha accesso ad alcun file nel repository. Per porre domande su un file, aprire prima il file nell'editor.
- Per consentire a GitHub Copilot di accedere a tutti i file nel repository quando si preparano le risposte, iniziare la domanda con
@workspace
. Per altre informazioni, vedere Use the @workspace agent. - Nella sessione di chat, GitHub Copilot può suggerire modifiche e indicare tramite
@workspace
anche dove apportarle, ma non è consentito apportare le modifiche per te. È necessario aggiungere le modifiche suggerite e testarle.
Passaggi successivi
Passare all'esercitazione successiva per informazioni su come proteggere l'app con un dominio e un certificato personalizzati.
Proteggere con dominio personalizzato e certificato di protezione
In alternativa, consultare altre risorse: