Öğretici: Azure App Service'de PHP (Laravel) ve MySQL Esnek Sunucu uygulaması Azure App Service
[Uygulama hedefi:
MySQL için Azure veritabanı-esnek sunucu
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:
- Git'i yükleyin
- PHP 5.6.4 veya sonraki sürümü yükleme
- Oluşturucu Yükleme
- Laravel için gereken şu PHP uzantılarını etkinleştirin: OpenSSL, PDO-MySQL, Mbstring, Tokenizer, XML
- 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’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’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.
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.
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.
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