Mengonfigurasi aplikasi Java untuk Azure App Service

Catatan

Untuk aplikasi Spring, sebaiknya gunakan Azure Spring Apps. Namun, Anda masih dapat menggunakan Azure App Service sebagai tujuan. Lihat Panduan Tujuan Beban Kerja Java untuk saran.

Azure App Service memungkinkan pengembang Java untuk dengan cepat membangun, menyebarkan, dan menskalakan aplikasi web Java SE, Tomcat, dan JBoss EAP mereka pada layanan yang dikelola sepenuhnya. Sebarkan aplikasi dengan plugin Maven, dari baris perintah, atau di editor seperti IntelliJ, Eclipse, atau Visual Studio Code.

Panduan ini menyediakan konsep dan instruksi utama untuk pengembang Java menggunakan Azure App Service. Jika Anda belum pernah menggunakan Azure App Service, Anda harus membaca mulai cepat Java dahulu. Pertanyaan umum tentang menggunakan Azure App Service yang tidak spesifik untuk pengembangan Java dijawab dalam Tanya Jawab Umum Azure App Service.

Perlihatkan versi Java

Untuk memperlihatkan versi Java saat ini, jalankan perintah berikut di Azure Cloud Shell:

az webapp config show --name <app-name> --resource-group <resource-group-name> --query "[javaVersion, javaContainer, javaContainerVersion]"

Untuk memperlihatkan semua versi Java yang didukung, jalankan perintah berikut di Azure Cloud Shell:

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

Untuk memperlihatkan versi Java saat ini, jalankan perintah berikut di Azure Cloud Shell:

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

Untuk memperlihatkan semua versi Java yang didukung, jalankan perintah berikut di Azure Cloud Shell:

az webapp list-runtimes --os linux | grep "JAVA\|TOMCAT\|JBOSSEAP"

Untuk informasi selengkapnya tentang dukungan versi, lihat Kebijakan dukungan runtime bahasa app service.

Menyebarkan aplikasi Anda

Build Tools

Maven

Dengan Maven Plugin untuk Azure Web Apps, Anda dapat menyiapkan proyek Maven Java untuk Azure Web App dengan mudah dengan satu perintah di akar proyek Anda:

mvn com.microsoft.azure:azure-webapp-maven-plugin:2.11.0:config

Perintah ini menambahkan azure-webapp-maven-plugin plugin dan konfigurasi terkait dengan meminta Anda untuk memilih Azure Web App yang sudah ada atau membuat yang baru. Kemudian Anda dapat menyebarkan aplikasi Java Anda ke Azure menggunakan perintah berikut:

mvn package azure-webapp:deploy

Berikut adalah konfigurasi sampel di pom.xml:

<plugin> 
  <groupId>com.microsoft.azure</groupId>  
  <artifactId>azure-webapp-maven-plugin</artifactId>  
  <version>2.11.0</version>  
  <configuration>
    <subscriptionId>111111-11111-11111-1111111</subscriptionId>
    <resourceGroup>spring-boot-xxxxxxxxxx-rg</resourceGroup>
    <appName>spring-boot-xxxxxxxxxx</appName>
    <pricingTier>B2</pricingTier>
    <region>westus</region>
    <runtime>
      <os>Linux</os>      
      <webContainer>Java SE</webContainer>
      <javaVersion>Java 11</javaVersion>
    </runtime>
    <deployment>
      <resources>
        <resource>
          <type>jar</type>
          <directory>${project.basedir}/target</directory>
          <includes>
            <include>*.jar</include>
          </includes>
        </resource>
      </resources>
    </deployment>
  </configuration>
</plugin> 

Gradle

  1. Siapkan Plugin Gradle untuk Azure Web Apps dengan menambahkan plugin ke :build.gradle

    plugins {
      id "com.microsoft.azure.azurewebapp" version "1.7.1"
    }
    
  2. Konfigurasikan detail aplikasi web Anda. Sumber daya Azure yang sesuai dibuat jika tidak ada. Berikut adalah contoh konfigurasi, untuk detailnya, lihat dokumen ini.

    azurewebapp {
        subscription = '<your subscription id>'
        resourceGroup = '<your resource group>'
        appName = '<your app name>'
        pricingTier = '<price tier like 'P1v2'>'
        region = '<region like 'westus'>'
        runtime {
          os = 'Linux'
          webContainer = 'Tomcat 9.0' // or 'Java SE' if you want to run an executable jar
          javaVersion = 'Java 8'
        }
        appSettings {
            <key> = <value>
        }
        auth {
            type = 'azure_cli' // support azure_cli, oauth2, device_code and service_principal
        }
    }
    
  3. Sebarkan dengan satu perintah.

    gradle azureWebAppDeploy
    

IDE

Azure memberikan pengalaman pengembangan Java App Service yang mulus di IDE Java yang populer, termasuk:

API Kudu

Java SE

Untuk menyebarkan file .jar ke Java SE, gunakan titik akhir /api/publish/ dari situs Kudu. Untuk informasi selengkapnya tentang API ini, lihat dokumentasi ini.

Catatan

Aplikasi .jar Anda harus diberi nama app.jar untuk Azure App Service agar mengidentifikasi dan menjalankan aplikasi Anda. Plugin Maven melakukan ini untuk Anda secara otomatis selama penyebaran. Jika tidak ingin mengganti nama JAR menjadi app.jar, Anda dapat mengunggah skrip shell dengan perintah untuk menjalankan aplikasi .jar Anda. Tempel jalur absolut ke skrip ini di kotek teks File Startup di bagian Konfigurasi Portal. Skrip startup tidak berjalan dari direktori ke tempatnya ditempatkan. Oleh karena itu, selalu gunakan jalur absolut untuk mereferensikan file dalam skrip startup Anda (misalnya: java -jar /home/myapp/myapp.jar ).

Tomcat

Untuk menyebarkan file .war ke Tomcat, gunakan titik akhir /api/wardeploy/ untuk MEMPOSTING file arsip Anda. Untuk informasi selengkapnya tentang API ini, lihat dokumentasi ini.

JBoss EAP

Untuk menyebarkan file .war ke JBoss, gunakan titik akhir /api/wardeploy/ untuk MEMPOSTING file arsip Anda. Untuk informasi selengkapnya tentang API ini, lihat dokumentasi ini.

Untuk menyebarkan file .ear, gunakan FTP. Aplikasi .ear Anda disebarkan ke akar konteks yang ditentukan dalam konfigurasi aplikasi Anda. Misalnya, jika akar konteks aplikasi Anda adalah <context-root>myapp</context-root>, maka Anda dapat menelusuri situs di /myapp jalur: http://my-app-name.azurewebsites.net/myapp. Jika Anda ingin aplikasi web Anda dilayani di jalur akar, pastikan aplikasi Anda mengatur akar konteks ke jalur akar: <context-root>/</context-root>. Untuk informasi selengkapnya, lihat Mengatur akar konteks aplikasi web.

Jangan sebarkan .war atau .jar menggunakan FTP. Alat FTP dirancang untuk mengunggah skrip startup, dependensi, atau file runtime lainnya. Ini bukan pilihan optimal untuk menyebarkan aplikasi web.

Aplikasi pengelogan dan penelusuran kesalahan

Laporan performa, visualisasi lalu lintas, dan pemeriksaan kesehatan tersedia untuk setiap aplikasi melalui portal Azure. Untuk mengetahui informasi selengkapnya, lihat Ringkasan diagnostik Azure App Service.

Mengalirkan log diagnostik

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.

Untuk informasi selengkapnya, lihat Streaming log di Cloud Shell.

Akses konsol SSH

Untuk membuka sesi SSH langsung dengan kontainer Anda, aplikasi Anda harus berjalan.

Tempelkan URL berikut ke browser Anda dan ganti <app-name> dengan nama aplikasi Anda:

https://<app-name>.scm.azurewebsites.net/webssh/host

Jika belum diautentikasi, Anda harus mengautentikasi dengan langganan Azure untuk menyambungkan. Setelah diautentikasi, Anda akan melihat shell dalam browser, tempat Anda dapat menjalankan perintah di dalam kontainer Anda.

Koneksi SSH

Catatan

Setiap perubahan yang Anda buat di luar direktori /home disimpan dalam kontainer itu sendiri dan hanya ada saat aplikasi dihidupkan ulang.

Untuk membuka sesi SSH jarak jauh dari komputer lokal Anda, lihat Membuka sesi SSH dari shell jarak jauh.

Alat pemecahan masalah

Gambar Java bawaan didasarkan pada sistem operasi Linux Alpine. Gunakan pengelola paket apk untuk memasang alat atau perintah pemecahan masalah.

Java Profiler

Semua runtime Java di Azure App Service dilengkapi dengan JDK Flight Recorder untuk membuat profil beban kerja Java. Anda dapat menggunakannya untuk merekam JVM, sistem, dan peristiwa aplikasi dan memecahkan masalah dalam aplikasi Anda.

Untuk mempelajari selengkapnya tentang Java Profiler, kunjungi dokumentasi Azure Application Insights.

Perekam Aktivitas

Semua runtime Java di App Service dilengkapi dengan Java Flight Recorder. Anda dapat menggunakannya untuk merekam JVM, sistem, dan peristiwa aplikasi dan memecahkan masalah di aplikasi Java Anda.

Rekaman dengan Waktu

Untuk mengambil rekaman berwakti, Anda memerlukan PID (ID Proses) aplikasi Java. Untuk menemukan PID, buka browser ke situs SCM aplikasi web Anda di https://<your-site-name>.scm.azurewebsites.net/ProcessExplorer/. Halaman ini memperlihatkan proses yang sedang berjalan di aplikasi web Anda. Temukan proses bernama “java” dalam tabel dan salin PID (ID Proses) yang sesuai.

Selanjutnya, buka Konsol Debug di bar alat atas situs SCM dan jalankan perintah berikut. Ganti <pid> dengan ID proses yang Anda salin sebelumnya. Perintah ini memulai rekaman profiler 30 detik dari aplikasi Java Anda dan menghasilkan file bernama timed_recording_example.jfr di C:\home direktori.

jcmd <pid> JFR.start name=TimedRecording settings=profile duration=30s filename="C:\home\timed_recording_example.JFR"

SSH ke dalam Azure App Service Anda dan jalankan perintah jcmd untuk melihat daftar semua proses Java yang berjalan. Selain jcmd sendiri, Anda akan melihat aplikasi Java Anda berjalan dengan nomor ID proses (pid).

078990bbcd11:/home# jcmd
Picked up JAVA_TOOL_OPTIONS: -Djava.net.preferIPv4Stack=true
147 sun.tools.jcmd.JCmd
116 /home/site/wwwroot/app.jar

Jalankan perintah berikut untuk memulai rekaman 30 detik JVM. Ini memprofilkan JVM dan membuat file JFR bernama jfr_example.jfr di direktori beranda. (Ganti 116 dengan pid aplikasi Java Anda.)

jcmd 116 JFR.start name=MyRecording settings=profile duration=30s filename="/home/jfr_example.jfr"

Selama interval 30 detik, Anda dapat memvalidasi rekaman yang sedang berlangsung dengan menjalankan jcmd 116 JFR.check. Perintah menunjukkan semua rekaman untuk proses Java yang diberikan.

Perekaman Berkelanjutan

Anda dapat menggunakan Java Flight Recorder untuk terus memprofilkan aplikasi Java Anda dengan dampak minimal pada performa runtime. Untuk melakukannya, jalankan perintah Azure CLI berikut untuk membuat Pengaturan Aplikasi dengan nama JAVA_OPTS dengan konfigurasi yang diperlukan. Konten Pengaturan Aplikasi JAVA_OPTS diteruskan ke perintah java saat aplikasi Anda dimulai.

az webapp config appsettings set -g <your_resource_group> -n <your_app_name> --settings JAVA_OPTS=-XX:StartFlightRecording=disk=true,name=continuous_recording,dumponexit=true,maxsize=1024m,maxage=1d

Setelah perekaman dimulai, Anda dapat membuang data rekaman saat ini kapan saja menggunakan JFR.dump perintah .

jcmd <pid> JFR.dump name=continuous_recording filename="/home/recording1.jfr"

Menganalisis file .jfr

Gunakan FTPS untuk mengunduh file JFR Anda ke komputer lokal. Untuk menganalisis file JFR, unduh dan instal Java Mission Control. Untuk petunjuk tentang Java Mission Control, lihat dokumentasi JMC dan instruksi penginstalan.

Pengelogan Aplikasi

Aktifkan pengelogan aplikasi melalui portal Azure atau Azure CLI untuk mengonfigurasi Azure App Service untuk menulis output konsol standar aplikasi Anda dan aliran kesalahan konsol standar ke sistem file lokal atau Azure Blob Storage. Pengelogan ke instans sistem file App Service lokal dinonaktifkan 12 jam setelah dikonfigurasi. Jika Anda memerlukan retensi lebih lama, konfigurasikan aplikasi untuk menulis output ke kontainer penyimpanan Objek Besar Biner. Log aplikasi Java dan Tomcat Anda dapat ditemukan di direktori /home/LogFiles/Application/.

Aktifkan pengelogan aplikasi melalui portal Azure atau Azure CLI untuk mengonfigurasi Azure App Service untuk menulis output konsol standar aplikasi Anda dan aliran kesalahan konsol standar ke sistem file lokal atau Azure Blob Storage. Jika Anda memerlukan retensi lebih lama, konfigurasikan aplikasi untuk menulis output ke kontainer penyimpanan Objek Besar Biner. Log aplikasi Java dan Tomcat Anda dapat ditemukan di direktori /home/LogFiles/Application/.

Pengelogan Azure Blob Storage untuk aplikasi berbasis Linux hanya dapat dikonfigurasi menggunakan Azure Monitor.

Jika aplikasi Anda menggunakan Logback atau Log4j untuk menelusuri, Anda dapat meneruskan jejak ini untuk ditinjau ke Azure Application Insights menggunakan instruksi konfigurasi kerangka kerja pengelogan di Jelajahi log jejak Java di Application Insights.

Catatan

Karena kerentanan yang diketahui CVE-2021-44228, pastikan untuk menggunakan Log4j versi 2.16 atau yang lebih baru.

Kustomisasi dan penyetelan

Azure App Service mendukung penyetelan dan kustomisasi kotak melalui portal Microsoft Azure dan CLI. Tinjau artikel berikut untuk konfigurasi aplikasi web non-Java tertentu:

Salin Konten Aplikasi Secara Lokal

Atur pengaturan JAVA_COPY_ALL aplikasi ke true untuk menyalin konten aplikasi Anda ke pekerja lokal dari sistem file bersama. Pengaturan ini membantu mengatasi masalah penguncian file.

Mengatur opsi runtime Java

Untuk mengatur memori yang dialokasikan atau opsi runtime JVM lainnya, buat pengaturan aplikasi yang diberi nama JAVA_OPTS dengan opsi tersebut. Azure App Service melewati pengaturan ini sebagai variabel lingkungan ke runtime Java saat dimulai.

Di portal Microsoft Azure, di bawah Pengaturan Aplikasi untuk aplikasi web, buat pengaturan aplikasi baru dengan nama JAVA_OPTS untuk Java SE atau CATALINA_OPTS untuk Tomcat yang mencakup pengaturan tambahan, seperti -Xms512m -Xmx1204m.

Untuk mengonfigurasi pengaturan aplikasi dari plugin Maven, tambah tag pengaturan/nilai di bagian plugin Azure. Contoh berikut menetapkan ukuran heap Java minimum dan maksimum tertentu:

<appSettings>
    <property>
        <name>JAVA_OPTS</name>
        <value>-Xms1024m -Xmx1024m</value>
    </property>
</appSettings>

Catatan

Anda tidak perlu membuat file web.config saat menggunakan Tomcat di Windows App Service.

Pengembang yang menjalankan satu aplikasi dengan satu slot penyebaran dalam paket Azure App Service mereka dapat menggunakan opsi berikut:

  • Instans B1 dan S1: -Xms1024m -Xmx1024m
  • Instans B2 dan S2: -Xms3072m -Xmx3072m
  • Instans B3 dan S3: -Xms6144m -Xmx6144m
  • Instans P1v2: -Xms3072m -Xmx3072m
  • Instans P2v2: -Xms6144m -Xmx6144m
  • Instans P3v2: -Xms12800m -Xmx12800m
  • Instans P1v3: -Xms6656m -Xmx6656m
  • Instans P2v3: -Xms14848m -Xmx14848m
  • Instans P3v3: -Xms30720m -Xmx30720m
  • Instans I1: -Xms3072m -Xmx3072m
  • Instans I2: -Xms6144m -Xmx6144m
  • Instans I3: -Xms12800m -Xmx12800m
  • Instans I1v2: -Xms6656m -Xmx6656m
  • Instans I2v2: -Xms14848m -Xmx14848m
  • Instans I3v2: -Xms30720m -Xmx30720m

Saat menyetel pengaturan heap aplikasi, tinjau detail paket Azure App Service Anda dan perhitungkan beberapa aplikasi dan slot penyebaran perlu menemukan alokasi memori yang optimal.

Mengaktifkan soket web

Aktifkan dukungan untuk soket web di portal Azure di Pengaturan aplikasi untuk aplikasi. Anda perlu menghidupkan ulang aplikasi agar pengaturan diterapkan.

Aktifkan dukungan soket web menggunakan Azure CLI dengan perintah berikut:

az webapp config set --name <app-name> --resource-group <resource-group-name> --web-sockets-enabled true

Kemudian, mulai ulang aplikasi Anda:

az webapp stop --name <app-name> --resource-group <resource-group-name>
az webapp start --name <app-name> --resource-group <resource-group-name>

Mengatur pengodean karakter default

Di portal Azure, di bawah Pengaturan Aplikasi untuk aplikasi web, buat pengaturan aplikasi baru yang diberi nama JAVA_OPTS dengan nilai -Dfile.encoding=UTF-8.

Atau, Anda dapat mengonfigurasi pengaturan aplikasi menggunakan plugin Maven Azure App Service. Tambah nama pengaturan dan tag nilai dalam konfigurasi plugin:

<appSettings>
    <property>
        <name>JAVA_OPTS</name>
        <value>-Dfile.encoding=UTF-8</value>
    </property>
</appSettings>

File JSP Sebelum Kompilasi

Untuk meningkatkan performa aplikasi Tomcat, Anda dapat mengompilasi file JSP sebelum menyebarkan ke Azure App Service. Anda dapat menggunakan plugin Maven yang disediakan oleh Apache Sling, atau menggunakan file bangun Ant ini.

Aplikasi yang aman

Aplikasi Java yang berjalan di Azure App Service memiliki serangkaian praktik terbaik keamanan yang sama dengan aplikasi lainnya.

Mengautentikasi pengguna (Easy Auth)

Siapkan autentikasi aplikasi di portal Azure dengan opsi Autentikasi dan Otorisasi. Dari sana, Anda dapat mengaktifkan autentikasi menggunakan ID Microsoft Entra atau rincian masuk sosial seperti Facebook, Google, atau GitHub. Konfigurasi portal Azure hanya berfungsi saat mengonfigurasi penyedia autentikasi tunggal. Untuk informasi selengkapnya, lihat Mengonfigurasi aplikasi App Service Anda untuk menggunakan masuk Microsoft Entra dan artikel terkait untuk penyedia identitas lainnya. Jika Anda perlu mengaktifkan beberapa penyedia masuk, ikuti instruksi di Menyesuaikan rincian masuk dan keluar.

Java SE

Pengembang Spring Boot dapat menggunakan pemula Microsoft Entra Spring Boot untuk mengamankan aplikasi menggunakan anotasi dan API Spring Security yang sudah dikenal. Pastikan untuk menambah ukuran header maksimum dalam file application.properties Anda. Kami menyarankan nilai 16384.

Tomcat

Aplikasi Tomcat Anda dapat mengakses klaim pengguna langsung dari servlet dengan mentransmisikan objek Utama ke objek Peta. Objek Map memetakan setiap jenis klaim ke kumpulan klaim untuk jenis tersebut. Dalam contoh kode berikut, request adalah instans .HttpServletRequest

Map<String, Collection<String>> map = (Map<String, Collection<String>>) request.getUserPrincipal();

Sekarang, Anda dapat memeriksa objek Map untuk klaim tertentu. Misalnya, cuplikan kode berikut berulang melalui semua jenis klaim dan mencetak konten setiap kumpulan.

for (Object key : map.keySet()) {
        Object value = map.get(key);
        if (value != null && value instanceof Collection {
            Collection claims = (Collection) value;
            for (Object claim : claims) {
                System.out.println(claims);
            }
        }
    }

Untuk mengeluarkan pengguna, gunakan jalur /.auth/ext/logout. Untuk melakukan tindakan lain, lihat dokumentasi tentang Kustomisasi masuk dan keluar. Ada juga dokumentasi resmi tentang antarmuka Tomcat HttpServletRequest dan metodenya. Metode servlet berikut juga dihidrasi berdasarkan konfigurasi Azure App Service Anda:

public boolean isSecure()
public String getRemoteAddr()
public String getRemoteHost()
public String getScheme()
public int getServerPort()

Untuk menonaktifkan fitur ini, buat Pengaturan Aplikasi yang diberi nama WEBSITE_AUTH_SKIP_PRINCIPAL dengan nilai 1. Untuk menonaktifkan semua filter servlet yang ditambahkan oleh Azure App Service, buat pengaturan yang diberi nama WEBSITE_SKIP_FILTERS dengan nilai 1.

Mengonfigurasi TLS/SSL

Untuk mengunggah sertifikat TLS/SSL yang ada dan mengikatnya ke nama domain aplikasi Anda, ikuti instruksi di Mengamankan nama DNS kustom dengan pengikatan TLS/SSL di Azure App Service. Anda juga dapat mengonfigurasi aplikasi untuk memberlakukan TLS/SSL.

Gunakan Referensi KeyVault

Azure KeyVault menyediakan manajemen rahasia terpusat dengan kebijakan akses dan riwayat audit. Anda dapat menyimpan rahasia (seperti kata sandi atau string koneksi) di KeyVault dan mengakses rahasia ini di aplikasi Anda melalui variabel lingkungan.

Pertama, ikuti instruksi untuk memberikan akses aplikasi Anda ke brankas kunci dan membuat referensi KeyVault ke rahasia Anda di Pengaturan Aplikasi. Anda dapat memvalidasi bahwa referensi menyelesaikan rahasia dengan mencetak variabel lingkungan saat mengakses terminal Azure App Service dari jarak jauh.

Untuk menyuntikkan rahasia ini dalam file konfigurasi Spring atau Tomcat Anda, gunakan sintaks injeksi variabel lingkungan (${MY_ENV_VAR}). Untuk file konfigurasi Spring, lihat dokumentasi ini tentang konfigurasi eksternal.

Menggunakan Java Key Store

Secara default, sertifikat publik atau privat apa pun yang diunggah ke App Service Linux dimuat ke dalam Java Key Store masing-masing saat kontainer dimulai. Setelah mengunggah sertifikat, Anda harus memulai ulang App Service agar dimuat ke Java Key Store. Sertifikat publik dimuat ke dalam Penyimpanan Kunci di $JRE_HOME/lib/security/cacerts, dan sertifikat privat disimpan di $JRE_HOME/lib/security/client.jks.

Konfigurasi lainnya mungkin diperlukan untuk mengenkripsi koneksi JDBC Anda dengan sertifikat di Java Key Store. Lihat dokumentasi untuk driver JDBC pilihan Anda.

Menginisialisasi Penyimpanan Kunci Java

Untuk menginisialisasi objek import java.security.KeyStore, muat file keystore dengan kata sandi. Kata sandi default untuk kedua penyimpanan kunci adalah changeit.

KeyStore keyStore = KeyStore.getInstance("jks");
keyStore.load(
    new FileInputStream(System.getenv("JRE_HOME")+"/lib/security/cacerts"),
    "changeit".toCharArray());

KeyStore keyStore = KeyStore.getInstance("pkcs12");
keyStore.load(
    new FileInputStream(System.getenv("JRE_HOME")+"/lib/security/client.jks"),
    "changeit".toCharArray());

Memuat penyimpanan kunci secara manual

Anda dapat memuat sertifikat secara manual ke penyimpanan kunci. Buat pengaturan aplikasi, SKIP_JAVA_KEYSTORE_LOAD, dengan nilai 1 untuk menonaktifkan Azure App Service agar tidak memuat sertifikat ke penyimpanan kunci secara otomatis. Semua sertifikat publik yang diunggah ke Azure App Service melalui portal Azure disimpan di bawah /var/ssl/certs/. Sertifikat privat disimpan di bawah /var/ssl/private/.

Anda dapat berinteraksi atau melakukan debug Alat Kunci Java dengan membuka koneksi SSH ke Azure App Service Anda dan menjalankan perintah keytool. Lihat dokumentasi Alat Kunci untuk daftar perintah. Untuk informasi selengkapnya tentang KeyStore API, lihat dokumentasi resmi.

Mengonfigurasi platform APM

Bagian ini menunjukkan cara menghubungkan aplikasi Java yang disebarkan di Azure App Service dengan platform Azure Monitor Application Insights, NewRelic, dan AppDynamics application performance monitoring (APM).

Mengonfigurasi Application Insights

Azure Monitor Application Insights adalah layanan pemantauan aplikasi asli cloud yang memungkinkan pelanggan mengamati kegagalan, penyempitan, dan pola penggunaan untuk meningkatkan performa aplikasi dan mengurangi waktu rata-rata untuk resolusi (MTTR). Dengan beberapa klik atau perintah CLI, Anda dapat mengaktifkan pemantauan untuk aplikasi Node.js atau Java, mengotomatiskan log, metrik, dan jejak terdistribusi, menghilangkan kebutuhan untuk menyertakan SDK di aplikasi Anda. Untuk informasi selengkapnya tentang pengaturan aplikasi yang tersedia untuk mengonfigurasi agen, lihat dokumentasi Application Insights.

Portal Azure

Untuk mengaktifkan Application Insights dari portal Microsoft Azure, buka Application Insights di menu sebelah kiri dan pilih Aktifkan Application Insights. Secara default, sumber daya wawasan aplikasi baru dengan nama yang sama dengan aplikasi web Anda digunakan. Anda dapat memilih untuk menggunakan sumber daya insight aplikasi yang ada, atau mengubah nama. Pilih Terapkan di bagian bawah.

Azure CLI

Untuk mengaktifkan melalui Azure CLI, Anda perlu membuat sumber daya Application Insights dan mengatur beberapa pengaturan aplikasi di portal Azure untuk menyambungkan Application Insights ke aplikasi web Anda.

  1. Mengaktifkan ekstensi Application Insights

    az extension add -n application-insights
    
  2. Buat sumber daya Application Insights menggunakan perintah CLI berikut. Ganti tempat penampung dengan nama dan grup sumber daya yang Anda inginkan.

    az monitor app-insights component create --app <resource-name> -g <resource-group> --location westus2  --kind web --application-type web
    

    Perhatikan nilai untuk connectionString dan instrumentationKey, Anda akan memerlukan nilai-nilai ini di langkah berikutnya.

    Untuk mengambil daftar lokasi lain, jalankan az account list-locations.

  1. Atur kunci instrumentasi, string koneksi, dan versi agen pemantauan sebagai pengaturan aplikasi di aplikasi web. Ganti <instrumentationKey> dan <connectionString> dengan nilai dari langkah sebelumnya.

    az webapp config appsettings set -n <webapp-name> -g <resource-group> --settings "APPINSIGHTS_INSTRUMENTATIONKEY=<instrumentationKey>" "APPLICATIONINSIGHTS_CONNECTION_STRING=<connectionString>" "ApplicationInsightsAgent_EXTENSION_VERSION=~3" "XDT_MicrosoftApplicationInsights_Mode=default" "XDT_MicrosoftApplicationInsights_Java=1"
    
  1. Atur kunci instrumentasi, string koneksi, dan versi agen pemantauan sebagai pengaturan aplikasi di aplikasi web. Ganti <instrumentationKey> dan <connectionString> dengan nilai dari langkah sebelumnya.

    az webapp config appsettings set -n <webapp-name> -g <resource-group> --settings "APPINSIGHTS_INSTRUMENTATIONKEY=<instrumentationKey>" "APPLICATIONINSIGHTS_CONNECTION_STRING=<connectionString>" "ApplicationInsightsAgent_EXTENSION_VERSION=~3" "XDT_MicrosoftApplicationInsights_Mode=default"
    

Mengonfigurasi New Relic

  1. Membuat akun NewRelic di NewRelic.com

  2. Unduh agen Java dari NewRelic. Ini memiliki nama file yang mirip dengan newrelic-java-x.x.x.zip.

  3. Salin kunci lisensi Anda, Anda memerlukannya untuk mengonfigurasi agen nanti.

  4. SSH ke dalam instans Azure App Service Anda dan buat direktori baru /home/site/wwwroot/apm.

  5. Unggah file agen NewRelic Java yang belum dikemas ke direktori di bawah /home/site/wwwroot/apm. File untuk agen Anda harus di /home/site/wwwroot/apm/newrelic.

  6. Ubah file YAML di /home/site/wwwroot/apm/newrelic/newrelic.yml dan ganti nilai lisensi tempat penampung dengan kunci lisensi Anda sendiri.

  7. Di portal Azure, telusuri aplikasi Anda di Azure App Service dan buat Pengaturan Aplikasi baru.

    • Untuk aplikasi Java SE, buat variabel lingkungan yang diberi nama JAVA_OPTS dengan nilai -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.
    • Untuk Tomcat, buat variabel lingkungan yang diberi nama CATALINA_OPTS dengan nilai -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.
  1. Membuat akun NewRelic di NewRelic.com

  2. Unduh agen Java dari NewRelic. Ini memiliki nama file yang mirip dengan newrelic-java-x.x.x.zip.

  3. Salin kunci lisensi Anda, Anda akan memerlukannya untuk mengonfigurasi agen nanti.

  4. SSH ke dalam instans Azure App Service Anda dan buat direktori baru /home/site/wwwroot/apm.

  5. Unggah file agen NewRelic Java yang belum dikemas ke direktori di bawah /home/site/wwwroot/apm. File untuk agen Anda harus di /home/site/wwwroot/apm/newrelic.

  6. Ubah file YAML di /home/site/wwwroot/apm/newrelic/newrelic.yml dan ganti nilai lisensi tempat penampung dengan kunci lisensi Anda sendiri.

  7. Di portal Azure, telusuri aplikasi Anda di Azure App Service dan buat Pengaturan Aplikasi baru.

    • Untuk aplikasi Java SE, buat variabel lingkungan yang diberi nama JAVA_OPTS dengan nilai -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.
    • Untuk Tomcat, buat variabel lingkungan yang diberi nama CATALINA_OPTS dengan nilai -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.

Jika Anda sudah memiliki variabel lingkungan untuk JAVA_OPTS atau CATALINA_OPTS, tambahkan opsi -javaagent:/... ke akhir nilai saat ini.

Mengonfigurasi AppDynamics

  1. Membuat akun AppDynamics di AppDynamics.com

  2. Unduh agen Java dari situs web AppDynamics. Nama file mirip dengan AppServerAgent-x.x.x.xxxxx.zip

  3. Gunakan konsol Kudu untuk membuat direktori baru /home/site/wwwroot/apm.

  4. Unggah file agen Java ke direktori di bawah /home/site/wwwroot/apm. File untuk agen Anda harus berada di /home/site/wwwroot/apm/appdynamics.

  5. Di portal Azure, telusuri aplikasi Anda di Azure App Service dan buat Pengaturan Aplikasi baru.

    • Untuk aplikasi Java SE, buat variabel lingkungan yang diberi nama JAVA_OPTS dengan nilai -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> di mana <app-name> adalah nama Azure App Service Anda.
    • Untuk aplikasi Tomcat, buat variabel lingkungan yang diberi nama CATALINA_OPTS dengan nilai -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> di mana <app-name> adalah nama Azure App Service Anda.
  1. Membuat akun AppDynamics di AppDynamics.com

  2. Unduh agen Java dari situs web AppDynamics. Nama file mirip dengan AppServerAgent-x.x.x.xxxxx.zip

  3. SSH ke dalam instans Azure App Service Anda dan buat direktori baru /home/site/wwwroot/apm.

  4. Unggah file agen Java ke direktori di bawah /home/site/wwwroot/apm. File untuk agen Anda harus berada di /home/site/wwwroot/apm/appdynamics.

  5. Di portal Azure, telusuri aplikasi Anda di Azure App Service dan buat Pengaturan Aplikasi baru.

    • Untuk aplikasi Java SE, buat variabel lingkungan yang diberi nama JAVA_OPTS dengan nilai -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> di mana <app-name> adalah nama Azure App Service Anda.
    • Untuk aplikasi Tomcat, buat variabel lingkungan yang diberi nama CATALINA_OPTS dengan nilai -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> di mana <app-name> adalah nama Azure App Service Anda.

Catatan

Jika Anda sudah memiliki variabel lingkungan untuk JAVA_OPTS atau CATALINA_OPTS, tambahkan opsi -javaagent:/... ke akhir nilai saat ini.

Mengonfigurasi sumber data

Java SE

Untuk terhubung ke sumber data di aplikasi Spring Boot, kami menyarankan untuk membuat string koneksi dan menyuntikkannya ke file application.properties Anda.

  1. Di bagian “Konfigurasi” di halaman Azure App Service, atur nama untuk string, tempel string koneksi JDBC Anda ke bidang nilai, dan atur jenisnya ke “Kustom”. Anda dapat secara opsional mengatur string koneksi ini sebagai pengaturan slot.

    String koneksi ini dapat diakses oleh aplikasi kami sebagai variabel lingkungan yang diberi nama CUSTOMCONNSTR_<your-string-name>. Contohnya,CUSTOMCONNSTR_exampledb.

  2. Dalam file application.properties Anda, referensi string koneksi ini dengan nama variabel lingkungan. Misalnya, kami akan menggunakan berikut.

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

Untuk informasi selengkapnya, lihat dokumentasi Spring Boot tentang akses data dan konfigurasi eksternal.

Tomcat

Instruksi ini berlaku untuk semua koneksi database. Anda perlu mengisi tempat penampung dengan nama kelas driver database dan file JAR yang Anda pilih. Disediakan tabel dengan nama kelas dan unduhan driver untuk database umum.

Database Nama Kelas Driver JDBC Driver
PostgreSQL org.postgresql.Driver Unduh
MySQL com.mysql.jdbc.Driver Unduh (Pilih “Platform Independen”)
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Unduh

Untuk mengonfigurasi Tomcat menggunakan Java Database Connectivity (JDBC) atau Java Persistence API (JPA), pertama, kustomisasi variabel lingkungan CATALINA_OPTS yang dibaca oleh Tomcat saat dalam keadaan start-up. Tetapkan nilai-nilai ini melalui pengaturan aplikasi di plugin Maven Azure App Service:

<appSettings>
    <property>
        <name>CATALINA_OPTS</name>
        <value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
    </property>
</appSettings>

Atau atur variabel lingkungan di halaman Pengaturan Aplikasi>Konfigurasi di portal Azure.

Selanjutnya, tentukan apakah sumber data harus tersedia untuk satu aplikasi atau untuk semua aplikasi yang berjalan pada servlet Tomcat.

Sumber data tingkat aplikasi

  1. Buat file context.xml di direktori META-INF/ proyek Anda. Buat direktori META-INF/ jika tidak ada.

  2. Di context.xml, tambahkan elemen Context untuk menautkan sumber data ke alamat JNDI. Ganti tempat penampung driverClassName dengan nama kelas driver Anda dari tabel di atas.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. Perbarui aplikasi web.xml untuk menggunakan sumber data di aplikasi Anda.

    <resource-env-ref>
        <resource-env-ref-name>jdbc/dbconnection</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
    

Sumber daya tingkat server bersama

Instalasi Tomcat di Azure App Service di Windows ada di ruang bersama pada Paket Azure App Service. Anda tidak dapat secara langsung memodifikasi penginstalan Tomcat untuk konfigurasi di seluruh server. Untuk membuat perubahan konfigurasi tingkat server pada instalasi Tomcat, Anda harus menyalin Tomcat ke folder lokal, di mana Anda dapat memodifikasi konfigurasi Tomcat.

Mengautomasi pembuatan Tomcat kustom pada saat mulai aplikasi

Anda dapat menggunakan skrip startup untuk melakukan tindakan sebelum aplikasi web dimulai. Skrip startup untuk mengustomisasi Tomcat perlu menyelesaikan langkah-langkah berikut:

  1. Periksa apakah Tomcat sudah disalin dan dikonfigurasi secara lokal. Jika sudah, skrip startup bisa berakhir di sini.
  2. Salin Tomcat secara lokal.
  3. Membuat perubahan konfigurasi yang diperlukan.
  4. Menunjukkan bahwa konfigurasi berhasil diselesaikan.

Untuk aplikasi Windows, buat file bernama startup.cmd atau startup.ps1 di wwwroot direktori. File ini berjalan secara otomatis sebelum server Tomcat dimulai.

Berikut adalah skrip PowerShell yang menyelesaikan langkah-langkah ini:

    # Check for marker file indicating that config has already been done
    if(Test-Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker"){
        return 0
    }

    # Delete previous Tomcat directory if it exists
    # In case previous config isn't completed or a new config should be forcefully installed
    if(Test-Path "$Env:LOCAL_EXPANDED\tomcat"){
        Remove-Item "$Env:LOCAL_EXPANDED\tomcat" --recurse
    }

    # Copy Tomcat to local
    # Using the environment variable $AZURE_TOMCAT90_HOME uses the 'default' version of Tomcat
    Copy-Item -Path "$Env:AZURE_TOMCAT90_HOME\*" -Destination "$Env:LOCAL_EXPANDED\tomcat" -Recurse

    # Perform the required customization of Tomcat
    {... customization ...}

    # Mark that the operation was a success
    New-Item -Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker" -ItemType File
Transformasi

Kasus penggunaan umum untuk mengustomisasi versi Tomcat adalah memodifikasi file konfigurasi Tomcat server.xml, context.xml, atau web.xml. Azure App Service telah memodifikasi file-file ini untuk menyediakan fitur platform. Untuk terus menggunakan fitur-fitur ini, penting untuk mempertahankan konten file-file ini ketika Anda membuat perubahan. Untuk mencapai hal ini, kami sarankan Anda menggunakan transformasi XSL (XSLT). Gunakan transformasi XSL untuk membuat perubahan pada file XML sambil mempertahankan konten asli file.

Contoh file XSLT

Transformasi contoh ini menambahkan simpul konektor baru ke server.xml. Perhatikan Transformasi Identitas, yang mempertahankan konten asli file.

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <!-- Identity transform: this ensures that the original contents of the file are included in the new file -->
    <!-- Ensure that your transform files include this block -->
    <xsl:template match="@* | node()" name="Copy">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="@* | node()" mode="insertConnector">
      <xsl:call-template name="Copy" />
    </xsl:template>

    <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and
                                   contains(., '&lt;Connector') and
                                   (contains(., 'scheme=&quot;https&quot;') or
                                    contains(., &quot;scheme='https'&quot;))]">
      <xsl:value-of select="." disable-output-escaping="yes" />
    </xsl:template>

    <xsl:template match="Service[not(Connector[@scheme = 'https'] or
                                     comment()[contains(., '&lt;Connector') and
                                               (contains(., 'scheme=&quot;https&quot;') or
                                                contains(., &quot;scheme='https'&quot;))]
                                    )]
                        ">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()" mode="insertConnector" />
      </xsl:copy>
    </xsl:template>

    <!-- Add the new connector after the last existing Connnector if there's one -->
    <xsl:template match="Connector[last()]" mode="insertConnector">
      <xsl:call-template name="Copy" />

      <xsl:call-template name="AddConnector" />
    </xsl:template>

    <!-- ... or before the first Engine if there's no existing Connector -->
    <xsl:template match="Engine[1][not(preceding-sibling::Connector)]"
                  mode="insertConnector">
      <xsl:call-template name="AddConnector" />

      <xsl:call-template name="Copy" />
    </xsl:template>

    <xsl:template name="AddConnector">
      <!-- Add new line -->
      <xsl:text>&#xa;</xsl:text>
      <!-- This is the new connector -->
      <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
                 maxThreads="150" scheme="https" secure="true" 
                 keystoreFile="${{user.home}}/.keystore" keystorePass="changeit"
                 clientAuth="false" sslProtocol="TLS" />
    </xsl:template>

    </xsl:stylesheet>
Fungsi untuk transformasi XSL

PowerShell memiliki alat bawaan untuk mengubah file XML dengan menggunakan transformasi XSL. Skrip berikut adalah fungsi contoh yang bisa Anda gunakan dalam startup.ps1 untuk melakukan transformasi:

    function TransformXML{
        param ($xml, $xsl, $output)

        if (-not $xml -or -not $xsl -or -not $output)
        {
            return 0
        }

        Try
        {
            $xslt_settings = New-Object System.Xml.Xsl.XsltSettings;
            $XmlUrlResolver = New-Object System.Xml.XmlUrlResolver;
            $xslt_settings.EnableScript = 1;

            $xslt = New-Object System.Xml.Xsl.XslCompiledTransform;
            $xslt.Load($xsl,$xslt_settings,$XmlUrlResolver);
            $xslt.Transform($xml, $output);

        }

        Catch
        {
            $ErrorMessage = $_.Exception.Message
            $FailedItem = $_.Exception.ItemName
            Write-Host  'Error'$ErrorMessage':'$FailedItem':' $_.Exception;
            return 0
        }
        return 1
    }
Pengaturan aplikasi

Platform ini juga perlu mengetahui di mana versi kustom Tomcat Anda telah dipasang. Anda dapat mengatur lokasi instalasi di pengaturan aplikasi CATALINA_BASE.

Anda bisa menggunakan Azure CLI untuk mengubah pengaturan ini:

    az webapp config appsettings set -g $MyResourceGroup -n $MyUniqueApp --settings CATALINA_BASE="%LOCAL_EXPANDED%\tomcat"

Atau, Anda dapat mengubah pengaturan secara manual di portal Azure:

  1. Buka Pengaturan>Konfigurasi>Pengaturan aplikasi.
  2. Pilih Pengaturan Aplikasi Baru.
  3. Gunakan nilai-nilai ini untuk membuat pengaturan:
    1. Nama: CATALINA_BASE
    2. Nilai: "%LOCAL_EXPANDED%\tomcat"
Contoh startup.ps1

Contoh skrip berikut menyalin Tomcat kustom ke folder lokal, melakukan transformasi XSL, dan menunjukkan bahwa transformasi berhasil:

    # Locations of xml and xsl files
    $target_xml="$Env:LOCAL_EXPANDED\tomcat\conf\server.xml"
    $target_xsl="$Env:HOME\site\server.xsl"

    # Define the transform function
    # Useful if transforming multiple files
    function TransformXML{
        param ($xml, $xsl, $output)

        if (-not $xml -or -not $xsl -or -not $output)
        {
            return 0
        }

        Try
        {
            $xslt_settings = New-Object System.Xml.Xsl.XsltSettings;
            $XmlUrlResolver = New-Object System.Xml.XmlUrlResolver;
            $xslt_settings.EnableScript = 1;

            $xslt = New-Object System.Xml.Xsl.XslCompiledTransform;
            $xslt.Load($xsl,$xslt_settings,$XmlUrlResolver);
            $xslt.Transform($xml, $output);
        }

        Catch
        {
            $ErrorMessage = $_.Exception.Message
            $FailedItem = $_.Exception.ItemName
            echo  'Error'$ErrorMessage':'$FailedItem':' $_.Exception;
            return 0
        }
        return 1
    }

    $success = TransformXML -xml $target_xml -xsl $target_xsl -output $target_xml

    # Check for marker file indicating that config has already been done
    if(Test-Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker"){
        return 0
    }

    # Delete previous Tomcat directory if it exists
    # In case previous config isn't completed or a new config should be forcefully installed
    if(Test-Path "$Env:LOCAL_EXPANDED\tomcat"){
        Remove-Item "$Env:LOCAL_EXPANDED\tomcat" --recurse
    }

    md -Path "$Env:LOCAL_EXPANDED\tomcat"

    # Copy Tomcat to local
    # Using the environment variable $AZURE_TOMCAT90_HOME uses the 'default' version of Tomcat
    Copy-Item -Path "$Env:AZURE_TOMCAT90_HOME\*" "$Env:LOCAL_EXPANDED\tomcat" -Recurse

    # Perform the required customization of Tomcat
    $success = TransformXML -xml $target_xml -xsl $target_xsl -output $target_xml

    # Mark that the operation was a success if successful
    if($success){
        New-Item -Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker" -ItemType File
    }

Menyelesaikan konfigurasi

Terakhir, Anda menempatkan driver JAR di classpath Tomcat dan memulai ulang App Service Anda. Pastikan bahwa file driver JDBC tersedia untuk classloader Tomcat dengan menempatkannya di direktori /home/site/lib . Di Cloud Shell, jalankan az webapp deploy --type=lib untuk setiap JAR driver:

az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --target-path <jar-name>.jar

Tomcat

Instruksi ini berlaku untuk semua koneksi database. Anda perlu mengisi tempat penampung dengan nama kelas driver database dan file JAR yang Anda pilih. Disediakan tabel dengan nama kelas dan unduhan driver untuk database umum.

Database Nama Kelas Driver JDBC Driver
PostgreSQL org.postgresql.Driver Unduh
MySQL com.mysql.jdbc.Driver Unduh (Pilih “Platform Independen”)
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Unduh

Untuk mengonfigurasi Tomcat menggunakan Java Database Connectivity (JDBC) atau Java Persistence API (JPA), pertama, kustomisasi variabel lingkungan CATALINA_OPTS yang dibaca oleh Tomcat saat dalam keadaan start-up. Tetapkan nilai-nilai ini melalui pengaturan aplikasi di plugin Maven Azure App Service:

<appSettings>
    <property>
        <name>CATALINA_OPTS</name>
        <value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
    </property>
</appSettings>

Atau atur variabel lingkungan di halaman Pengaturan Aplikasi>Konfigurasi di portal Azure.

Selanjutnya, tentukan apakah sumber data harus tersedia untuk satu aplikasi atau untuk semua aplikasi yang berjalan pada servlet Tomcat.

Sumber data tingkat aplikasi

  1. Buat file context.xml di direktori META-INF/ proyek Anda. Buat direktori META-INF/ jika tidak ada.

  2. Di context.xml, tambahkan elemen Context untuk menautkan sumber data ke alamat JNDI. Ganti tempat penampung driverClassName dengan nama kelas driver Anda dari tabel di atas.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. Perbarui aplikasi web.xml untuk menggunakan sumber data di aplikasi Anda.

    <resource-env-ref>
        <resource-env-ref-name>jdbc/dbconnection</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
    

Sumber daya tingkat server bersama

Menambahkan sumber data tingkat server bersama mengharuskan Anda mengedit server.xml Tomcat. Pertama, unggah skrip startup dan atur jalur ke skrip di Perintah Startup>Konfigurasi. Anda dapat mengunggah skrip startup menggunakan FTP.

Skrip startup Anda akan membuat transformasi xsl ke file server.xml dan menghasilkan file xml yang dihasilkan ke /usr/local/tomcat/conf/server.xml. Skrip startup harus memasang libxslt melalui apk. File xsl dan skrip startup Anda dapat diunggah melalui FTP. Di bawah adalah contoh skrip startup.

# Install libxslt. Also copy the transform file to /home/tomcat/conf/
apk add --update libxslt

# Usage: xsltproc --output output.xml style.xsl input.xml
xsltproc --output /home/tomcat/conf/server.xml /home/tomcat/conf/transform.xsl /usr/local/tomcat/conf/server.xml

Contoh file XSL berikut menambahkan simpul konektor baru ke server.xml Tomcat.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()" name="Copy">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()" mode="insertConnector">
    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and
                                 contains(., '&lt;Connector') and
                                 (contains(., 'scheme=&quot;https&quot;') or
                                  contains(., &quot;scheme='https'&quot;))]">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>

  <xsl:template match="Service[not(Connector[@scheme = 'https'] or
                                   comment()[contains(., '&lt;Connector') and
                                             (contains(., 'scheme=&quot;https&quot;') or
                                              contains(., &quot;scheme='https'&quot;))]
                                  )]
                      ">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="insertConnector" />
    </xsl:copy>
  </xsl:template>

  <!-- Add the new connector after the last existing Connnector if there's one -->
  <xsl:template match="Connector[last()]" mode="insertConnector">
    <xsl:call-template name="Copy" />

    <xsl:call-template name="AddConnector" />
  </xsl:template>

  <!-- ... or before the first Engine if there's no existing Connector -->
  <xsl:template match="Engine[1][not(preceding-sibling::Connector)]"
                mode="insertConnector">
    <xsl:call-template name="AddConnector" />

    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template name="AddConnector">
    <!-- Add new line -->
    <xsl:text>&#xa;</xsl:text>
    <!-- This is the new connector -->
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
               maxThreads="150" scheme="https" secure="true" 
               keystoreFile="${{user.home}}/.keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS" />
  </xsl:template>

</xsl:stylesheet>

Menyelesaikan konfigurasi

Akhirnya, kami akan menempatkan driver JAR di classpath Tomcat dan menghidupkan ulang Azure App Service Anda.

  1. Pastikan bahwa file driver JDBC tersedia untuk classloader Tomcat dengan menempatkannya di direktori /home/site/lib . Di Cloud Shell, jalankan az webapp deploy --type=lib untuk setiap JAR driver:
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

Jika Anda membuat sumber data tingkat server, hidupkan ulang aplikasi Azure App Service Linux. Tomcat akan mengatur ulang CATALINA_BASE ke /home/tomcat dan menggunakan konfigurasi yang diperbarui.

Sumber Data JBoss EAP

Ada tiga langkah inti saat mendaftarkan sumber data dengan JBoss EAP: mengunggah driver JDBC, menambah driver JDBC sebagai modul, dan mendaftarkan modul. Azure App Service adalah layanan hosting tanpa status, sehingga perintah konfigurasi untuk menambahkan dan mendaftarkan modul sumber data harus ditulis dan diterapkan saat kontainer dimulai.

  1. Dapatkan driver JDBC database Anda.

  2. Buat file definisi modul XML untuk driver JDBC. Contoh berikut menunjukkan definisi modul untuk PostgreSQL.

    <?xml version="1.0" ?>
    <module xmlns="urn:jboss:module:1.1" name="org.postgres">
        <resources>
        <!-- ***** IMPORTANT : REPLACE THIS PLACEHOLDER *******-->
        <resource-root path="/home/site/deployments/tools/postgresql-42.2.12.jar" />
        </resources>
        <dependencies>
            <module name="javax.api"/>
            <module name="javax.transaction.api"/>
        </dependencies>
    </module>
    
  3. Masukkan perintah JBoss CLI Anda ke dalam file yang diberi nama jboss-cli-commands.cli. Perintah JBoss harus menambah modul dan mendaftarkannya sebagai sumber data. Contoh berikut menunjukkan perintah JBoss CLI untuk PostgreSQL.

    #!/usr/bin/env bash
    module add --name=org.postgres --resources=/home/site/deployments/tools/postgresql-42.2.12.jar --module-xml=/home/site/deployments/tools/postgres-module.xml
    
    /subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
    
    data-source add --name=postgresDS --driver-name=postgres --jndi-name=java:jboss/datasources/postgresDS --connection-url=${POSTGRES_CONNECTION_URL,env.POSTGRES_CONNECTION_URL:jdbc:postgresql://db:5432/postgres} --user-name=${POSTGRES_SERVER_ADMIN_FULL_NAME,env.POSTGRES_SERVER_ADMIN_FULL_NAME:postgres} --password=${POSTGRES_SERVER_ADMIN_PASSWORD,env.POSTGRES_SERVER_ADMIN_PASSWORD:example} --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=org.postgresql.Driver --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter --jta=true --use-java-context=true --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
    
  4. Buat skrip startup, startup_script.sh yang memanggil perintah CLI JBoss. Contoh berikut menunjukkan cara memanggil Anda jboss-cli-commands.cli. Nantinya, Anda akan mengonfigurasi App Service untuk menjalankan skrip ini saat kontainer dimulai.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
    
  5. Menggunakan klien FTP pilihan Anda, unggah driver JDBC Anda, jboss-cli-commands.cli, startup_script.sh, dan definisi modul ke /site/deployments/tools/.

  6. Konfigurasikan situs Anda untuk dijalankan startup_script.sh saat kontainer dimulai. Di portal Microsoft Azure, navigasi ke Konfigurasi>Pengaturan Umum>Perintah Startup. Atur bidang perintah startup ke /home/site/deployments/tools/startup_script.sh. Simpan perubahan Anda.

Untuk mengonfirmasi bahwa datasource ditambahkan ke server JBoss, SSH ke webapp Anda dan jalankan $JBOSS_HOME/bin/jboss-cli.sh --connect. Setelah Anda tersambung ke JBoss, jalankan /subsystem=datasources:read-resource untuk mencetak daftar sumber data.

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.

Memilih versi runtime Java

App Service memungkinkan pengguna memilih versi utama JVM, seperti Java 8 atau Java 11, dan versi patch, seperti 1.8.0_232 atau 11.0.5. Anda juga dapat memilih agar versi patch diperbarui secara otomatis saat versi minor baru tersedia. Dalam kebanyakan kasus, aplikasi produksi harus menggunakan versi JVM patch yang disematkan. Ini mencegah pemadaman yang tidak terantisipasi selama pembaruan otomatis versi patch. Semua aplikasi web Java menggunakan JVM 64-bit, dan tidak dapat dikonfigurasi.

Jika Anda menggunakan Tomcat, Anda dapat memilih untuk menyematkan versi patch Tomcat. Di Windows, Anda dapat menyematkan versi patch JVM dan Tomcat secara terpisah. Di Linux, Anda dapat menyematkan versi patch Tomcat; versi patch JVM juga disematkan tetapi tidak dapat dikonfigurasi secara terpisah.

Jika Anda memilih untuk menyematkan versi minor, Anda perlu memperbarui versi minor JVM secara berkala di aplikasi. Untuk memastikan bahwa aplikasi Anda berjalan pada versi minor yang lebih baru, buat slot penahapan dan tingkatkan versi minor pada slot penahapan. Setelah mengonfirmasi bahwa aplikasi berjalan dengan benar pada versi minor baru, Anda dapat menukar slot penahapan dan produksi.

JBoss EAP

Pengklusteran di JBoss EAP

App Service mendukung pengklusteran untuk JBoss EAP versi 7.4.1 dan yang lebih baru. Untuk mengaktifkan pengklusteran, aplikasi web Anda harus terintegrasi dengan jaringan virtual. Ketika aplikasi web terintegrasi dengan jaringan virtual, aplikasi ini dimulai ulang, dan penginstalan JBoss EAP secara otomatis dimulai dengan konfigurasi berkluster. Instans JBoss EAP berkomunikasi melalui subnet yang ditentukan dalam integrasi jaringan virtual, menggunakan port yang ditampilkan dalam WEBSITES_PRIVATE_PORTS variabel lingkungan saat runtime. Anda dapat menonaktifkan pengklusteran dengan membuat pengaturan aplikasi bernama WEBSITE_DISABLE_CLUSTERING dengan nilai apa pun.

Catatan

Jika Anda mengaktifkan integrasi jaringan virtual dengan templat ARM, Anda perlu mengatur properti vnetPrivatePorts secara manual ke nilai 2. Jika Anda mengaktifkan integrasi jaringan virtual dari CLI atau Portal, properti ini diatur untuk Anda secara otomatis.

Saat pengklusteran diaktifkan, instans JBoss EAP menggunakan protokol penemuan JGroups FILE_PING untuk menemukan instans baru dan mempertahankan informasi kluster seperti anggota kluster, pengidentifikasi kluster, dan alamat IP kluster. Pada App Service, file-file ini berada di bawah /home/clusterinfo/. Instans EAP pertama yang mulai mendapatkan izin baca/tulis pada file keanggotaan kluster. Instans lain membaca file, menemukan simpul utama, dan berkoordinasi dengan simpul tersebut untuk disertakan dalam kluster dan ditambahkan ke file.

Jenis Premium V3 dan Paket Isolated App Service V2 secara opsional dapat didistribusikan di seluruh Zona Ketersediaan untuk meningkatkan ketahanan dan keandalan untuk beban kerja penting bisnis Anda. Arsitektur ini juga dikenal sebagai redundansi zona. Fitur pengklusteran JBoss EAP kompatibel dengan fitur redundansi zona.

Aturan Skala Otomatis

Saat mengonfigurasi aturan skala otomatis untuk penskalaan horizontal, penting untuk menghapus instans secara bertahap (satu per satu) untuk memastikan setiap instans yang dihapus dapat mentransfer aktivitasnya (seperti menangani transaksi database) ke anggota kluster lain. Saat mengonfigurasi aturan skala otomatis Anda di Portal untuk menurunkan skala, gunakan opsi berikut:

  • Operasi: "Kurangi hitungan sebanyak"
  • Pendinginan: "5 menit" atau lebih
  • Jumlah instans: 1

Anda tidak perlu menambahkan instans secara bertahap (perluasan skala), Anda dapat menambahkan beberapa instans ke kluster sekaligus.

Paket Azure App Service JBoss EAP

JBoss EAP hanya tersedia pada jenis Paket Azure App Service Premium v3 dan Isolated v2. Pelanggan yang membuat situs EAP JBoss pada tingkat yang berbeda selama pratinjau publik harus meningkatkan ke tingkat perangkat keras Premium atau Terisolasi untuk menghindari perilaku yang tidak terduga.

Konfigurasi Garis Besar Tomcat Pada App Services

Pengembang Java dapat menyesuaikan pengaturan server, memecahkan masalah, dan menyebarkan aplikasi ke Tomcat dengan percaya diri jika mereka tahu tentang file server.xml dan detail konfigurasi Tomcat. Kemungkinan penyesuaian meliputi:

  • Menyesuaikan konfigurasi Tomcat: Dengan memahami file server.xml dan detail konfigurasi Tomcat, Anda dapat menyempurnakan pengaturan server agar sesuai dengan kebutuhan aplikasi mereka.
  • Penelusuran kesalahan: Saat aplikasi disebarkan di server Tomcat, pengembang perlu mengetahui konfigurasi server untuk men-debug masalah apa pun yang mungkin muncul. Ini termasuk memeriksa log server, memeriksa file konfigurasi, dan mengidentifikasi kesalahan apa pun yang mungkin terjadi.
  • Pemecahan masalah Tomcat: Tak pelak, pengembang Java mengalami masalah dengan server Tomcat mereka, seperti masalah performa atau kesalahan konfigurasi. Dengan memahami file server.xml dan detail konfigurasi Tomcat, pengembang dapat dengan cepat mendiagnosis dan memecahkan masalah ini, yang dapat menghemat waktu dan upaya.
  • Menyebarkan aplikasi ke Tomcat: Untuk menyebarkan aplikasi web Java ke Tomcat, pengembang perlu tahu cara mengonfigurasi file server.xml dan pengaturan Tomcat lainnya. Memahami detail ini sangat penting untuk berhasil menyebarkan aplikasi dan memastikan bahwa aplikasi berjalan lancar di server.

Saat Anda membuat aplikasi dengan Tomcat bawaan untuk menghosting beban kerja Java Anda (file WAR atau file JAR), ada pengaturan tertentu yang Anda keluarkan dari kotak untuk konfigurasi Tomcat. Anda dapat merujuk ke Dokumentasi Resmi Apache Tomcat untuk informasi terperinci, termasuk konfigurasi default untuk Server Web Tomcat.

Selain itu, ada transformasi tertentu yang diterapkan lebih lanjut di atas server.xml untuk distribusi Tomcat pada awalnya. Ini adalah transformasi ke pengaturan Koneksi or, Host, dan Valve.

Perhatikan bahwa versi terbaru Tomcat memiliki server.xml (8.5.58 dan 9.0.38 dan seterusnya). Versi Lama Tomcat tidak menggunakan transformasi dan mungkin memiliki perilaku yang berbeda sebagai hasilnya.

Konektor

<Connector port="${port.http}" address="127.0.0.1" maxHttpHeaderSize="16384" compression="on" URIEncoding="UTF-8" connectionTimeout="${site.connectionTimeout}" maxThreads="${catalina.maxThreads}" maxConnections="${catalina.maxConnections}" protocol="HTTP/1.1" redirectPort="8443"/>
  • maxHttpHeaderSize diatur ke 16384
  • URIEncoding diatur ke UTF-8
  • conectionTimeout diatur ke WEBSITE_TOMCAT_CONNECTION_TIMEOUT, yang defaultnya 240000
  • maxThreads diatur ke WEBSITE_CATALINA_MAXTHREADS, yang defaultnya 200
  • maxConnections diatur ke WEBSITE_CATALINA_MAXCONNECTIONS, yang defaultnya 10000

Catatan

Pengaturan connectionTimeout, maxThreads, dan max Koneksi ions dapat disetel dengan pengaturan aplikasi

Berikut adalah contoh perintah CLI yang mungkin Anda gunakan untuk mengubah nilai conectionTimeout, maxThreads, atau max Koneksi ions:

az webapp config appsettings set --resource-group myResourceGroup --name myApp --settings WEBSITE_TOMCAT_CONNECTION_TIMEOUT=120000
az webapp config appsettings set --resource-group myResourceGroup --name myApp --settings WEBSITE_CATALINA_MAXTHREADS=100
az webapp config appsettings set --resource-group myResourceGroup --name myApp --settings WEBSITE_CATALINA_MAXCONNECTIONS=5000
  • Koneksi or menggunakan alamat kontainer alih-alih 127.0.0.1

Host

<Host appBase="${site.appbase}" xmlBase="${site.xmlbase}" unpackWARs="${site.unpackwars}" workDir="${site.tempdir}" errorReportValveClass="com.microsoft.azure.appservice.AppServiceErrorReportValve" name="localhost" autoDeploy="true">
  • appBase diatur ke AZURE_SITE_APP_BASE, yang defaultnya ke lokal WebappsLocalPath
  • xmlBase diatur ke AZURE_SITE_HOME, yang defaultnya /site/wwwroot
  • unpackWARs diatur ke AZURE_UNPACK_WARS, yang defaultnya true
  • workDir diatur ke JAVA_TMP_DIR, yang default TMP
  • errorReportValveClass menggunakan katup laporan kesalahan kustom kami

Katup

<Valve prefix="site_access_log.${catalina.instance.name}" pattern="%h %l %u %t &quot;%r&quot; %s %b %D %{x-arr-log-id}i" directory="${site.logdir}/http/RawLogs" maxDays="${site.logRetentionDays}" className="org.apache.catalina.valves.AccessLogValve" suffix=".txt"/>
  • directory diatur ke AZURE_LOGGING_DIR, yang defaultnya home\logFiles
  • maxDays adalah untuk WEBSITE_HTTPLOGGING_RETENTION_DAYS, yang default ke 0 [selamanya]

Di Linux, ia memiliki semua kustomisasi yang sama, ditambah:

  • Menambahkan beberapa halaman kesalahan dan pelaporan ke katup:
               <xsl:attribute name="appServiceErrorPage">
                   <xsl:value-of select="'${appService.valves.appServiceErrorPage}'"/>
               </xsl:attribute>

               <xsl:attribute name="showReport">
                   <xsl:value-of select="'${catalina.valves.showReport}'"/>
               </xsl:attribute>

               <xsl:attribute name="showServerInfo">
                   <xsl:value-of select="'${catalina.valves.showServerInfo}'"/>
               </xsl:attribute>

Langkah berikutnya

Kunjungi pusat Azure for Java Developers untuk menemukan mulai cepat Azure, tutorial, dan dokumentasi referensi Java.