Självstudie: Skapa en PHP-app (Laravel) och MySQL – flexibel server-app i Azure App Service
[GÄLLER FÖR:
Azure Database for MySQL – flexibel server
Azure App Service en mycket skalbar och självkorrigering av webbvärdtjänsten med hjälp av Linux-operativsystemet. I den här självstudien visas hur du skapar en PHP-app i Azure och ansluter den till en MySQL-databas. När du är klar har du en Laravel-app som körs på Azure App Service på Linux.
I den här guiden får du lära dig att:
- Konfigurera en PHP-app (Laravel) med lokal MySQL
- Skapa en flexibel MySQL-server
- Anslut en PHP-app till MySQL – flexibel server
- Distribuera appen till Azure App Service
- uppdatera datamodellen och distribuera om appen
- hantera appen i Azure-portalen.
Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt Azure-konto innan du börjar. Med ett kostnadsfritt Azure-konto kan du nu prova Azure Database for MySQL – flexibel server kostnadsfritt i 12 månader. Mer information finns i Prova flexibel server utan kostnad.
Förutsättningar
För att slutföra den här kursen behöver du:
- Installera Git
- Installera PHP 5.6.4 eller senare
- Installera Composer
- Aktivera följande PHP-tillägg som behövs för Laravel: OpenSSL, PDO-MySQL, Mbstring, Tokenizer och XML
- Installera och starta MySQL
Förbereda lokal MySQL
I det här steget skapar du en databas för självstudien på din lokala MySQL-server.
Ansluta till en lokal MySQL-server
Anslut till din lokala MySQL-server via ett terminalfönster. Du kan använda det här terminalfönstret för att köra alla kommandon i den här självstudien.
mysql -u root -p
Om du uppmanas att ange ett lösenord anger du lösenordet för root-kontot. Se MySQL: Återställa rotlösenordet om du inte kommer ihåg rotlösenordet för ditt konto.
MySQL-servern är igång om kommandot körs utan problem. Om inte, kontrollerar du att den lokala MySQL-servern är igång genom att följa anvisningarna efter installation av MySQL.
Skapa en lokal databas
Skapa en databas i mysql-prompten.
CREATE DATABASE sampledb;
Skriv quit för att avsluta serveranslutningen.
quit
Skapa en PHP-app lokalt
I det här steget hämtar du en Laravel-exempelapp, konfigurerar dess databasanslutning och kör den lokalt.
Klona exemplet
I terminalfönstret navigerar du till en tom katalog där du kan klona exempelprogrammet. Klona exempellagringsplatsen med följande kommando.
git clone https://github.com/Azure-Samples/laravel-tasks
cd till den klonade katalogen.
Installera de paket som behövs.
cd laravel-tasks
composer install
Konfigurera MySQL-anslutningen
Skapa en fil med namnet .env i lagringsplatsens rot. Kopiera in följande variabler i .env-filen. Ersätt < root_password> platshållaren med MySQL-rotanvändarens lösenord.
APP_ENV=local
APP_DEBUG=true
APP_KEY=
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=sampledb
DB_USERNAME=root
DB_PASSWORD=<root_password>
Mer information om hur Laravel använder .env-filen finns i Laravel Environment Configuration (Konfiguration av Laravel-miljö).
Köra exemplet lokalt
Kör Laravel-databasmigreringar för att skapa de tabeller som behövs för appen. Du kan se vilka tabeller som skapas i migreringarna i katalogen database/migrations (databas/migreringar) på Git-lagringsplatsen.
php artisan migrate
Generera en ny Laravel-programnyckel.
php artisan key:generate
Kör appen.
php artisan serve
Gå till http://localhost:8000 i en webbläsare. Lägg till några uppgifter på sidan.
Om du vill stoppa PHP skriver du Ctrl + C i terminalen.
Skapa en flexibel MySQL-server
I det här steget skapar du en MySQL-databas i Azure Database for MySQL Flexibel server. Senare kommer du att konfigurera PHP-appen för att ansluta till den här databasen. I Azure Cloud Shelldu en server i med az flexible-server create kommandot .
az mysql flexible-server create --resource-group myResourceGroup --public-access <IP-Address>
Viktigt
- Anteckna servernamnet och anslutningssträngen för att använda det i nästa steg för att ansluta och köra laravel-datamigrering.
- För IP-adressargument anger du IP-adressen för klientdatorn. Servern låses när den skapas och du måste tillåta åtkomst till klientdatorn för att hantera servern lokalt.
Konfigurera serverbrandväggen så att webbappen kan ansluta till servern
I Cloud Shell skapar du en brandväggsregel för MySQL-servern som tillåter klientanslutningar med kommandot az mysql server firewall-rule create. När både start-IP och slut-IP har angetts till öppnas brandväggen endast för andra Azure-tjänster som inte har en statisk 0.0.0.0 IP-adress för att ansluta till servern.
az mysql flexible-server firewall-rule create --name allanyAzureIPs --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0
Ansluta lokalt till MySQL-produktionsservern
Anslut till MySQL-server i Azure via det lokala terminalfönstret. Använd det värde som du angav tidigare för <admin-user> och <mysql-server-name> . När du uppmanas att ange ett lösenord använder du lösenordet som du angav när du skapade databasen i Azure.
mysql -u <admin-user> -h <mysql-server-name>.mysql.database.azure.com -P 3306 -p
Skapa en produktionsdatabas
Skapa en databas i mysql-prompten.
CREATE DATABASE sampledb;
Skapa en användare med behörigheter
Skapa en databasanvändare med namnet phpappuser och ge användaren alla privilegier i sampledb-databasen. För enkelhetens skull använder du MySQLAzure2020 som lösenord.
CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2020';
GRANT ALL PRIVILEGES ON sampledb.* TO 'phpappuser';
Skriv quit för att avsluta serveranslutningen.
quit
Anslut till en flexibel MySQL-server
I det här steget ansluter du PHP-programmet till MySQL-databasen som du skapade i Azure Database for MySQL.
Konfigurera databasanslutningen
Skapa en .env.production-fil i lagringsplatsens rot och kopiera in följande variabler i filen. Ersätt platshållaren < mysql-server-name> både i DB_HOST och DB_USERNAME.
APP_ENV=production
APP_DEBUG=true
APP_KEY=
DB_CONNECTION=mysql
DB_HOST=<mysql-server-name>.mysql.database.azure.com
DB_DATABASE=sampledb
DB_USERNAME=phpappuser
DB_PASSWORD=MySQLAzure2017
MYSQL_SSL=true
Spara ändringarna.
Tips
För att skydda din MySQL-anslutningsinformation är den här filen redan undantagen från Git-lagringsplatsen (se .gitignore i lagringsplatsens rot). Senare får du lära dig hur du konfigurerar miljövariabler i App Service för att ansluta till din databas i Azure Database for MySQL. När du använder miljövariabler behöver du inte .env-filen i App Service.
Konfigurera TLS/SSL-certifikat
Som standard tillämpar MySQL – flexibel server TLS-anslutningar från klienter. Om du vill ansluta till din MySQL-databas i Azure måste du använda .pem-certifikatetsom tillhandahålls av Azure Database for MySQL Flexibel server . Ladda ned det härcertifikatet ) och placera det i SSL-mappen i den lokala kopian av lagringsplatsen för exempelappen.
Öppna config/database.php och lägg till parametrarna sslmode och options i connections.mysql, som i följande kod.
'mysql' => [
...
'sslmode' => env('DB_SSLMODE', 'prefer'),
'options' => (env('MYSQL_SSL') && extension_loaded('pdo_mysql')) ? [
PDO::MYSQL_ATTR_SSL_KEY => '/ssl/DigiCertGlobalRootCA.crt.pem',
] : []
],
Testa appen lokalt
Kör Laravel-databasmigreringar med .env.production som miljöfil för att skapa tabellerna i din MySQL-databas i Azure Database for MySQL. Tänk på att anslutningsinformationen till din MySQL-databas i Azure finns i .env.production.
php artisan migrate --env=production --force
.env.production innehåller inte någon giltig programnyckel ännu. Generera en ny nyckel för den i terminalen.
php artisan key:generate --env=production --force
Kör exempelprogrammet med .env.production som miljöfil.
php artisan serve --env=production
Navigera till http://localhost:8000. Om sidan läses in utan fel ansluter PHP-appen till MySQL-databasen i Azure.
Lägg till några uppgifter på sidan.
Om du vill stoppa PHP skriver du Ctrl + C i terminalen.
Genomföra ändringarna
Kör följande Git-kommandon för att genomföra ändringarna:
git add .
git commit -m "database.php updates"
Din app är klar att distribuera.
Distribuera till Azure
I det här steget distribuerar du din MySQL-anslutna PHP-app till Azure App Service.
Konfigurera en distributionsanvändare
FTP och lokal Git kan distribuera till en Azure-webbapp med hjälp av en distributionsanvändare. När du har konfigurerat distributionsanvändaren kan du använda den för alla dina Azure-distributioner. Ditt användarnamn och lösenord för distribution på kontonivå skiljer sig från autentiseringsuppgifterna för din Azure-prenumeration.
Konfigurera distributionsanvändaren genom att köra kommandot az webapp deployment user set i Azure Cloud Shell. Ersätt < username> and password>with your deployment user username and password (Ersätt användarnamn och <> med användarnamn och lösenord för distributionsanvändaren.
Användarnamnet måste vara unikt i Azure och för lokala Git-pushar får det inte innehålla @-symbolen. Lösenordet måste innehålla minst åtta tecken, med två av följande tre element: bokstäver, siffror och symboler.
az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku F1 --is-linux
JSON-utdata visar lösenordet som null. Om du får en konflikt. Information: 409-fel, ändra användarnamnet. Om du får en felaktig begäran. Information: 400-fel, använd ett starkare lösenord. Registrera ditt användarnamn och lösenord som ska användas för att distribuera dina webbappar.
Skapa en App Service-plan
I Cloud Shell skapar du en App Service plan i resursgruppen med kommandot az appservice plan create. I följande exempel skapas en App Service plan med namnet myAppServicePlan på den kostnadsfria prisnivån (--sku F1) och i en Linux-container (--is-linux).
az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku F1 --is-linux
Skapa en webbapp
Skapa en webbapp i myAppServicePlan-App Service plan.
I Cloud Shell kan du använda kommandot az webapp create. I följande exempel ersätter < du appnamn med> globalt unikt appnamn (giltiga tecken är , och a-z 0-9 - ). Körningen har angetts till PHP|7.0. Om du vill se alla körningar som stöds kör du az webapp list-runtimes --linux.
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.3" --deployment-local-git
När webbappen har skapats visar Azure CLI utdata liknande den i följande exempel:
Local git is configured with url of 'https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git'
{
"availabilityState": "Normal",
"clientAffinityEnabled": true,
"clientCertEnabled": false,
"cloningInfo": null,
"containerSize": 0,
"dailyMemoryTimeQuota": 0,
"defaultHostName": "<app-name>.azurewebsites.net",
"deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
"enabled": true,
< JSON data removed for brevity. >
}
Du har skapat en tom ny webbapp med git-distribution aktiverad.
Anteckning
URL:en för fjärransluten Git visas i egenskapen deploymentLocalGitUrl med formatet https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git . Spara den här URL:en, eftersom du behöver den senare.
Konfigurera databasinställningarna
I App Service ställer du in miljövariabler som appinställningar med kommandot az webapp config appsettings set.
Följande kommando konfigurerar appinställningarna DB_HOST, DB_DATABASE, DB_USERNAME och DB_PASSWORD. Ersätt platshållarna < appnamn> < mysql-server-name>.
az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DB_HOST="<mysql-server-name>.mysql.database.azure.com" DB_DATABASE="sampledb" DB_USERNAME="phpappuser" DB_PASSWORD="MySQLAzure2017" MYSQL_SSL="true"
Du kan komma åt inställningarna med PHP-metoden getenv. I Laravel-koden används en env-omslutning över PHP getenv. MySQL-konfigurationen i config/database.php ser till exempel ut som följande kod:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
...
],
Konfigurera Laravel-miljövariabler
Laravel måste ha en programnyckel i App Service. Du kan konfigurera den med appinställningar.
Gå till det lokala terminalfönstret och använd php artisan för att generera en ny programnyckel utan att spara den i .env.
php artisan key:generate --show
I Cloud Shell anger du programnyckeln i App Service med hjälp av az webapp config appsettings set kommandot . Ersätt platshållarna < appnamn> < outputofphpartisankey:generate>.
az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings APP_KEY="<output_of_php_artisan_key:generate>" APP_DEBUG="true"
APP_DEBUG="true" säger åt Laravel att returnera felsökningsinformation när den distribuerade appen påträffar fel. När du kör en produktionsapp anger du värdet false, vilket är säkrare.
Ange sökväg till virtuella program
Laravel-programmets livscykel börjar i den offentliga katalogen i stället för programmets rotkatalog. PHP Docker-standardavbildningen för App Service använder Apache, och låter dig inte anpassa DocumentRoot för Laravel. Däremot kan du använda .htaccess för att skriva om alla begäranden så att de pekar till /public i stället för rotkatalogen. I lagringsplatsens rot har en .htaccess redan lagts till för detta ändamål. Därmed är Laravel-appen klar att distribueras.
Mer information finns i Ändra platsrot.
Skicka till Azure från Git
I det lokala terminalfönstret kan du lägga till en Azure-fjärrdatabas till din lokala Git-databas. Ersätt < deploymentLocalGitUrl-from-create-step> med URL:en för den Fjärranslutna Git-fil som du sparade från Skapa en webbapp.
git remote add azure <deploymentLocalGitUrl-from-create-step>
Skicka till Azure-fjärrdatabasen för att distribuera appen med följande kommando. När Git Autentiseringshanteraren frågar efter autentiseringsuppgifter måste du ange de autentiseringsuppgifter som du skapade i Konfigurera en distributionsanvändare, inte de autentiseringsuppgifter som du använder för att logga in på Azure Portal.
git push azure main
Det kan ett par minuter att köra kommandot. Medan det körs visas information liknande den i följande exempel:
Counting objects: 3, done. Delta compression using up to 8 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done. Total 3 (delta 2), reused 0 (delta 0) remote: Updating branch 'main'. remote: Updating submodules. remote: Preparing deployment for commit id 'a5e076db9c'. remote: Running custom deployment command... remote: Running deployment command... ... < Output has been truncated for readability >
Bläddra till Azure-appen
Bläddra till http://<app-name>.azurewebsites.net och lägg till några uppgifter i listan.
Grattis! Du kör en datadriven PHP-app i Azure App Service.
Uppdatera modell lokalt och distribuera om
I det här steget gör du en enkel ändring i task-datamodellen och webbappen och publicerar sedan uppdateringen till Azure.
För uppgiftsscenariot ändrar du programmet så att du kan markera en uppgift som slutförd.
Lägga till en kolumn
Visa det lokala terminalfönstret och gå till roten för Git-lagringsplatsen.
Generera en ny databasmigrering för tasks-tabellen:
php artisan make:migration add_complete_column --table=tasks
Det här kommandot visar namnet på migreringsfilen som genereras. Leta reda på filen i database/migrations och öppna den.
Ersätt metoden up med följande kod:
public function up()
{
Schema::table('tasks', function (Blueprint $table) {
$table->boolean('complete')->default(False);
});
}
Föregående kod lägger till en boolesk kolumn i tasks-tabellen med namnet complete.
Ersätt metoden down med följande kod för återställningsåtgärden:
public function down()
{
Schema::table('tasks', function (Blueprint $table) {
$table->dropColumn('complete');
});
}
Visa det lokala terminalfönstret och kör Laravel-databasemigreringar för att göra ändringen i den lokala databasen.
php artisan migrate
Modellen Task (se app/Task.php) mappar till tasks-tabellen som standard, baserat på Laravel-namngivningskonventionen.
Uppdatera programlogik
Öppna filen routes/web.php. Här definieras programmets vägar och affärslogik.
I slutet av filen lägger du till en väg med följande kod:
/**
* Toggle Task completeness
*/
Route::post('/task/{id}', function ($id) {
error_log('INFO: post /task/'.$id);
$task = Task::findOrFail($id);
$task->complete = !$task->complete;
$task->save();
return redirect('/');
});
Föregående kod gör en enkel uppdatering till datamodellen genom att ändra värdet för complete.
Uppdatera vyn
Öppna filen resources/views/tasks.blade.php. Leta reda på starttaggen <tr> och ersätt den med:
<tr class="{{ $task->complete ? 'success' : 'active' }}" >
Föregående kod ändrar färg på raden beroende på om uppgiften är slutförd.
På nästa rad finns följande kod:
<td class="table-text"><div>{{ $task->name }}</div></td>
Ersätt hela raden med följande kod:
<td>
<form action="{{ url('task/'.$task->id) }}" method="POST">
{{ csrf_field() }}
<button type="submit" class="btn btn-xs">
<i class="fa {{$task->complete ? 'fa-check-square-o' : 'fa-square-o'}}"></i>
</button>
{{ $task->name }}
</form>
</td>
Föregående kod lägger till knappen Skicka som refererar till den väg som du angav tidigare.
Testa ändringarna lokalt
Visa det lokala terminalfönstret och kör utvecklingsservern från rotkatalogen på Git-lagringsplatsen.
php artisan serve
Om du vill se ändringen i uppgiftsstatusen går du till http://localhost:8000 och markerar kryssrutan.
Om du vill stoppa PHP skriver du Ctrl + C i terminalen.
Publicera ändringar till Azure
Gå till det lokala terminalfönstret och kör Laravel-databasmigreringar med produktionsanslutningssträngen för att genomföra ändringen i Azure-databasen.
php artisan migrate --env=production --force
Genomför alla ändringar på Git och skicka sedan kodändringarna till Azure.
git add .
git commit -m "added complete checkbox"
git push azure main
När git push har slutförts så kan du gå till Azure-appen och prova de nya funktionerna.
Om du har lagt till några uppgifter finns de kvar i databasen. Uppdateringar i dataschemat påverkar inte befintliga data.
Rensa resurser
I de föregående stegen skapade du Azure-resurser i en resursgrupp. Om du inte tror att du behöver dessa resurser i framtiden tar du bort resursgruppen genom att köra följande kommando i Cloud Shell:
az group delete --name myResourceGroup