Öğretici: Azure App Service'de PHP (Laravel) ve MySQL Esnek Sunucu uygulaması Azure App Service

[Uygulama hedefi: MySQL için Azure veritabanı-esnek sunucu

Esnek Sunucu ile Azure'da PHP Web Uygulaması

Azure App Service Linux işletim sistemini kullanarak yüksek oranda ölçeklenebilir, kendi kendine düzeltme eki uygulama web barındırma hizmeti sağlar. Bu öğreticide, Azure'da BIR PHP uygulaması oluşturma ve bir MySQL veritabanına bağlama hakkında bilgi ve destek sağlar. Bitirdikten sonra bir Laravel uygulamasının Linux üzerinde Azure App Service.

Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:

  • Yerel MySQL ile PHP (Laravel) uygulaması ayarlama
  • MySQL Esnek Sunucusu oluşturma
  • Bağlan PHP uygulamasını MySQL Esnek Sunucusuna yükleme
  • Uygulamayı Azure App Service
  • Veri modelini güncelleştirme ve uygulamayı yeniden dağıtma
  • Uygulamayı Azure portalında yönetme

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir Azure hesabı oluşturun. Ücretsiz Azure hesabıyla artık Esnek Sunucu'MySQL için Azure Veritabanı 12 ay boyunca ücretsiz olarak denemeniz mümkün. Diğer ayrıntılar için bkz. Esnek Sunucuyu ücretsiz deneyin.

Önkoşullar

Bu öğreticiyi tamamlamak için:

  1. Git'i yükleyin
  2. PHP 5.6.4 veya sonraki sürümü yükleme
  3. Oluşturucu Yükleme
  4. Laravel için gereken şu PHP uzantılarını etkinleştirin: OpenSSL, PDO-MySQL, Mbstring, Tokenizer, XML
  5. MySQL'i yükleyin ve başlatın

Yerel MySQL hazırlama

Bu adımda, bu öğreticide kullanmak üzere yerel MySQL sunucunuzda bir veritabanı oluşturursunuz.

Yerel MySQL sunucusuna bağlanma

Bir terminal penceresinde yerel MySQL sunucunuza bağlanın. Bu öğreticideki tüm komutları çalıştırmak için bu terminal penceresini kullanabilirsiniz.

mysql -u root -p

Parola istenirse root hesabının parolasını girin. Kök hesap parolanızı hatırlamıyorsanız bkz MySQL: Kök Parolayı Sıfırlama.

Komutunuz başarıyla çalışırsa, MySQL sunucunuz çalışıyor demektir. Çalışmıyorsa, yerel MySQL sunucunuzun aşağıdaki MySQL yükleme sonrası adımları kullanılarak başlatıldığından emin olun.

Yerel olarak veritabanı oluşturma

mysql isteminde bir veritabanı oluşturun.

CREATE DATABASE sampledb;

quit yazarak sunucu bağlantınızdan çıkış yapın.

quit

Yerel olarak PHP uygulaması oluşturma

Bu adımda bir Laravel örnek uygulaması edinir, veritabanı bağlantısını yapılandırır ve yerel olarak çalıştırırsınız.

Örneği

Terminal penceresinde, örnek uygulamayı kopyalamak için boş bir dizine gidin. Örnek depoyu kopyalamak için aşağıdaki komutu çalıştırın.

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

cd komutuyla kopyalanmış dizininize geçin. Gereken paketleri yükleyin.

cd laravel-tasks
composer install

MySQL bağlantısını yapılandırma

Depo kökünde .env adlı bir dosya oluşturun. Aşağıdaki değişkenleri .env dosyasına kopyalayın. Aşağıdaki < root_password> yer tutucusunu MySQL kök kullanıcı parolasıyla değiştirin.

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>

Laravel’in .env dosyasını nasıl kullandığı hakkında bilgi için bkz. Laravel Ortamı Yapılandırması.

Örneği yerel olarak çalıştırma

Uygulama için gereken tabloları oluşturmak üzere Laravel veritabanı geçişlerini çalıştırın. Geçişlerde hangi tabloların oluşturulduğunu görmek için, Git deposundaki veritabanı/geçişler dizinine bakın.

php artisan migrate

Yeni bir Laravel uygulama anahtarı oluşturun.

php artisan key:generate

Uygulamayı çalıştırın.

php artisan serve

Bir tarayıcıda http://localhost:8000 sayfasına gidin. Sayfaya birkaç görev ekleyin.

PHP başarıyla MySQL’e bağlanır

PHP’yi durdurmak için terminale Ctrl + C yazın.

MySQL Esnek Sunucusu oluşturma

Bu adımda, Esnek Sunucu'da bir MySQL MySQL için Azure Veritabanı oluştururuz. Daha sonra, PHP uygulamasını bu veritabanına bağlanacak şekilde yapılandırırsınız. komut Azure Cloud Shellkomutuyla içinde bir sunucu az flexible-server create oluşturun.

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

Önemli

  • Sunucu adını ve bağlantı dizesini not edin ve sonraki adımda bunu kullanarak laravel veri geçişini çalıştırın.
  • IP-Address bağımsız değişkeni için istemci makinenizin IP'sini girin. Sunucu oluşturulduğunda kilitlenir ve sunucuyu yerel olarak yönetmek için istemci makinenize erişim izni vermeniz gerekir.

Web uygulamasının sunucuya bağlanmasına izin vermek için sunucu güvenlik duvarını yapılandırma

Komut Cloud Shell az mysql server firewall-rule create komutunu kullanarak istemci bağlantılarına izin vermek için MySQL sunucunuz için bir güvenlik duvarı kuralı oluşturun. Hem başlangıç IP'sini hem de bitiş IP'sini olarak ayarlayarak güvenlik duvarı yalnızca sunucuya bağlanmak için statik IP'ye sahip olmayan 0.0.0.0 diğer Azure hizmetleri için açılır.

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

Üretim MySQL sunucusuna yerel olarak bağlanma

Yerel terminal penceresinde, Azure’da MySQL sunucusuna bağlanın. ve için daha önce belirttiğiniz değeri <admin-user> <mysql-server-name> kullanın. Parola sorulduğunda, Azure’da veritabanı oluştururken belirttiğiniz parolayı kullanın.

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

Üretim veritabanı oluşturma

mysql isteminde bir veritabanı oluşturun.

CREATE DATABASE sampledb;

İzinleri olan bir kullanıcı oluşturma

phpappuser adlı bir veritabanı kullanıcısı oluşturun ve bu kullanıcıya sampledb veritabanındaki tüm ayrıcalıkları verin. Öğreticinin basitliği için parola olarak MySQLAzure2020 kullanın.

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

quit yazarak sunucu bağlantısından çıkış yapın.

quit

Bağlan MySQL esnek sunucusuna yükleme

Bu adımda, PHP uygulamasını MySQL için Azure Veritabanı içinde oluşturduğunuz MySQL veritabanına bağlarsınız.

Veritabanı bağlantısını yapılandırma

Depo kökünde bir .env.production dosyası oluşturun ve içine aşağıdaki değişkenleri kopyalayın. < mysql-server-name yer tutucusunu hem>hem de DB_HOST yerine 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

Değişiklikleri kaydedin.

İpucu

MySQL bağlantı bilgilerinizin güvenliğini sağlamak için bu dosya zaten Git deposunun dışında bırakılmıştır (Depo kökünde .gitignore dosyasına bakın). Daha sonra, App Service’teki ortam değişkenlerini, MySQL için Azure Veritabanı içinde veritabanınıza bağlanmak üzere nasıl yapılandıracağınızı öğreneceksiniz. Ortam değişkenlerini kullandığınızda App Service içinde .env dosyası gerekli değildir.

TLS/SSL sertifikasını yapılandırma

Varsayılan olarak, MySQL Esnek Sunucusu istemcilerden TLS bağlantılarını zorlar. Azure'da MySQL veritabanınıza bağlanmak için Esnek Sunucu tarafından sağlanan .pem sertifikasını MySQL için Azure Veritabanı gerekir. Bu sertifikayıindirin ) ve örnek uygulama deposunun yerel kopyasında SSL klasörüne yer açın.

config/database.php dosyasını açın ve aşağıdaki kodda gösterildiği gibi sslmode ve options parametrelerini connections.mysql içine ekleyin.

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

Uygulamayı yerel olarak test etme

MySQL için Azure Veritabanı içinde tablolar oluşturmak için, .env.production ile Laravel veritabanı geçişlerini ortam dosyası olarak çalıştırın. .env.production dosyasının, Azure’da MySQL veritabanınızla bağlantı bilgilerini içerdiğini unutmayın.

php artisan migrate --env=production --force

.env.production henüz geçerli bir uygulama anahtarına sahip değildir. Terminalde bu dosya için yeni bir tane oluşturun.

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

Örnek uygulamayı .env.production ortam dosyası ile birlikte çalıştırın.

php artisan serve --env=production

http://localhost:8000 sayfasına gidin. Sayfa hatasız yüklenirse, PHP uygulaması Azure’da MySQL veritabanına bağlanıyor demektir.

Sayfaya birkaç görev ekleyin.

PHP, MySQL için Azure Veritabanı’na başarıyla bağlanır

PHP’yi durdurmak için terminale Ctrl + C yazın.

Değişikliklerinizi kaydetme

Değişikliklerinizi kaydetmek için aşağıdaki Git komutlarını çalıştırın:

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

Uygulamanız dağıtılmaya hazırdır.

Azure’a dağıtın

Bu adımda, MySQL’e bağlı PHP uygulamasını Azure App Service'e dağıtırsınız.

Dağıtım kullanıcısı yapılandırma

FTP ve yerel git, bir dağıtım kullanıcısı kullanarak bir Azure Web uygulamasına dağıtabilir. Dağıtım kullanıcısını yapılandırdıktan sonra tüm Azure dağıtımlarınız için kullanabilirsiniz. Hesap düzeyinde dağıtım Kullanıcı adınız ve parolanız, Azure aboneliği kimlik bilgilerinizden farklı.

Dağıtım kullanıcısını yapılandırmak için, Azure Cloud Shell bölümünde az WebApp Deployment User set komutunu çalıştırın. Kullanıcı adı <> ve < parola> , dağıtım Kullanıcı Kullanıcı adınızla ve parolasıyla değiştirin.

Kullanıcı adı Azure içinde benzersiz olmalıdır ve yerel git gönderimleri için ' @ ' sembolünü içermemelidir. Parola en az sekiz karakter uzunluğunda olmalıdır ve şu üç öğeden ikisi vardır: harfler, rakamlar ve semboller.

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

JSON çıktısı, parolayı null olarak gösterir. ' Çakışma ' alırsanız. Ayrıntılar: 409 hatası, Kullanıcı adını değiştirin. ' Hatalı Istek ' alırsanız. Ayrıntılar: 400 hatası, daha güçlü bir parola kullanın. Web uygulamalarınızı dağıtmak için kullanmak üzere Kullanıcı adınızı ve parolanızı kaydedin.

App Service planı oluşturma

Cloud Shell, az appservice plan Create komutuyla kaynak grubunda bir App Service planı oluşturun. Aşağıdaki örnek, ücretsiz fiyatlandırma katmanında (--SKU F1) ve bir Linux kapsayıcısında (--,-Linux) myAppServicePlan adlı bir App Service planı oluşturur.

az appservice plan Create--Name myAppServicePlan--Resource-Group myResourceGroup--SKU F1---Linux

Web uygulaması oluşturma

MyAppServicePlan App Service planında bir Web uygulaması oluşturun.

Cloud Shell az WebApp Create komutunu kullanabilirsiniz. Aşağıdaki örnekte, < app-name> değerini genel olarak benzersiz bir uygulama adıyla değiştirin (geçerli karakterler a-z , 0-9 ve - ). Çalışma zamanı PHP|7.0 olarak ayarlanmıştır. Desteklenen tüm çalışma zamanlarını görmek için az WebApp List-çalışma zamanları--Linux' u çalıştırın.

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

Web uygulaması oluşturulduğunda Azure CLI aşağıda yer alan çıktıdaki gibi bilgiler gösterir:

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

Git dağıtımı etkinken boş bir yeni Web uygulaması oluşturdunuz.

Not

Git Remote 'in URL 'SI deploymentLocalGitUrl özelliğinde biçimiyle gösterilir https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git . Bu URL’ye daha sonra ihtiyacınız olacağı için URL’yi kaydedin.

Veritabanı ayarlarını yapılandırma

App Service'te, az webapp config appsettings set komutunu kullanıp ortam değişkenlerini uygulama ayarları olarak belirlersiniz.

Aşağıdaki komut DB_HOST, DB_DATABASE, DB_USERNAME ve DB_PASSWORD uygulama ayarlarını yapılandırır. < App-name> ve < mysql-Server-Name> yer tutucularını değiştirin.

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"

Ayarlara erişmek için PHP getenv yöntemini kullanabilirsiniz. Laravel kodu, PHP getenv üzerinde bir env sarmalayıcı kullanır. Örneğin, config/database.php içindeki MySQL yapılandırması aşağıdaki kod gibi görünür:

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

Laravel ortam değişkenlerini yapılandırma

Laravel, App Service'te bir uygulama anahtarı gerektirir. Uygulama anahtarını uygulama ayarları ile yapılandırabilirsiniz.

Yerel terminal penceresinde, uygulama anahtarını .env dosyasına kaydetmeden yeni bir uygulama anahtarı oluşturmak için php artisan seçeneğini kullanın.

php artisan key:generate --show

Cloud Shell, komutunu kullanarak App Service uygulamasındaki uygulama anahtarını ayarlayın az webapp config appsettings set . < App-name> ve < outputofphpartisankey: Generate> yer tutucuları değiştirin.

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" , dağıtılmış uygulama hata ile karşılaştığında hata ayıklama bilgilerini döndürmesini söyler. Bir üretim uygulaması çalıştırırken daha güvenli olan false seçeneğine ayarlayın.

Sanal uygulama yolu ayarlama

Laralevel uygulama yaşam döngüsü , uygulamanın kök dizini yerine ortak dizin içinde başlar. App Service için varsayılan PHP Docker görüntüsü, Apache kullanır ve Laravel için DocumentRoot öğesini özelleştirmenize izin vermez. Bununla birlikte, .htaccess kullanarak tüm istekleri kök dizin yerine /public dizinini işaret edecek şekilde yeniden yazabilirsiniz. Depo köküne bu amaçla bir .htaccess zaten eklenmiştir. Bununla, Laravel uygulamanız dağıtılmaya hazırdır.

Daha fazla bilgi için bkz. site kökünü değiştirme.

Git üzerinden Azure'a gönderme

Yerel terminal penceresine dönüp yerel Git deponuza bir Azure uzak deposu ekleyin. < Deploymentlocalgiturl-from-Create-Step> , Web uygulaması oluşturlistesinden kaydettiğiniz git uzak URL 'siyle değiştirin.

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

Aşağıdaki komutla uygulamanızı dağıtmak için Azure uzak deposuna gönderin. Git kimlik bilgileri Yöneticisi kimlik bilgilerini sizden isterse, Azure portal oturum açmak için kullandığınız kimlik bilgilerini değil dağıtım kullanıcısı yapılandırma bölümünde oluşturduğunuz kimlik bilgilerini girdiğinizden emin olun.

git push azure main

Bu komutun çalıştırılması birkaç dakika sürebilir. Çalıştırıldığında, aşağıdaki örneğe benzer bilgiler görüntüler:

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 >

Azure uygulamasına gidin

http://<app-name>.azurewebsites.net listesine göz atın ve listeye birkaç görev ekleyin.

Azure 'da PHP Web uygulaması

Tebrikler, Azure App Service'te veri temelli bir PHP uygulaması çalıştırıyorsunuz.

Modeli yerel olarak güncelleştirme ve yeniden dağıtma

Bu adımda, task veri modeli ve web uygulamasında basit bir değişiklik yaptıktan sonra güncelleştirmeyi Azure'da yayımlarsınız.

Görevler senaryosu için, görevi tamamlandı olarak işaretleyebileceğiniz şekilde uygulamayı değiştirirsiniz.

Sütun ekleme

Yerel terminal penceresinde Git deposunun kök dizinine gidin.

tasks tablosu için yeni bir veritabanı geçişi oluşturun:

php artisan make:migration add_complete_column --table=tasks

Bu komut, oluşturulan geçiş dosyasının adını gösterir. database/migrations içinde bu dosyayı bulup açın.

up yöntemini aşağıdaki kod ile değiştirin:

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

Yukarıdaki kod, tasks tablosuna complete adlı bir boole sütunu ekler.

Geri alma eylemi için down yöntemini aşağıdaki kod ile değiştirin:

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

Yerel terminal penceresinde, Laravel veritabanı geçişlerini çalıştırarak yerel veritabanında değişikliği yapın.

php artisan migrate

Laravel adlandırma kuralına göre Task modeli (bkz. app/Task.php) varsayılan olarak tasks tablosu ile eşlenir.

Uygulama mantığını güncelleştirme

routes/web.php dosyasını açın. Uygulama, yollarını ve iş mantığını burada tanımlar.

Dosyanın sonuna aşağıdaki kod ile bir yol ekleyin:

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

Yukarıdaki kod, complete değerini değiştirerek veri modelinde basit bir güncelleştirme yapar.

Görünümü güncelleştirme

resources/views/tasks.blade.php dosyasını açın. <tr> açma etiketini bulup şununla değiştirin:

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

Yukarıdaki kod, görevin tamamlanıp tamamlanmamasına bağlı olarak satır rengini değiştirir.

Sonraki satırda şu kodu görürsünüz:

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

Tüm satırı aşağıdaki kod ile değiştirin:

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

Yukarıdaki kod, daha önce tanımladığınız yola başvuran Gönder düğmesini ekler.

Değişiklikleri yerel olarak test etme

Yerel terminal penceresinde, Git deposunun kök dizininden geliştirme sunucusunu çalıştırın.

php artisan serve

Görev durumu değişikliğini görmek için http://localhost:8000 öğesine gidip onay kutusunu işaretleyin.

Göreve eklenen onay kutusu

PHP’yi durdurmak için terminale Ctrl + C yazın.

Değişiklikleri Azure’da yayımlama

Yerel terminal penceresinde, Laravel veritabanı geçişlerini üretim bağlantı dizesi ile birlikte çalıştırarak değişikliği Azure veritabanında yapın.

php artisan migrate --env=production --force

Tüm değişiklikleri Git’e kaydedin ve ardından kod değişikliklerini Azure’a gönderin.

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

Tamamlandıktan sonra git push Azure uygulamasına gidin ve yeni işlevleri test edin.

Azure’da yayımlanan model ve veritabanı değişiklikleri

Herhangi bir görevi eklediyseniz veritabanında tutulur. Veri şemasında yapılan güncelleştirmeler var olan verileri olduğu gibi bırakır.

Kaynakları temizleme

Önceki adımlarda, bir kaynak grubunda Azure kaynakları oluşturdunuz. Bu kaynakların gelecekte gerekli olacağını düşünmüyorsanız, Cloud Shell’de aşağıdaki komutu çalıştırarak kaynak grubunu silin:

az group delete --name myResourceGroup

Sonraki adımlar