Mengonfigurasi aplikasi PHP untuk Azure App Service

Menampilkan versi PHP

Panduan ini menunjukkan cara mengonfigurasi aplikasi web PHP, backend seluler, dan aplikasi API di Azure App Service.

Panduan ini menyediakan petunjuk dan konsep utama untuk pengembang PHP yang menyebarkan aplikasi ke App Service. Jika Anda belum pernah menggunakan Azure App Service, ikuti mulai cepat PHP dan tutorial PHP dengan MySQL terlebih dahulu.

Untuk menunjukkan versi PHP saat ini, jalankan perintah berikut di Cloud Shell:

az webapp config show --resource-group <resource-group-name> --name <app-name> --query phpVersion

Catatan

Untuk mengatasi slot pengembangan, sertakan parameter --slot yang diikuti dengan nama slot.

Untuk menunjukkan semua versi PHP yang didukung, jalankan perintah berikut di Cloud Shell:

az webapp list-runtimes --os windows | grep PHP

Panduan ini menunjukkan cara mengonfigurasi aplikasi web PHP, backend seluler, dan aplikasi API di Azure App Service.

Panduan ini menyediakan petunjuk dan konsep utama untuk pengembang PHP yang menyebarkan aplikasi ke App Service. Jika Anda belum pernah menggunakan Azure App Service, ikuti mulai cepat PHP dan tutorial PHP dengan MySQL terlebih dahulu.

Untuk menunjukkan versi PHP saat ini, jalankan perintah berikut di Cloud Shell:

az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion

Catatan

Untuk mengatasi slot pengembangan, sertakan parameter --slot yang diikuti dengan nama slot.

Untuk menunjukkan semua versi PHP yang didukung, jalankan perintah berikut di Cloud Shell:

az webapp list-runtimes --os linux | grep PHP

Menetapkan versi PHP

Jalankan perintah berikut di Cloud Shell untuk mengatur versi PHP ke 8.1:

az webapp config set --resource-group <resource-group-name> --name <app-name> --php-version 8.1

Jalankan perintah berikut di Cloud Shell untuk mengatur versi PHP ke 8.1:

az webapp config set --resource-group <resource-group-name> --name <app-name> --linux-fx-version "PHP|8.1"

Menjalankan Komposer

Jika Anda ingin App Service menjalankan Komposer pada waktu penyebaran, cara termudah adalah menyertakan Komposer di repositori Anda.

Dari jendela terminal lokal, ubah direktori ke akar repositori Anda, dan ikuti petunjuk saat mengunduh Komposer untuk mengunduh composer.phar ke akar direktori.

Jalankan perintah berikut (Anda perlu menginstal npm):

npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt

Akar repositori Anda sekarang memiliki dua file tambahan: .deployment dan deploy.sh.

Buka deploy.sh dan temukan bagian Deployment, yang terlihat seperti ini:

##################################################################################################################################
# Deployment
# ----------

Tambahkan bagian kode yang Anda perlukan untuk menjalankan alat yang diperlukan di akhir bagian Deployment:

# 4. Use composer
echo "$DEPLOYMENT_TARGET"
if [ -e "$DEPLOYMENT_TARGET/composer.json" ]; then
  echo "Found composer.json"
  pushd "$DEPLOYMENT_TARGET"
  php composer.phar install $COMPOSER_ARGS
  exitWithMessageOnError "Composer install failed"
  popd
fi

Terapkan semua perubahan Anda dan sebarkan kode Anda menggunakan Git, atau sebaran Zip dengan otomatisasi build diaktifkan Komposer sekarang akan berjalan sebagai bagian dari otomatisasi penyebaran.

Menjalankan Grunt/Bower/Gulp

Jika Anda ingin App Service menjalankan alat otomatisasi populer pada waktu penyebaran, seperti Grunt, Bower, atau Gulp, Anda perlu menyediakan skrip penyebaran kustom. App Service menjalankan skrip ini saat Anda menyebarkan dengan Git, atau dengan Penyebaran zip dengan otomatisasi build diaktifkan.

Agar repositori Anda dapat menjalankan alat ini, Anda perlu menambahkannya ke dependensi di package.json. Misalnya:

"dependencies": {
  "bower": "^1.7.9",
  "grunt": "^1.0.1",
  "gulp": "^3.9.1",
  ...
}

Dari jendela terminal lokal, ubah direktori ke akar repositori Anda dan jalankan perintah berikut (Anda perlu menginstal npm):

npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt

Akar repositori Anda sekarang memiliki dua file tambahan: .deployment dan deploy.sh.

Buka deploy.sh dan temukan bagian Deployment, yang terlihat seperti ini:

##################################################################################################################################
# Deployment
# ----------

Bagian ini diakhiri dengan menjalankan npm install --production. Tambahkan bagian kode yang Anda perlukan untuk menjalankan alat yang diperlukan di akhir bagian Deployment:

Lihat contoh dalam sampel MEAN.js, tempat skrip penyebaran juga menjalankan perintah npm install kustom.

Bower

Cuplikan ini menjalankan bower install.

if [ -e "$DEPLOYMENT_TARGET/bower.json" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/bower install
  exitWithMessageOnError "bower failed"
  cd - > /dev/null
fi

Gulp

Cuplikan ini menjalankan gulp imagemin.

if [ -e "$DEPLOYMENT_TARGET/gulpfile.js" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/gulp imagemin
  exitWithMessageOnError "gulp failed"
  cd - > /dev/null
fi

Grunt

Cuplikan ini menjalankan grunt.

if [ -e "$DEPLOYMENT_TARGET/Gruntfile.js" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/grunt
  exitWithMessageOnError "Grunt failed"
  cd - > /dev/null
fi

Mengkustomisasi otomatisasi build

Jika Anda menyebarkan aplikasi menggunakan paket zip atau Git dengan otomatisasi build diaktifkan, App Service membuat langkah-langkah otomatisasi melalui urutan berikut:

  1. Menjalankan skrip kustom jika ditentukan oleh PRE_BUILD_SCRIPT_PATH.
  2. Jalankan php composer.phar install.
  3. Menjalankan skrip kustom jika ditentukan oleh POST_BUILD_SCRIPT_PATH.

PRE_BUILD_COMMAND dan POST_BUILD_COMMAND merupakan variabel lingkungan yang kosong secara default. Untuk menjalankan perintah pra-build, tentukan PRE_BUILD_COMMAND. Untuk menjalankan perintah pasca-build, tentukan POST_BUILD_COMMAND.

Contoh berikut menentukan dua variabel ke serangkaian perintah, yang dipisahkan oleh koma.

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PRE_BUILD_COMMAND="echo foo, scripts/prebuild.sh"
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings POST_BUILD_COMMAND="echo foo, scripts/postbuild.sh"

Untuk variabel lingkungan tambahan untuk mengkustomisasi automasi build, lihat Konfigurasi Oryx.

Untuk mengetahui informasi selengkapnya tentang cara App Service menjalankan dan membuat aplikasi PHP di Linux, lihat Dokumentasi Oryx: Bagaimana aplikasi PHP dideteksi dan dibuat.

Mengustomisasi {i>start-up

Jika mau, Anda dapat menjalankan perintah kustom pada waktu mulai kontainer, dengan menjalankan perintah berikut di Cloud Shell:

az webapp config set --resource-group <resource-group-name> --name <app-name> --startup-file "<custom-command>"

Mengakses variabel lingkungan

Di App Service, Anda dapat menyetel pengaturan aplikasi di luar kode aplikasi. Lalu, Anda dapat mengaksesnya menggunakan pola getenv() standar. Misalnya, untuk mengakses pengaturan aplikasi yang disebut DB_HOST, gunakan kode berikut:

getenv("DB_HOST")

Mengubah akar situs

Kerangka kerja web pilihan Anda dapat menggunakan subdirektori sebagai akar situs. Misalnya, Laravel, menggunakan subdirektori public/ sebagai akar situs.

Untuk menyesuaikan akar situs, atur jalur aplikasi virtual untuk aplikasi menggunakan perintah az resource update. Contoh berikut ini mengatur akar situs ke subdirektori public/ di repositori Anda.

az resource update --name web --resource-group <group-name> --namespace Microsoft.Web --resource-type config --parent sites/<app-name> --set properties.virtualApplications[0].physicalPath="site\wwwroot\public" --api-version 2015-06-01

Secara default, Azure App Service menunjuk jalur aplikasi virtual root (/) ke direktori root file aplikasi yang disebarkan (sites\wwwroot).

Kerangka kerja web pilihan Anda dapat menggunakan subdirektori sebagai akar situs. Misalnya, Laravel, menggunakan subdirektori public/ sebagai akar situs.

Gambar PHP default untuk App Service menggunakan Nginx, dan Anda mengubah akar situs dengan mengonfigurasi server Nginx dengan direktifroot. Contoh file konfigurasi ini berisi cuplikan berikut yang mengubah direktifroot:

server {
    #proxy_cache cache;
    #proxy_cache_valid 200 1s;
    listen 8080;
    listen [::]:8080;
    root /home/site/wwwroot/public; # Changed for Laravel

    location / {            
        index  index.php index.html index.htm hostingstart.html;
        try_files $uri $uri/ /index.php?$args; # Changed for Laravel
    }
    ...

Kontainer default menggunakan file konfigurasi yang ditemukan di /etc/nginx/sites-available/default. Perlu diingat bahwa setiap pengeditan yang Anda buat pada file ini dihapus saat aplikasi dimulai ulang. Untuk membuat perubahan yang efektif di seluruh mulai ulang aplikasi, tambahkan perintah start-up kustom seperti contoh ini:

cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload

Perintah ini menggantikan file konfigurasi Nginx default dengan file bernama default di akar repositori Anda dan memulai ulang Nginx.

Mendeteksi sesi HTTPS

Dalam App Service, penghentian TLS/SSL terjadi pada load balancer jaringan, sehingga semua permintaan HTTPS mencapai aplikasi Anda sebagai permintaan HTTP yang tidak terenkripsi. Jika logika aplikasi Anda perlu memeriksa apakah permintaan pengguna dienkripsi atau tidak, periksa header X-Forwarded-Proto.

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
// Do something when HTTPS is used
}

Kerangka kerja web populer memungkinkan Anda mengakses informasi X-Forwarded-* dalam pola aplikasi standar Anda. Di CodeIgniter, is_https() memeriksa nilai X_FORWARDED_PROTO secara default.

Menyesuaikan php.ini ini

Jika Anda perlu membuat perubahan pada penginstalan PHP, Anda dapat mengubah salah satu arahan php.ini dengan mengikuti langkah-langkah ini.

Catatan

Cara terbaik untuk melihat versi PHP dan konfigurasi php.ini saat ini adalah dengan memanggil phpinfo() di aplikasi Anda.

Menyesuaikan arahan non-PHP_INI_SYSTEM

Untuk menyesuaikan arahan PHP_INI_USER, PHP_INI_PERDIR, dan PHP_INI_ALL (lihat arahan php.ini), tambahkan file .user.ini ke direktori akar aplikasi Anda.

Tambahkan pengaturan konfigurasi ke file .user.ini menggunakan sintaksis yang sama dengan yang akan Anda gunakan dalam file php.ini. Misalnya, jika Anda ingin mengaktifkan pengaturan display_errors dan menetapkan pengaturan upload_max_filesize ke 10M, file .user.ini Anda akan berisi teks ini:

 ; Example Settings
 display_errors=On
 upload_max_filesize=10M

 ; Write errors to d:\home\LogFiles\php_errors.log
 ; log_errors=On

Menyebarkan ulang aplikasi Anda dengan perubahan dan mulai ulang.

Sebagai alternatif untuk menggunakan file .user.ini, Anda dapat menggunakan ini_set() di aplikasi untuk menyesuaikan arahan non-PHP_INI_SYSTEM ini.

Untuk menyesuaikan arahan PHP_INI_USER, PHP_INI_PERDIR, dan PHP_INI_ALL untuk aplikasi web linux, seperti upload_max_filesize dan expose_php, gunakan file "ini" kustom. Anda dapat membuatnya dalam sesi SSH.

  1. Buka situs KUDU Anda https://< sitename.scm.azurewebsites.net>.
  2. Pilih Bash atau SSH dari menu atas.
  3. Di Bash/SSH, buka direktori "/home/site/wwwroot" Anda.
  4. Buat direktori yang disebut "ini" (misalnya, mkdir ini).
  5. Ubah direktori kerja saat ini ke folder "ini" yang baru saja Anda buat.

Anda perlu membuat file "ini" untuk menambahkan pengaturan Anda. Dalam contoh ini, kami menggunakan "extensions.ini". Tidak ada editor file seperti Vi, Vim, atau Nano sehingga Anda akan menggunakan echo untuk menambahkan pengaturan ke file. Ubah "upload_max_filesize" dari 2M menjadi 50M. Gunakan perintah berikut untuk menambahkan pengaturan dan membuat file "extensions.ini" jika belum ada.

/home/site/wwwroot/ini>echo "upload_max_filesize=50M" >> extensions.ini
/home/site/wwwroot/ini>cat extensions.ini

upload_max_filesize=50M

/home/site/wwwroot/ini>

Kemudian, buka portal Azure dan tambahkan Pengaturan Aplikasi untuk memindai direktori "ini" yang baru saja Anda buat untuk menerapkan perubahan untuk upload_max_filesize.

  1. Buka portal Azure dan pilih aplikasi PHP Linux App Service Anda.
  2. Pilih Aplikasi Pengaturan untuk aplikasi.
  3. Di bawah bagian Pengaturan aplikasi, pilih + Tambahkan pengaturan baru.
  4. Untuk Nama Pengaturan Aplikasi, masukkan "PHP_INI_SCAN_DIR" dan untuk nilai, masukkan "/home/site/wwwroot/ini".
  5. Pilih tombol simpan.

Catatan

Jika Anda mengkompilasi ulang ekstensi PHP, seperti GD, ikuti langkah-langkah di Mengkompilasi Ulang Ekstensi PHP di Azure App Service - Menambahkan Ekstensi PHP

Menyesuaikan arahan PHP_INI_SYSTEM

Untuk menyesuaikan arahan PHP_INI_SYSTEM (lihat arahan php.ini), gunakan PHP_INI_SCAN_DIR pengaturan aplikasi.

Pertama, jalankan perintah berikut di Cloud Shell untuk menambahkan pengaturan aplikasi yang disebut PHP_INI_SCAN_DIR:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PHP_INI_SCAN_DIR="d:\home\site\ini"

Navigasi ke konsol Kudu (https://<app-name>.scm.azurewebsites.net/DebugConsole) dan navigasi ke d:\home\site.

Buat direktori di d:\home\site yang disebut ini, lalu buat file .ini di direktori d:\home\site\ini (misalnya, settings.ini) dengan arahan yang ingin Anda sesuaikan. Gunakan sintaksis yang sama dengan yang akan Anda gunakan dalam file php.ini.

Misalnya, untuk mengubah nilai expose_php, jalankan perintah berikut:

cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini

Agar perubahan diterapkan, mulai ulang aplikasi.

Untuk menyesuaikan PHP_INI_SYSTEM (lihat arahan php.ini), Anda tidak dapat menggunakan pendekatan .htaccess. App Service menyediakan mekanisme terpisah menggunakan pengaturan aplikasi PHP_INI_SCAN_DIR.

Pertama, jalankan perintah berikut di Cloud Shell untuk menambahkan pengaturan aplikasi yang disebut PHP_INI_SCAN_DIR:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PHP_INI_SCAN_DIR="/usr/local/etc/php/conf.d:/home/site/ini"

/usr/local/etc/php/conf.d adalah direktori default tempat php.ini berada. /home/site/ini adalah direktori kustom tempat Anda akan menambahkan file .ini. Anda memisahkan nilai dengan :.

Navigasi ke sesi SSH web dengan kontainer Linux Anda (https://<app-name>.scm.azurewebsites.net/webssh/host).

Buat direktori di /home/site yang disebut ini, lalu buat file .ini di direktori /home/site/ini (misalnya, settings.ini) dengan arahan yang ingin Anda sesuaikan. Gunakan sintaksis yang sama dengan yang akan Anda gunakan dalam file php.ini.

Tip

Dalam kontainer Linux bawaan di App Service, /home digunakan sebagai penyimpanan bersama yang mempertahankan.

Misalnya, untuk mengubah nilai expose_php, jalankan perintah berikut:

cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini

Agar perubahan diterapkan, mulai ulang aplikasi.

Mengaktifkan ekstensi PHP

Penginstalan PHP bawaan berisi ekstensi yang paling umum digunakan. Anda dapat mengaktifkan ekstensi tambahan dengan cara yang sama seperti saat Anda menyesuaikan arahan php.ini.

Catatan

Cara terbaik untuk melihat versi PHP dan konfigurasi php.ini saat ini adalah dengan memanggil phpinfo() di aplikasi Anda.

Untuk mengaktifkan ekstensi tambahan, dengan mengikuti langkah-langkah ini:

Tambahkan direktori bin ke direktori akar aplikasi Anda dan letakkan file ekstensi .dll di dalamnya (misalnya, mongodb.dll). Pastikan bahwa ekstensi kompatibel dengan versi PHP di Azure dan kompatibel dengan VC9 dan non-thread-safe (nts).

Sebarkan perubahan Anda.

Ikuti langkah-langkah dalam arahan PHP_INI_SYSTEM, dan tambahkan ekstensi ke dalam file .ini kustom dengan arahan extension atau zend_extension.

extension=d:\home\site\wwwroot\bin\mongodb.dll
zend_extension=d:\home\site\wwwroot\bin\xdebug.dll

Agar perubahan diterapkan, mulai ulang aplikasi.

Penginstalan PHP bawaan berisi ekstensi yang paling umum digunakan. Anda dapat mengaktifkan ekstensi tambahan dengan cara yang sama seperti saat Anda menyesuaikan arahan php.ini.

Catatan

Cara terbaik untuk melihat versi PHP dan konfigurasi php.ini saat ini adalah dengan memanggil phpinfo() di aplikasi Anda.

Untuk mengaktifkan ekstensi tambahan, dengan mengikuti langkah-langkah ini:

Tambahkan direktori bin ke direktori akar aplikasi Anda dan letakkan file ekstensi .so di dalamnya (misalnya, mongodb.so). Pastikan bahwa ekstensi kompatibel dengan versi PHP di Azure dan kompatibel dengan VC9 dan non-thread-safe (nts).

Sebarkan perubahan Anda.

Ikuti langkah-langkah dalam arahan PHP_INI_SYSTEM, dan tambahkan ekstensi ke dalam file .ini kustom dengan arahan extension atau zend_extension.

extension=/home/site/wwwroot/bin/mongodb.so
zend_extension=/home/site/wwwroot/bin/xdebug.so

Agar perubahan diterapkan, mulai ulang aplikasi.

Mengakses log diagnostik

Gunakan utilitas error_log() standar untuk membuat log diagnostik Anda muncul di Azure App Service.

Untuk mengakses log konsol yang dihasilkan dari dalam kode aplikasi Anda di App Service, aktifkan pembuatan log diagnostik dengan menjalankan perintah berikut di Cloud Shell:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

Nilai yang mungkin untuk --level adalah: Error, Warning, Info, dan Verbose. Setiap level berikutnya mencakup level sebelumnya. Misalnya: Error hanya menyertakan pesan kesalahan, dan Verbose menyertakan semua pesan.

Setelah pembuatan log diagnostik diaktifkan, jalankan perintah berikut untuk melihat aliran log:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

Jika Anda tidak segera melihat log konsol, periksa lagi dalam 30 detik.

Catatan

Anda juga dapat memeriksa file log dari browser di https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Untuk menghentikan streaming log kapan saja, ketikkan Ctrl+C.

Anda dapat mengakses log konsol yang dihasilkan dari dalam kontainer.

Pertama, aktifkan pengelogan kontainer dengan menjalankan perintah berikut:

az webapp log config --name <app-name> --resource-group <resource-group-name> --docker-container-logging filesystem

Ganti <app-name> dan <resource-group-name> dengan nama yang sesuai untuk aplikasi web Anda.

Setelah pengelogan kontainer diaktifkan, jalankan perintah berikut untuk melihat aliran log:

az webapp log tail --name <app-name> --resource-group <resource-group-name>

Jika Anda tidak segera melihat log konsol, periksa lagi dalam 30 detik.

Untuk menghentikan streaming log kapan saja, tekan Ctrl+C.

Anda juga dapat memeriksa file log di browser di https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Pemecahan Masalah

Saat aplikasi PHP yang aktif berperilaku berbeda di App Service atau mengalami kesalahan, coba berikut ini:

  • Mengalirkan aliran log.
  • Uji aplikasi secara lokal dalam mode produksi. App Service menjalankan aplikasi Anda dalam mode produksi, jadi Anda perlu memastikan bahwa proyek berfungsi seperti yang diharapkan dalam mode produksi secara lokal. Misalnya:
    • Tergantung pada composer.json Anda, paket yang berbeda mungkin diinstal untuk mode produksi (require vs. require-dev).
    • Kerangka kerja web tertentu dapat menyebarkan file statis secara berbeda dalam mode produksi.
    • Kerangka kerja web tertentu mungkin menggunakan skrip startup kustom saat berjalan dalam mode produksi.
  • Jalankan aplikasi Anda di App Service dalam mode debug. Misalnya, di Laravel, Anda dapat mengonfigurasi aplikasi untuk menghasilkan pesan debug dalam produksi dengan mengatur pengaturan aplikasi APP_DEBUG ke true.

robot933456 dalam log

Anda mungkin melihat pesan berikut dalam log kontainer:

2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"

Anda dapat mengabaikan pesan ini dengan aman. /robots933456.txt adalah jalur URL dummy yang digunakan App Service untuk memeriksa apakah kontainer mampu melayani permintaan. Respons 404 hanya menunjukkan bahwa jalur tersebut tidak ada, tetapi ini memberi tahu App Service bahwa kontainernya sehat dan siap untuk menanggapi permintaan.

Langkah berikutnya

Atau, lihat sumber daya tambahan:

Variabel lingkungan dan referensi pengaturan aplikasi