Kurz: Sestavení aplikace flexibilního serveru PHP (Laravel) a MySQL v Azure App Service

PLATÍ PRO: Azure Database for MySQL – flexibilní server

PHP Web App in Azure with Flexible Server

Azure App Service poskytuje vysoce škálovatelnou službu hostování webů s automatickými opravami pomocí operačního systému Linux. V tomto kurzu se dozvíte, jak vytvořit aplikaci PHP v Azure a připojit ji k databázi MySQL. Až budete hotovi, budete mít aplikaci Laravel spuštěnou na Azure App Service v Linuxu.

V tomto kurzu se naučíte:

  • Nastavení aplikace PHP (Laravel) s místním MySQL
  • Vytvoření flexibilního serveru MySQL
  • Připojení flexibilního serveru MySQL aplikaci PHP
  • Nasazení aplikace do Azure App Service
  • Aktualizovat datový model a znovu nasadit aplikaci
  • Spravovat aplikaci na webu Azure Portal

Pokud předplatné Azure nemáte, vytvořte si před zahájením bezplatný účet Azure . S bezplatným účtem Azure teď můžete vyzkoušet Azure Database for MySQL – flexibilní server zdarma po dobu 12 měsíců. Další podrobnosti najdete v tématu Vyzkoušet flexibilní server zdarma.

Požadavky

Pro absolvování tohoto kurzu potřebujete:

  1. Nainstalovat Git.
  2. Nainstalovat PHP 5.6.4 nebo novější
  3. Nainstalovat Composer
  4. Povolit následující rozšíření PHP vyžadovaná aplikací Laravel: OpenSSL, PDO-MySQL, Mbstring, Tokenizer a XML
  5. Nainstalovat a spustit MySQL.

Příprava místního MySQL

V tomto kroku vytvoříte na místním serveru MySQL databázi, kterou budete v tomto kurzu používat.

Připojení k místnímu serveru MySQL

V okně terminálu se připojte k místnímu serveru MySQL. Toto okno terminálu můžete používat ke spuštění všech příkazů v tomto kurzu.

mysql -u root -p

Pokud se zobrazí výzva k zadání hesla, zadejte heslo k účtu root. Pokud si heslo ke kořenovému účtu nepamatujete, projděte si článek MySQL: Resetování kořenového hesla.

Pokud se váš příkaz úspěšně provede, znamená to, že je váš server MySQL spuštěný. Pokud ne, provedením kroků po instalaci MySQL zkontrolujte, jestli je místní server MySQL spuštěný.

Vytvoření databáze v místním prostředí

Na příkazovém řádku mysql vytvořte databázi.

CREATE DATABASE sampledb;

Ukončete připojení k serveru zadáním příkazu quit.

quit

Vytvoření aplikace PHP v místním prostředí

V tomto kroku získáte ukázkovou aplikaci Laravel, nakonfigurujete její připojení k databázi a spustíte ji v místním prostředí.

Vytvoření klonu ukázky

V okně terminálu přejděte do prázdného adresáře, ve kterém můžete naklonovat ukázkovou aplikaci. Ukázkové úložiště naklonujete spuštěním následujícího příkazu.

git clone https://github.com/Azure-Samples/laravel-tasks

Pomocí příkazu cd přejděte do naklonovaného adresáře. Nainstalujte požadované balíčky.

cd laravel-tasks
composer install

Konfigurace připojení k MySQL

V kořenovém adresáři úložiště vytvořte soubor .env. Zkopírujte do souboru .env následující proměnné. <Zástupný symbol root_password> nahraďte heslem kořenového uživatele MySQL.

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>

Informace o tom, jak Laravel používá soubor .env, najdete v článku Laravel Environment Configuration (Konfigurace prostředí Laravel).

Spuštění ukázky v místním prostředí

Spusťte migrace databází Laravel, aby se vytvořily tabulky, které aplikace potřebuje. Pokud chcete zjistit, které tabulky migrace vytvářejí, podívejte se do adresáře database/migrations v úložišti Git.

php artisan migrate

Vygenerujte nový klíč aplikace Laravel.

php artisan key:generate

Spusťte aplikaci.

php artisan serve

V prohlížeči přejděte na http://localhost:8000. Na stránce přidejte několik úkolů.

PHP connects successfully to MySQL

Pokud chcete zastavit PHP, zadejte v terminálu Ctrl + C.

Vytvoření flexibilního serveru MySQL

V tomto kroku vytvoříte databázi MySQL na flexibilním serveru Azure Database for MySQL. Později nakonfigurujete aplikaci PHP pro připojení k této databázi. V Azure Cloud Shell vytvořte pomocí příkazu serveraz flexible-server create.

az mysql flexible-server create  --resource-group myResourceGroup --public-access <IP-Address>

Důležité

  • Poznamenejte si název serveru a připojovací řetězec , který ho použijete v dalším kroku pro připojení a spuštění migrace dat laravel.
  • Jako argument IP-Adresa zadejte IP adresu vašeho klientského počítače. Server je uzamčen při vytváření a potřebujete povolit přístup k klientskému počítači pro místní správu serveru.

Konfigurace brány firewall serveru tak, aby se webová aplikace mohla připojit k serveru

V Cloud Shell vytvořte pravidlo brány firewall pro váš server MySQL, které povolí připojení klientů pomocí příkazu az mysql server firewall-rule create. Pokud je nastavená 0.0.0.0počáteční i koncová IP adresa, brána firewall se otevře jenom pro jiné služby Azure, které nemají statickou IP adresu pro připojení k serveru.

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

Místní připojení k produkčnímu serveru MySQL

V místním okně terminálu se připojte k serveru MySQL v Azure. Použijte hodnotu, kterou jste zadali dříve pro <admin-user> a <mysql-server-name> . Po zobrazení výzvy k zadání hesla použijte heslo, které jste zadali při vytváření databáze v Azure.

mysql -u <admin-user> -h <mysql-server-name>.mysql.database.azure.com -P 3306 -p

Vytvoření produkční databáze

Na příkazovém řádku mysql vytvořte databázi.

CREATE DATABASE sampledb;

Vytvoření uživatele s oprávněními

Vytvořte uživatele databáze se jménem phpappuser a přidělte mu všechna oprávnění k databázi sampledb. Pro zjednodušení kurzu použijte jako heslo MySQLAzure2020 .

CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2020';
GRANT ALL PRIVILEGES ON sampledb.* TO 'phpappuser';

Ukončete připojení k serveru zadáním příkazu quit.

quit

Připojení aplikace na flexibilní server MySQL

V tomto kroku připojíte aplikaci PHP k databázi MySQL, kterou jste vytvořili v Azure Database for MySQL.

Konfigurace připojení k databázi

V kořenovém adresáři úložiště vytvořte soubor .env.production a zkopírujte do něj následující proměnné. Nahraďte zástupný název <mysql-server-name> v DB_HOST i 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

Uložte změny.

Tip

Za účelem zabezpečení informací o vašem připojení k MySQL je tento soubor již vyloučený z úložiště Git (viz soubor .gitignore v kořenovém adresáři úložiště). Později se dozvíte, jak ve službě App Service nakonfigurovat proměnné prostředí pro připojení k vaší databázi v Azure Database for MySQL. S použitím proměnných prostředí nepotřebujete soubor .env ve službě App Service.

Konfigurace certifikátu TLS/SSL

Flexibilní server MySQL ve výchozím nastavení vynucuje připojení TLS z klientů. Pokud se chcete připojit k databázi MySQL v Azure, musíte použít certifikát .pem poskytovaný flexibilním serverem Azure Database for MySQL. Stáhněte si tento certifikát) a umístěte ho do složky SSL v místní kopii úložiště ukázkové aplikace.

Otevřete soubor config/database.php a do connections.mysql přidejte parametry sslmode a options, jak je znázorněno v následujícím kódu.

'mysql' => [
    ...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL') && extension_loaded('pdo_mysql')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/DigiCertGlobalRootCA.crt.pem',
    ] : []
],

Test aplikace v místním prostředí

Spusťte migrace databází Laravel s .env.production jako souborem prostředí, aby se ve vaší databázi MySQL v Azure Database for MySQL vytvořily tabulky. Nezapomeňte, že soubor .env.production obsahuje informace o připojení k vaší databázi MySQL v Azure.

php artisan migrate --env=production --force

Soubor .env.production ještě nemá platný klíč aplikace. Vygenerujte pro něj nový klíč v terminálu.

php artisan key:generate --env=production --force

Spusťte ukázkovou aplikaci s .env.production jako souborem prostředí.

php artisan serve --env=production

Přejděte na adresu http://localhost:8000. Pokud se stránka načte bez chyb, aplikace PHP se v Azure připojuje k databázi MySQL v Azure.

Na stránce přidejte několik úkolů.

PHP connects successfully to Azure Database for MySQL

Pokud chcete zastavit PHP, zadejte v terminálu Ctrl + C.

Potvrzení změn

Potvrďte provedené změny spuštěním následujících příkazů Gitu:

git add .
git commit -m "database.php updates"

Vaše aplikace je připravená k nasazení.

Nasazení do Azure

V tomto kroku nasadíte aplikaci PHP připojenou k MySQL do služby Azure App Service.

Konfigurace uživatele nasazení

Ftp a místní Git se můžou nasadit do webové aplikace Azure pomocí uživatele nasazení. Jakmile nakonfigurujete uživatele nasazení, můžete ho použít pro všechna nasazení Azure. Uživatelské jméno a heslo nasazení na úrovni účtu se liší od přihlašovacích údajů předplatného Azure.

Pokud chcete nakonfigurovat uživatele nasazení, spusťte příkaz az webapp deployment user set v Azure Cloud Shell. Uživatelské jméno> a heslo pro nasazení nahraďte< uživatelským uživatelským jménem a heslem.><

Uživatelské jméno musí být jedinečné v rámci Azure a pro místní nabízení Gitu nesmí obsahovat symbol @. Heslo musí mít minimálně osm znaků a dva z následujících tří prvků: písmena, číslice a symboly.

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku F1 --is-linux

Výstup JSON zobrazuje heslo jako null. Pokud se zobrazí konflikt. Podrobnosti: Chyba 409, změna uživatelského jména Pokud se zobrazí chybný požadavek. Podrobnosti: Chyba 400, použití silnějšího hesla Nahrajte své uživatelské jméno a heslo, které chcete použít k nasazení webových aplikací.

Vytvoření plánu služby App Service

V Cloud Shell vytvořte ve skupině prostředků plán App Service pomocí příkazu az appservice plan create. Následující příklad vytvoří plán App Service s názvem myAppServicePlan v cenové úrovni Free (--sku F1) a v kontejneru Linuxu (--is-linux).

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku F1 --is-linux

Vytvoření webové aplikace

Vytvořte webovou aplikaci v plánu myAppServicePlan App Service.

V Cloud Shell můžete použít příkaz az webapp create. V následujícím příkladu nahraďte <název> aplikace globálně jedinečným názvem aplikace (platné znaky jsou a-z, 0-9a -). Modul runtime je nastavený na PHP|7.0. Pokud chcete zobrazit všechny podporované moduly runtime, spusťte příkaz az webapp list-runtimes --os linux.

az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.3" --deployment-local-git

Po vytvoření webové aplikace Azure CLI zobrazí výstup podobný následujícímu příkladu:

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. >
}

Vytvořili jste prázdnou novou webovou aplikaci s povoleným nasazením Gitu.

Poznámka

Adresa URL vzdáleného gitu se zobrazuje ve vlastnosti deploymentLocalGitUrl s formátem https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git. Tuto adresu URL si uložte, protože ji budete potřebovat později.

Konfigurace nastavení databáze

Ve službě App Service můžete nastavit proměnné prostředí jako nastavení aplikace pomocí příkazu az webapp config appsettings set.

Následující příkaz nakonfiguruje nastavení aplikace DB_HOST, DB_DATABASE, DB_USERNAME a DB_PASSWORD. Nahraďte zástupné symboly <app-name> a <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"

Pro přístup k nastavení můžete použít metodu PHP getenv. Kód Laravel používá pro metodu PHP getenv obálku env. Například konfigurace MySQL v souboru config/database.php vypadá podobně jako v následujícím kódu:

'mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'localhost'),
    'database'  => env('DB_DATABASE', 'forge'),
    'username'  => env('DB_USERNAME', 'forge'),
    'password'  => env('DB_PASSWORD', ''),
    ...
],

Konfigurace proměnných prostředí Laravel

Laravel potřebuje ve službě App Service klíč aplikace. Můžete ho nakonfigurovat pomocí nastavení aplikace.

V okně místního terminálu pomocí příkazu php artisan vygenerujte nový klíč aplikace, aniž byste ho ukládali do souboru .env.

php artisan key:generate --show

V Cloud Shell pomocí příkazu nastavte klíč aplikace v aplikaci az webapp config appsettings set App Service. Nahraďte zástupné symboly <app-name> a <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" informuje Laravel, aby vrátil informace o ladění, když nasazená aplikace narazí na chyby. Při spouštění produkční aplikace ho nastavte na false, což je bezpečnější.

Nastavení cesty virtuální aplikace

Životní cyklus aplikace Laravel začíná ve veřejném adresáři místo kořenového adresáře aplikace. Výchozí image Dockeru s PHP pro službu App Service používá Apache a neumožňuje přizpůsobení DocumentRoot pro Laravel. Pomocí souboru .htaccess však můžete přepsat směrování všech požadavků do adresáře /public místo kořenového adresáře. Kořenový adresář úložiště pro tyto účely již soubor .htaccess obsahuje. S tímto souborem je vaše aplikace Laravel připravená k nasazení.

Další informace najdete v tématu Změna kořenového adresáře webu.

Přenos z Gitu do Azure

Zpět v okně místního terminálu přidejte vzdálené úložiště Azure do místního úložiště Git. Nahraďte <deploymentLocalGitUrl-from-create-step> adresou URL vzdáleného Gitu, který jste uložili z vytvoření webové aplikace.

git remote add azure <deploymentLocalGitUrl-from-create-step>

Nasaďte aplikaci do vzdáleného úložiště Azure pomocí následujícího příkazu. Když vás Správce přihlašovacích údajů Gitu vyzve k zadání přihlašovacích údajů, ujistěte se, že zadáte přihlašovací údaje, které jste vytvořili v konfiguraci uživatele nasazení, a ne přihlašovací údaje, které používáte k přihlášení k Azure Portal.

git push azure main

Spuštění tohoto příkazu může trvat několik minut. Při spuštění příkaz zobrazí podobné informace jako v následujícím příkladu:

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 >

Přejděte do aplikace Azure.

Přejděte na adresu http://<app-name>.azurewebsites.net a přidejte do seznamu několik úkolů.

PHP Web App in Azure

Blahopřejeme! Teď máte ve službě Azure App Service spuštěnou aplikaci PHP řízenou daty.

Místní aktualizace modelu a opětovné nasazení

V tomto kroku provedete jednoduchou změnu datového modelu task a webové aplikace a potom tuto aktualizaci publikujete v Azure.

Pro scénář úkolů upravíte aplikaci tak, abyste mohli úkol označit jako dokončený.

Přidání sloupce

V okně místního terminálu přejděte do kořenového adresáře úložiště Gitu.

Vygenerujte novou migraci databáze pro tabulku tasks:

php artisan make:migration add_complete_column --table=tasks

Tento příkaz zobrazí název generovaného souboru migrace. Vyhledejte tento soubor v adresáři database/migrations a otevřete ho.

Nahraďte metodu up následujícím kódem:

public function up()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->boolean('complete')->default(False);
    });
}

Předchozí kód přidá do tabulky tasks logický sloupec complete.

Pro akci vrácení zpět nahraďte metodu down následujícím kódem:

public function down()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->dropColumn('complete');
    });
}

V okně místního terminálu spusťte migrace databáze Laravel, aby se změna provedla v místní databázi.

php artisan migrate

Na základě konvence pojmenování Laravel model Task (viz app/Task.php) ve výchozím nastavení provádí mapování na tabulku tasks.

Aktualizace logiky aplikace

Otevřete soubor routes/web.php. V něm aplikace definuje své trasy a obchodní logiku.

Na konec souboru přidejte trasu s následujícím kódem:

/**
 * 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('/');
});

Předchozí kód provede jednoduchou aktualizaci datového modelu tím, že přepne hodnotu položky complete.

Aktualizace zobrazení

Otevřete soubor resources/views/tasks.blade.php. Vyhledejte počáteční značku <tr> a nahraďte ji:

<tr class="{{ $task->complete ? 'success' : 'active' }}" >

Předchozí kód změní barvu řádku v závislosti na tom, jestli je úkol dokončený.

Na dalším řádku je následující kód:

<td class="table-text"><div>{{ $task->name }}</div></td>

Celý řádek nahraďte následujícím kódem:

<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>

Předchozí kód přidá tlačítko Odeslat odkazující na trasy, které jste definovali předtím.

Místní test provedených změn

V okně místního terminálu spusťte vývojový server z kořenového adresáře úložiště Git.

php artisan serve

Pokud chcete vidět změnu stavu úkolu, přejděte na adresu http://localhost:8000 a zaškrtněte políčko.

Added check box to task

Pokud chcete zastavit PHP, zadejte v terminálu Ctrl + C.

Publikování změn v Azure

V okně místního terminálu spusťte migrace databází Laravel s produkčním připojovacím řetězcem, aby se provedla změna v databázi Azure.

php artisan migrate --env=production --force

Potvrďte všechny změny v Gitu a potom odešlete změny kódu do Azure.

git add .
git commit -m "added complete checkbox"
git push azure main

git push Po dokončení přejděte do aplikace Azure a otestujte nové funkce.

Model and database changes published to Azure

Pokud jste přidali nějaké úkoly, zůstanou v databázi. Aktualizace schématu dat nechávají existující data netknutá.

Vyčištění prostředků

V předchozích krocích jste vytvořili prostředky Azure ve skupině prostředků. Pokud předpokládáte, že už tyto prostředky nebudete potřebovat, odstraňte skupinu prostředků spuštěním následujícího příkazu ve službě Cloud Shell:

az group delete --name myResourceGroup

Další kroky