تكوين تطبيق Java لـ Azure App Service

تتيح Azure App Service لمطوري Java إنشاء تطبيقات الويب Java SE و Tomcat و JBoss EAP ونشرها وتوسيع نطاقها بسرعة على خدمة مدارة بالكامل. انشر التطبيقات باستخدام مكونات Maven الإضافية أو من سطر الأوامر أو في برامج تحرير مثل IntelliJ أو Eclipse أو Visual Studio Code.

يوفر هذا الدليل المفاهيم والإرشادات الأساسية لمطوري Java الذين يستخدمون App Service. إذا لم يسبق لك استخدام Azure App Service، فيجب عليك قراءة التشغيل السريع ل Java أولا. يتم الرد على الأسئلة العامة حول استخدام خدمة التطبيقات التي لا تقتصر على تطوير Java في الأسئلة المتداولة حول خدمة التطبيقات.

إظهار إصدار جافا

لإظهار إصدار Java الحالي، قم بتشغيل الأمر التالي في Cloud Shell:

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

لإظهار كافة إصدارات Java المدعومة، قم بتشغيل الأمر التالي في Cloud Shell:

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

لإظهار إصدار Java الحالي، قم بتشغيل الأمر التالي في Cloud Shell:

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

لإظهار كافة إصدارات Java المدعومة، قم بتشغيل الأمر التالي في Cloud Shell:

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

نشر تطبيقك

أدوات البناء

Maven

باستخدام المكون الإضافي Maven لتطبيقات الويب Azure، يمكنك إعداد مشروع Maven Java لتطبيق Azure Web App بسهولة باستخدام أمر واحد في جذر المشروع:

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

يضيف هذا الأمر مكونا إضافيا وتكوينا azure-webapp-maven-plugin ذا صلة من خلال مطالبتك بتحديد تطبيق ويب Azure موجود أو إنشاء تطبيق جديد. بعد ذلك، يمكنك نشر تطبيق Java على Azure باستخدام الأمر التالي:

mvn package azure-webapp:deploy

فيما يلي نموذج تكوين في pom.xml:

<plugin> 
  <groupId>com.microsoft.azure</groupId>  
  <artifactId>azure-webapp-maven-plugin</artifactId>  
  <version>2.2.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. قم بإعداد المكون الإضافي Gradle لتطبيقات ويب Azure عن طريق إضافة المكون الإضافي إلى build.gradle:

    plugins {
      id "com.microsoft.azure.azurewebapp" version "1.2.0"
    }
    
  2. قم بتكوين تفاصيل تطبيق الويب الخاص بك، وسيتم إنشاء موارد Azure المقابلة إن لم تكن موجودة. فيما يلي نموذج تكوين ، للحصول على التفاصيل ، راجع هذا المستند.

    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. النشر باستخدام أمر واحد.

    gradle azureWebAppDeploy
    

IDEs

يوفر Azure تجربة تطوير سلسة لخدمة تطبيقات Java في برامج Java IDEs الشائعة، بما في ذلك:

كودو API

Java SE

لنشر ملفات .jar إلى Java SE ، استخدم /api/publish/ نقطة النهاية لموقع Kudu. لمزيد من المعلومات حول واجهة برمجة التطبيقات هذه، راجع هذه الوثائق.

ملاحظة

يجب تسمية app.jar تطبيق .jar الخاص بك باسم App Service لتحديد تطبيقك وتشغيله. سيقوم المكون الإضافي Maven (المذكور أعلاه) تلقائيا بإعادة تسمية تطبيقك نيابة عنك أثناء النشر. إذا كنت لا ترغب في إعادة تسمية JAR إلى التطبيق .jar ، فيمكنك تحميل برنامج نصي shell مع الأمر لتشغيل تطبيق .jar. الصق المسار المطلق لهذا البرنامج النصي في مربع النص ملف بدء التشغيل في قسم التكوين من البوابة الإلكترونية. لا يتم تشغيل البرنامج النصي لبدء التشغيل من الدليل الذي تم وضعه فيه. لذلك، استخدم دائما المسارات المطلقة للإشارة إلى الملفات في البرنامج النصي لبدء التشغيل (على سبيل المثال: java -jar /home/myapp/myapp.jar).

Tomcat

لنشر ملفات .war إلى Tomcat، استخدم /api/wardeploy/ نقطة النهاية لنشر ملف الأرشيف. لمزيد من المعلومات حول واجهة برمجة التطبيقات هذه، راجع هذه الوثائق.

JBoss EAP

لنشر ملفات .war إلى JBoss، استخدم /api/wardeploy/ نقطة النهاية لنشر ملف الأرشيف. لمزيد من المعلومات حول واجهة برمجة التطبيقات هذه، راجع هذه الوثائق.

لنشر ملفات.ear، استخدم FTP. سيتم نشر تطبيق .ear الخاص بك إلى جذر السياق المحدد في تكوين التطبيق الخاص بك. على سبيل المثال ، إذا كان جذر سياق تطبيقك هو <context-root>myapp</context-root>، فيمكنك تصفح الموقع في المسار /myapp : http://my-app-name.azurewebsites.net/myapp. إذا كنت تريد عرض تطبيق الويب الخاص بك في مسار الجذر، فتأكد من أن تطبيقك يعين جذر السياق إلى مسار الجذر: <context-root>/</context-root>. لمزيد من المعلومات، راجع تعيين جذر السياق لتطبيق ويب.

لا تقم بنشر .war أو .jar باستخدام FTP. تم تصميم أداة FTP لتحميل البرامج النصية لبدء التشغيل أو التبعيات أو ملفات وقت التشغيل الأخرى. إنه ليس الخيار الأمثل لنشر تطبيقات الويب.

تسجيل وتصحيح أخطاء التطبيقات

تتوفر تقارير الأداء ومرئيات حركة المرور والفحوصات الصحية لكل تطبيق من خلال مدخل Azure. لمزيد من المعلومات، راجع نظرة عامة على تشخيصات خدمة تطبيقات Azure.

دفق سجلات التشخيص

للوصول إلى سجلات وحدة التحكم التي تم إنشاؤها من داخل التعليمة البرمجية للتطبيق في خدمة التطبيقات، قم بتشغيل تسجيل التشخيص عن طريق تشغيل الأمر التالي في Cloud Shell:

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

القيم المحتملة لـ --level هي: Error وWarning وInfo وVerbose. يتضمن كل مستوى لاحق المستوى السابق. على سبيل المثال: Error يتضمن رسائل الخطأ فقط بينما Verbose يتضمن جميع الرسائل.

بمجرد تشغيل التسجيل التشخيصي، قم بتشغيل الأمر التالي لمشاهدة تدفق السجل:

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

إذا كنت لا ترى سجلات وحدة التحكم على الفور، فتحقق مرة أخرى في غضون 30 ثانية.

ملاحظة

يمكنك أيضًا فحص ملفات السجل من المتصفح الموجود على https://<app-name>.scm.azurewebsites.net/api/logs/docker.

لإيقاف تسجيل التدفق في أي وقت، اكتب Ctrl+C.

يمكنك الوصول إلى سجلات وحدة التحكم المنشأة من داخل الحاوية.

أولًا، قم بتشغيل تسجيل الحاويات عن طريق تشغيل الأمر التالي:

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

استبدل <app-name> و<resource-group-name> بالأسماء المناسبة لتطبيق الويب الخاص بك.

بمجرد تشغيل تسجيل الحاويات، قم بتشغيل الأمر التالي لمشاهدة تدفق السجل:

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

وفي حال عدم رؤية سجلات وحدة التحكم على الفور، فتحقق مجددًا في غضون 30 ثانية.

لإيقاف دفق السجل في أي وقت، اكتب Ctrl+C.

يمكنك أيضًا فحص ملفات السجل من المتصفح الموجود في https://<app-name>.scm.azurewebsites.net/api/logs/docker.

لمزيد من المعلومات، راجع سجلات البث في Cloud Shell.

الوصول إلى وحدة تحكم SSH

لفتح جلسة SSH مباشرة مع حاويتك، يجب أن يكون تطبيقك قيد التشغيل.

الصق عنوان URL التالي في المتصفح واستبدله<app-name> باسم التطبيق:

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

إذا لم تتم مصادقتكَ بعد، يجب عليك المصادقة باستخدام اشتراك Azure للاتصال. بمجرد المصادقة، سترى shell في المستعرض، حيث يمكنك تشغيل الأوامر داخل حاويتك.

SSH connection

ملاحظة

تخزن أي تغييرات تقوم بها خارج الدليل /home في الحاوية نفسها ولا تستمر بعد إعادة تشغيل التطبيق.

لفتح جلسة SSH بعيدة من الجهاز المحلي، راجعجلسة SSH المفتوحة من واجهة بعيدة.

أدوات استكشاف الأخطاء وإصلاحها

تعتمد صور Java المدمجة على نظام التشغيل Alpine Linux . استخدم مدير الحزم apk لتثبيت أي أدوات أو أوامر لاستكشاف الأخطاء وإصلاحها.

مسجل الطيران

تأتي جميع أوقات تشغيل Java على App Service باستخدام Azul JVMs مع مسجل رحلات Zulu. يمكنك استخدام هذا لتسجيل أحداث JVM والنظام والتطبيق واستكشاف المشكلات وإصلاحها في تطبيقات Java الخاصة بك.

تسجيل موقوت

لإجراء تسجيل محدد زمنيا ، ستحتاج إلى PID (معرف العملية) لتطبيق Java. للعثور على PID، افتح متصفحا لموقع SCM الخاص بتطبيق الويب الخاص بك على .https://<your-site-name>.scm.azurewebsites.net/ProcessExplorer/ تعرض هذه الصفحة العمليات الجارية في تطبيق الويب الخاص بك. ابحث عن العملية المسماة "java" في الجدول وانسخ PID المقابل (معرف العملية).

بعد ذلك ، افتح وحدة تحكم تصحيح الأخطاء في شريط الأدوات العلوي لموقع SCM وقم بتشغيل الأمر التالي. استبدل <pid> بمعرف العملية الذي نسخته سابقا. سيبدأ هذا الأمر تسجيل ملف تعريف مدته 30 ثانية لتطبيق Java الخاص بك وإنشاء ملف مسمى timed_recording_example.jfr في الدليل D:\home .

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

SSH في خدمة التطبيق الخاصة بك وقم بتشغيل jcmd الأمر لرؤية قائمة بجميع عمليات Java قيد التشغيل. بالإضافة إلى jcmd نفسه ، يجب أن ترى تطبيق Java الخاص بك يعمل برقم معرف العملية (pid).

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

قم بتنفيذ الأمر أدناه لبدء تسجيل مدته 30 ثانية ل JVM. سيؤدي ذلك إلى تعريف JVM وإنشاء ملف JFR باسم jfr_example.jfr في الدليل الرئيسي. (استبدل 116 ب pid الخاص بتطبيق Java الخاص بك.)

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

خلال الفاصل الزمني البالغ 30 ثانية ، يمكنك التحقق من صحة التسجيل الذي يتم عن طريق التشغيل jcmd 116 JFR.check. سيؤدي ذلك إلى عرض جميع التسجيلات لعملية Java المحددة.

التسجيل المستمر

يمكنك استخدام Zulu Flight Recorder لتعريف تطبيق Java الخاص بك باستمرار مع الحد الأدنى من التأثير على أداء وقت التشغيل. للقيام بذلك، قم بتشغيل الأمر Azure CLI التالي لإنشاء إعداد تطبيق باسم JAVA_OPTS مع التكوين اللازم. يتم تمرير محتويات إعداد تطبيق JAVA_OPTS إلى java الأمر عند بدء تشغيل التطبيق.

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

بمجرد بدء التسجيل ، يمكنك تفريغ بيانات التسجيل الحالية في أي وقت باستخدام JFR.dump الأمر.

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

تحليل .jfr الملفات

استخدم FTPS لتنزيل ملف JFR إلى جهازك المحلي. لتحليل ملف JFR ، قم بتنزيل وتثبيت Zulu Mission Control. للحصول على إرشادات حول التحكم في مهمة الزولو، راجع وثائق Azulوإرشادات التثبيت.

تسجيل التطبيق

قم بتمكين تسجيل التطبيق من خلال مدخل Azure أو Azure CLI لتكوين App Service لكتابة إخراج وحدة التحكم القياسية للتطبيق وتدفقات أخطاء وحدة التحكم القياسية إلى نظام الملفات المحلي أو Azure Blob Storage. يتم تعطيل تسجيل الدخول إلى مثيل نظام ملفات App Service المحلي بعد 12 ساعة من تكوينه. إذا كنت بحاجة إلى الاحتفاظ لفترة أطول، فقم بتكوين التطبيق لكتابة الإخراج إلى حاوية تخزين Blob. يمكن العثور على سجلات تطبيقات Java و Tomcat في الدليل / home/LogFiles/Application/ .

قم بتمكين تسجيل التطبيق من خلال مدخل Azure أو Azure CLI لتكوين App Service لكتابة إخراج وحدة التحكم القياسية للتطبيق وتدفقات أخطاء وحدة التحكم القياسية إلى نظام الملفات المحلي أو Azure Blob Storage. إذا كنت بحاجة إلى الاحتفاظ لفترة أطول، فقم بتكوين التطبيق لكتابة الإخراج إلى حاوية تخزين Blob. يمكن العثور على سجلات تطبيقات Java و Tomcat في الدليل / home/LogFiles/Application/ .

لا يمكن تكوين تسجيل تخزين Azure Blob لخدمات التطبيقات المستندة إلى Linux إلا باستخدام Azure Monitor

إذا كان تطبيقك يستخدم Logback أو Log4j للتتبع، فيمكنك إعادة توجيه هذه التتبعات للمراجعة في تطبيق Azure Insights باستخدام إرشادات تكوين إطار التسجيل في استكشاف سجلات تتبع Java في Insights التطبيق.

ملاحظة

نظرا لوجود ثغرة أمنية معروفة CVE-2021-44228، تأكد من استخدام Log4j الإصدار 2.16 أو إصدار أحدث.

التخصيص والضبط

تدعم Azure App Service الضبط والتخصيص خارج الصندوق من خلال مدخل Azure وCLI. راجع المقالات التالية لتكوين تطبيق ويب غير خاص ب Java:

تعيين خيارات وقت تشغيل Java

لتعيين الذاكرة المخصصة أو خيارات وقت تشغيل JVM الأخرى، قم بإنشاء إعداد تطبيق باسم JAVA_OPTS الخيارات. تقوم خدمة التطبيقات بتمرير هذا الإعداد كمتغير بيئة إلى وقت تشغيل Java عند بدء تشغيله.

في مدخل Azure، ضمن الإعدادات التطبيق لتطبيق الويب، قم بإنشاء إعداد تطبيق جديد باسم JAVA_OPTS Java SE أو CATALINA_OPTS Tomcat يتضمن إعدادات أخرى، مثل -Xms512m -Xmx1204m.

لتكوين إعداد التطبيق من المكون الإضافي Maven، أضف علامات الإعداد/القيمة في قسم المكون الإضافي Azure. يحدد المثال التالي حدا أدنى وأقصى لحجم كومة Java مؤقتا:

<appSettings>
    <property>
        <name>JAVA_OPTS</name>
        <value>-Xms512m -Xmx1204m</value>
    </property>
</appSettings>

ملاحظة

لا تحتاج إلى إنشاء ملف web.config عند استخدام Tomcat على خدمة تطبيقات Windows.

يمكن للمطورين الذين يقومون بتشغيل تطبيق واحد مع فتحة نشر واحدة في خطة خدمة التطبيقات الخاصة بهم استخدام الخيارات التالية:

  • مثيلات B1 وS1: -Xms1024m -Xmx1024m
  • مثيلات B2 وS2: -Xms3072m -Xmx3072m
  • مثيلات B3 وS3: -Xms6144m -Xmx6144m
  • مثيلات P1v2: -Xms3072m -Xmx3072m
  • مثيلات P2v2: -Xms6144m -Xmx6144m
  • مثيلات P3v2: -Xms12800m -Xmx12800m
  • مثيلات P1v3: -Xms6656m -Xmx6656m
  • مثيلات P2v3: -Xms14848m -Xmx14848m
  • مثيلات P3v3: -Xms30720m -Xmx30720m
  • مثيلات I1: -Xms3072m -Xmx3072m
  • مثيلات I2: -Xms6144m -Xmx6144m
  • مثيلات I3: -Xms12800m -Xmx12800m
  • مثيلات I1v2: -Xms6656m -Xmx6656m
  • مثيلات I2v2: -Xms14848m -Xmx14848m
  • مثيلات I3v2: -Xms30720m -Xmx30720m

عند ضبط إعدادات كومة التطبيقات المؤقتة، راجع تفاصيل خطة خدمة التطبيقات الخاصة بك وخذ في الاعتبار التطبيقات المتعددة وتحتاج فتحة النشر إلى العثور على التخصيص الأمثل للذاكرة.

تشغيل مقابس الويب

قم بتشغيل دعم مآخذ مآخذ الويب في مدخل Azure في إعدادات التطبيق الخاصة بالتطبيق. ستحتاج إلى إعادة تشغيل التطبيق حتى يصبح الإعداد ساري المفعول.

قم بتشغيل دعم مأخذ توصيل الويب باستخدام Azure CLI باستخدام الأمر التالي:

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

ثم أعد تشغيل التطبيق:

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

تعيين ترميز الأحرف الافتراضي

في مدخل Azure، ضمن الإعدادات التطبيق لتطبيق الويب، قم بإنشاء إعداد تطبيق جديد باسم JAVA_OPTS القيمة -Dfile.encoding=UTF-8.

بدلا من ذلك ، يمكنك تكوين إعداد التطبيق باستخدام المكون الإضافي App Service Maven. أضف اسم الإعداد وعلامات القيمة في تكوين المكون الإضافي:

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

التحويل البرمجي المسبق لملفات JSP

لتحسين أداء تطبيقات Tomcat، يمكنك ترجمة ملفات JSP قبل نشرها في App Service. يمكنك استخدام المكون الإضافي Maven الذي يوفره Apache Sling ، أو باستخدام ملف إنشاء Ant هذا.

تطبيقات آمنة

تحتوي تطبيقات Java التي تعمل في App Service على نفس مجموعة أفضل ممارسات الأمان مثل التطبيقات الأخرى.

مصادقة المستخدمين (المصادقة السهلة)

قم بإعداد مصادقة التطبيق في مدخل Azure باستخدام خيار المصادقة والتفويض . من هناك، يمكنك تمكين المصادقة باستخدام Azure Active Directory أو عمليات تسجيل الدخول الاجتماعية مثل Facebook أو Google أو GitHub. يعمل تكوين مدخل Azure فقط عند تكوين موفر مصادقة واحد. لمزيد من المعلومات، راجع تكوين تطبيق App Service لاستخدام تسجيل الدخول إلى Azure Active Directory والمقالات ذات الصلة لموفري الهوية الآخرين. إذا كنت بحاجة إلى تمكين موفري تسجيل دخول متعددين، فاتبع الإرشادات الواردة في مقالة تخصيص عمليات تسجيل الدخول وتسجيل الخروج .

Java SE

يمكن لمطوري Spring Boot استخدام بداية Azure Active Directory Spring Boot لتأمين التطبيقات باستخدام التعليقات التوضيحية وواجهات برمجة التطبيقات المألوفة ل Spring Security. تأكد من زيادة الحد الأقصى لحجم الرأس في ملف application.properties. نقترح قيمة 16384.

Tomcat

يمكن لتطبيق Tomcat الخاص بك الوصول إلى مطالبات المستخدم مباشرة من servlet عن طريق إرسال الكائن الرئيسي إلى كائن خريطة. سيقوم كائن الخريطة بتعيين كل نوع مطالبة إلى مجموعة من المطالبات لهذا النوع. في الكود أدناه ، request هو مثال على HttpServletRequest.

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

الآن يمكنك فحص الكائن Map لأي مطالبة محددة. على سبيل المثال، يتكرر مقتطف التعليمات البرمجية التالي عبر جميع أنواع المطالبات ويطبع محتويات كل مجموعة.

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);
            }
        }
    }

لتسجيل خروج المستخدمين، استخدم المسار /.auth/ext/logout . لتنفيذ إجراءات أخرى، راجع الوثائق الموجودة على تخصيص عمليات تسجيل الدخول وتسجيل الخروج. هناك أيضا وثائق رسمية على واجهة Tomcat HttpServletRequest وأساليبها. يتم أيضا ترطيب طرق servlet التالية بناء على تكوين خدمة التطبيق الخاص بك:

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

لتعطيل هذه الميزة، قم بإنشاء إعداد تطبيق باسم WEBSITE_AUTH_SKIP_PRINCIPAL بقيمة 1. لتعطيل جميع فلاتر servlet التي تمت إضافتها بواسطة App Service، قم بإنشاء إعداد باسم WEBSITE_SKIP_FILTERS بقيمة 1.

تكوين TLS/SSL

اتبع الإرشادات الواردة في تأمين اسم DNS مخصص باستخدام ربط TLS/SSL في Azure App Service لتحميل شهادة TLS/SSL موجودة وربطها باسم نطاق تطبيقك. بشكل افتراضي ، سيظل تطبيقك يسمح باتصالات HTTP - اتبع الخطوات المحددة في البرنامج التعليمي لفرض TLS / SSL.

استخدام مراجع KeyVault

يوفر Azure KeyVault إدارة سرية مركزية مع سياسات الوصول وسجل التدقيق. يمكنك تخزين الأسرار (مثل كلمات المرور أو سلاسل الاتصال) في KeyVault والوصول إلى هذه الأسرار في تطبيقك من خلال متغيرات البيئة.

أولا، اتبع الإرشادات الخاصة بمنح تطبيقك حق الوصول إلى Key Vaultوجعل KeyVault يشير إلى سرك في إعداد التطبيق. يمكنك التحقق من أن المرجع يحل السر عن طريق طباعة متغير البيئة أثناء الوصول عن بعد إلى محطة خدمة التطبيق.

لحقن هذه الأسرار في ملف تكوين Spring أو Tomcat، استخدم بناء جملة الحقن المتغير للبيئة (${MY_ENV_VAR}). بالنسبة لملفات تكوين الربيع، راجع هذه الوثائق حول التكوينات الخارجية.

استخدام متجر مفاتيح جافا

بشكل افتراضي ، سيتم تحميل أي شهادات عامة أو خاصة تم تحميلها إلى App Service Linux في متاجر Java Key Stores المعنية عند بدء تشغيل الحاوية. بعد تحميل شهادتك ، ستحتاج إلى إعادة تشغيل خدمة التطبيقات الخاصة بك حتى يتم تحميلها في متجر Java Key. يتم تحميل الشهادات العامة في مخزن المفاتيح في ، ويتم تخزين الشهادات الخاصة في $JAVA_HOME/jre/lib/security/cacerts$JAVA_HOME/lib/security/client.jks.

قد يكون من الضروري إجراء مزيد من التكوين لتشفير اتصال JDBC الخاص بك مع الشهادات في متجر مفاتيح Java. ارجع إلى الوثائق الخاصة ببرنامج تشغيل JDBC الذي اخترته.

تهيئة متجر مفاتيح Java

لتهيئة الكائن import java.security.KeyStore ، قم بتحميل ملف keystore بكلمة المرور. كلمة المرور الافتراضية لكلا المخزنين الرئيسيين هي changeit.

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

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

تحميل مخزن المفاتيح يدويا

يمكنك تحميل الشهادات يدويا إلى مخزن المفاتيح. قم بإنشاء إعداد تطبيق ، SKIP_JAVA_KEYSTORE_LOADمع قيمة 1 لتعطيل App Service من تحميل الشهادات في متجر المفاتيح تلقائيا. يتم تخزين جميع الشهادات العامة التي تم تحميلها إلى App Service عبر مدخل Azure ضمن /var/ssl/certs/. يتم تخزين الشهادات الخاصة تحت /var/ssl/private/.

يمكنك التفاعل أو تصحيح أخطاء أداة Java Key عن طريق فتح اتصال SSH بخدمة التطبيق الخاصة بك وتشغيل الأمر keytool. راجع وثائق أداة المفتاح للحصول على قائمة الأوامر. لمزيد من المعلومات حول واجهة برمجة تطبيقات KeyStore، راجع الوثائق الرسمية.

تكوين منصات APM

يوضح هذا القسم كيفية توصيل تطبيقات Java المنشورة على خدمة تطبيقات Azure برؤى تطبيقات Azure Monitor والأنظمة الأساسية لمراقبة أداء تطبيقات NewRelic وAppDynamics (APM).

تكوين Application Insights

Azure Monitor Application insights هي خدمة مراقبة تطبيقات سحابية أصلية تمكن العملاء من مراقبة حالات الفشل والاختناقات وأنماط الاستخدام لتحسين أداء التطبيق وتقليل متوسط الوقت اللازم للدقة (MTTR). من خلال بضع نقرات أو أوامر CLI، يمكنك تمكين المراقبة لتطبيقات Node.js أو Java والتجميع التلقائي للسجلات والمقاييس والآثار الموزعة، مما يلغي الحاجة إلى تضمين SDK في تطبيقك. راجع وثائق Insights التطبيق للحصول على مزيد من المعلومات حول إعدادات التطبيق المتاحة لتكوين الوكيل.

مدخل Azure

لتمكين Insights التطبيق من مدخل Azure، انتقل إلى Insights التطبيق في القائمة الموجودة على الجانب الأيمن وحدد تشغيل التطبيق Insights. بشكل افتراضي، سيتم استخدام مورد رؤى تطبيق جديد يحمل نفس اسم تطبيق الويب الخاص بك. يمكنك اختيار استخدام مورد رؤى تطبيق موجود أو تغيير الاسم. انقر على تطبيق في الأسفل

Azure CLI

للتمكين عبر Azure CLI، ستحتاج إلى إنشاء مورد Insights تطبيق وتعيين إعدادين للتطبيق على مدخل Azure لتوصيل Insights التطبيق بتطبيق الويب الخاص بك.

  1. تمكين ملحق Insights التطبيقات

    az extension add -n application-insights
    
  2. قم بإنشاء مورد Insights تطبيق باستخدام الأمر CLI أدناه. استبدل العناصر النائبة باسم المورد والمجموعة المطلوبين.

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

    لاحظ القيم الخاصة connectionString ب و instrumentationKey، ستحتاج إلى هذه القيم في الخطوة التالية.

    لاسترداد قائمة بالمواقع الأخرى، قم بتشغيل az account list-locations.

  1. قم بتعيين مفتاح الأجهزة وسلسلة الاتصال وإصدار وكيل المراقبة كإعدادات للتطبيق على تطبيق الويب. استبدال <instrumentationKey> وبالقيم <connectionString> من الخطوة السابقة.

    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. قم بتعيين مفتاح الأجهزة وسلسلة الاتصال وإصدار وكيل المراقبة كإعدادات للتطبيق على تطبيق الويب. استبدال <instrumentationKey> وبالقيم <connectionString> من الخطوة السابقة.

    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"
    

تكوين بقايا جديدة

  1. إنشاء حساب NewRelic في NewRelic.com

  2. قم بتنزيل وكيل Java من NewRelic ، وسيكون له اسم ملف مشابه newrelic-java-x.x.x.zip.

  3. انسخ مفتاح الترخيص الخاص بك ، ستحتاج إليه لتكوين العامل لاحقا.

  4. SSH في مثيل خدمة التطبيق الخاص بك وإنشاء دليل جديد /home/ site/wwwroot/apm.

  5. Upload ملفات وكيل NewRelic Java التي تم تفكيكها في دليل ضمن /home/site/wwwroot/apm. يجب أن تكون ملفات وكيلك في / home/site/wwwroot/apm/newrelic.

  6. قم بتعديل ملف YAML في /home/site/wwwroot/apm/newrelic /newrelic.yml واستبدل قيمة ترخيص العنصر النائب بمفتاح الترخيص الخاص بك.

  7. في مدخل Azure، استعرض وصولا إلى تطبيقك في App Service وقم بإنشاء إعداد تطبيق جديد.

    • بالنسبة لتطبيقات Java SE ، قم بإنشاء متغير بيئة باسم JAVA_OPTS القيمة -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.
    • بالنسبة إلى Tomcat، قم بإنشاء متغير بيئة باسم CATALINA_OPTS القيمة -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.
  1. إنشاء حساب NewRelic في NewRelic.com

  2. قم بتنزيل وكيل Java من NewRelic ، وسيكون له اسم ملف مشابه newrelic-java-x.x.x.zip.

  3. انسخ مفتاح الترخيص الخاص بك ، ستحتاج إليه لتكوين العامل لاحقا.

  4. SSH في مثيل خدمة التطبيق الخاص بك وإنشاء دليل جديد /home/ site/wwwroot/apm.

  5. Upload ملفات وكيل NewRelic Java التي تم تفكيكها في دليل ضمن /home/site/wwwroot/apm. يجب أن تكون ملفات وكيلك في / home/site/wwwroot/apm/newrelic.

  6. قم بتعديل ملف YAML في /home/site/wwwroot/apm/newrelic /newrelic.yml واستبدل قيمة ترخيص العنصر النائب بمفتاح الترخيص الخاص بك.

  7. في مدخل Azure، استعرض وصولا إلى تطبيقك في App Service وقم بإنشاء إعداد تطبيق جديد.

    • بالنسبة لتطبيقات Java SE ، قم بإنشاء متغير بيئة باسم JAVA_OPTS القيمة -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.
    • بالنسبة إلى Tomcat، قم بإنشاء متغير بيئة باسم CATALINA_OPTS القيمة -javaagent:/home/site/wwwroot/apm/newrelic/newrelic.jar.

إذا كان لديك بالفعل متغير بيئة ل JAVA_OPTS أو CATALINA_OPTS، فقم بإلحاق -javaagent:/... الخيار بنهاية القيمة الحالية.

تكوين AppDynamics

  1. إنشاء حساب AppDynamics في AppDynamics.com

  2. قم بتنزيل وكيل Java من موقع AppDynamics على الويب ، وسيكون اسم الملف مشابها AppServerAgent-x.x.x.xxxxx.zip

  3. استخدم وحدة تحكم Kudu لإنشاء دليل جديد / home/site/wwwroot/apm.

  4. Upload ملفات وكيل Java في دليل ضمن /home/site/wwwroot/apm. يجب أن تكون ملفات وكيلك في / home/site/wwwroot/apm/appdynamics.

  5. في مدخل Azure، استعرض وصولا إلى تطبيقك في App Service وقم بإنشاء إعداد تطبيق جديد.

    • بالنسبة إلى تطبيقات Java SE ، أنشئ متغير بيئة باسم JAVA_OPTS القيمة -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> التي يوجد بها <app-name> اسم خدمة التطبيق.
    • بالنسبة إلى تطبيقات Tomcat ، قم بإنشاء متغير بيئة باسم CATALINA_OPTS القيمة -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> الموجودة في <app-name> اسم خدمة التطبيق.
  1. إنشاء حساب AppDynamics في AppDynamics.com

  2. قم بتنزيل وكيل Java من موقع AppDynamics على الويب ، وسيكون اسم الملف مشابها AppServerAgent-x.x.x.xxxxx.zip

  3. SSH في مثيل خدمة التطبيق الخاص بك وإنشاء دليل جديد /home/ site/wwwroot/apm.

  4. Upload ملفات وكيل Java في دليل ضمن /home/site/wwwroot/apm. يجب أن تكون ملفات وكيلك في / home/site/wwwroot/apm/appdynamics.

  5. في مدخل Azure، استعرض وصولا إلى تطبيقك في App Service وقم بإنشاء إعداد تطبيق جديد.

    • بالنسبة إلى تطبيقات Java SE ، أنشئ متغير بيئة باسم JAVA_OPTS القيمة -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> التي يوجد بها <app-name> اسم خدمة التطبيق.
    • بالنسبة إلى تطبيقات Tomcat ، قم بإنشاء متغير بيئة باسم CATALINA_OPTS القيمة -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name> الموجودة في <app-name> اسم خدمة التطبيق.

ملاحظة

إذا كان لديك بالفعل متغير بيئة ل JAVA_OPTS أو CATALINA_OPTS، فقم بإلحاق -javaagent:/... الخيار بنهاية القيمة الحالية.

تكوين مصادر البيانات

Java SE

للاتصال بمصادر البيانات في تطبيقات Spring Boot، نقترح إنشاء سلاسل اتصال وحقنها في ملف application.properties.

  1. في قسم "التكوين" في صفحة خدمة التطبيق، قم بتعيين اسم للسلسلة، والصق سلسلة اتصال JDBC في حقل القيمة، واضبط النوع على "مخصص". يمكنك اختياريا تعيين سلسلة الاتصال هذه كإعداد فتحة.

    يمكن الوصول إلى سلسلة الاتصال هذه لتطبيقنا كمتغير بيئة يسمى CUSTOMCONNSTR_<your-string-name>. على سبيل المثال ، سيتم تسمية CUSTOMCONNSTR_exampledbسلسلة الاتصال التي أنشأناها أعلاه .

  2. في ملف application.properties ، راجع سلسلة الاتصال هذه باسم متغير البيئة. على سبيل المثال، سنستخدم ما يلي.

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

راجع وثائق Spring Boot حول الوصول إلى البياناتوالتكوينات الخارجية للحصول على مزيد من المعلومات حول هذا الموضوع.

Tomcat

تنطبق هذه الإرشادات على كافة اتصالات قاعدة البيانات. ستحتاج إلى ملء العناصر النائبة باسم فئة برنامج تشغيل قاعدة البيانات التي اخترتها وملف JAR. يتوفر جدول يحتوي على أسماء الفئات وتنزيلات برامج التشغيل لقواعد البيانات الشائعة.

قاعدة البيانات اسم فئة السائق برنامج تشغيل JDBC
PostgreSQL org.postgresql.Driver تنزيل
MySQL com.mysql.jdbc.Driver تنزيل (اختر "منصة مستقلة")
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver تنزيل

لتكوين Tomcat لاستخدام اتصال قاعدة بيانات Java (JDBC) أو واجهة برمجة تطبيقات Java Persistence (JPA)، قم أولا بتخصيص CATALINA_OPTS متغير البيئة الذي تتم قراءته بواسطة Tomcat عند بدء التشغيل. قم بتعيين هذه القيم من خلال إعداد تطبيق في المكون الإضافي App Service Maven:

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

أو قم بتعيين متغيرات البيئة في صفحة الإعدادات ConfigurationApplication> في مدخل Azure.

بعد ذلك ، حدد ما إذا كان يجب أن يكون مصدر البيانات متاحا لتطبيق واحد أو لجميع التطبيقات التي تعمل على Tomcat servlet.

مصادر البيانات على مستوى التطبيق

  1. قم بإنشاء ملف context.xml في دليل META-INF / الخاص بمشروعك. إنشاء الدليل META-INF/ إذا لم يكن موجودا.

  2. في context.xml، أضف عنصرا Context لربط مصدر البيانات بعنوان JNDI. استبدل driverClassName العنصر النائب باسم فئة السائق من الجدول أعلاه.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${dbuser}"
            driverClassName="<insert your driver class name>"
            username="${dbpassword}"
            password="${connURL}"
        />
    </Context>
    
  3. قم بتحديث web.xml التطبيق لاستخدام مصدر البيانات في التطبيق.

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

الموارد المشتركة على مستوى الخادم

توجد عمليات تثبيت Tomcat على App Service على Windows في مساحة مشتركة في خطة خدمة التطبيق. لا يمكنك تعديل تثبيت Tomcat مباشرة للتكوين على مستوى الخادم. لإجراء تغييرات تكوين على مستوى الخادم على تثبيت Tomcat، يجب نسخ Tomcat إلى مجلد محلي، حيث يمكنك تعديل تكوين Tomcat.

أتمتة إنشاء Tomcat مخصص عند بدء تشغيل التطبيق

يمكنك استخدام برنامج نصي لبدء التشغيل لتنفيذ إجراءات قبل بدء تشغيل تطبيق ويب. يحتاج البرنامج النصي لبدء التشغيل لتخصيص Tomcat إلى إكمال الخطوات التالية:

  1. تحقق مما إذا كان Tomcat قد تم نسخه وتكوينه محليا بالفعل. إذا كان الأمر كذلك ، يمكن أن ينتهي البرنامج النصي لبدء التشغيل هنا.
  2. نسخ تومكات محليا.
  3. قم بإجراء تغييرات التكوين المطلوبة.
  4. الإشارة إلى أن التكوين قد اكتمل بنجاح.

بالنسبة Windows المواقع، قم بإنشاء ملف باسم startup.cmd أو startup.ps1 في الدليلwwwroot. سيتم تنفيذ هذا تلقائيا قبل بدء تشغيل خادم Tomcat.

إليك برنامج نصي PowerShell يكمل الخطوات التالية:

    # 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 could not be 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
التحويلات

حالة الاستخدام الشائعة لتخصيص إصدار Tomcat هي تعديل server.xmlcontext.xmlملفات تكوين Tomcat أو web.xml Tomcat. تقوم خدمة التطبيقات بالفعل بتعديل هذه الملفات لتوفير ميزات النظام الأساسي. للاستمرار في استخدام هذه الميزات، من المهم الحفاظ على محتوى هذه الملفات عند إجراء تغييرات عليها. لتحقيق ذلك، نوصي باستخدام تحويل XSL (XSLT)". استخدم تحويل XSL لإجراء تغييرات على ملفات XML مع الحفاظ على المحتويات الأصلية للملف.

مثال على ملف XSLT

يضيف هذا المثال التحويل عقدة موصل جديدة إلى server.xml. لاحظ تحويل الهوية، الذي يحافظ على المحتويات الأصلية للملف.

    <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 is 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 is 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" 
                 keystroreFile="${{user.home}}/.keystore" keystorePass="changeit"
                 clientAuth="false" sslProtocol="TLS" />
    </xsl:template>

    </xsl:stylesheet>
وظيفة لتحويل XSL

يحتوي PowerShell على أدوات مضمنة لتحويل ملفات XML باستخدام تحويلات XSL. البرنامج النصي التالي هو مثال على الدالة التي يمكنك استخدامها startup.ps1 لإجراء التحويل:

    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
    }
إعدادات التطبيق

تحتاج المنصة أيضا إلى معرفة مكان تثبيت الإصدار المخصص من Tomcat. يمكنك تعيين موقع التثبيت في CATALINA_BASE إعداد التطبيق.

يمكنك استخدام Azure CLI لتغيير هذا الإعداد:

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

أو يمكنك تغيير الإعداد يدويا في مدخل Azure:

  1. انتقل إلى الإعدادات>إعدادات التكوينالتطبيق>.
  2. حدد إعداد تطبيق جديد.
  3. استخدم هذه القيم لإنشاء الإعداد:
    1. الاسم: CATALINA_BASE
    2. القيمة: "%LOCAL_EXPANDED%\tomcat"
مثال على startup.ps1

يقوم البرنامج النصي المثال التالي بنسخ Tomcat مخصص إلى مجلد محلي وتنفيذ تحويل XSL ويشير إلى نجاح التحويل:

    # 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 could not be 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
    }

وضع اللمسات الأخيرة على التكوين

أخيرا ، سنضع JARs للسائق في مسار Tomcat classpath ونعيد تشغيل خدمة التطبيق الخاصة بك. تأكد من توفر ملفات برنامج تشغيل JDBC ل Tomcat classloader عن طريق وضعها في الدليل / home/tomcat/lib . (قم بإنشاء هذا الدليل إذا لم يكن موجودا بالفعل.) لتحميل هذه الملفات إلى مثيل App Service، نفذ الخطوات التالية:

  1. في Cloud Shell، ثبت ملحق تطبيق الويب:

    az extension add -–name webapp
    
  2. قم بتشغيل الأمر CLI التالي لإنشاء نفق SSH من النظام المحلي إلى App Service:

    az webapp remote-connection create --resource-group <resource-group-name> --name <app-name> --port <port-on-local-machine>
    
  3. الاتصال إلى منفذ الأنفاق المحلي باستخدام عميل SFTP وقم بتحميل الملفات إلى المجلد /home/tomcat/lib.

بدلا من ذلك، يمكنك استخدام عميل FTP لتحميل برنامج تشغيل JDBC. اتبع هذه الإرشادات للحصول على بيانات اعتماد FTP الخاصة بك.


Tomcat

تنطبق هذه الإرشادات على كافة اتصالات قاعدة البيانات. ستحتاج إلى ملء العناصر النائبة باسم فئة برنامج تشغيل قاعدة البيانات التي اخترتها وملف JAR. يتوفر جدول يحتوي على أسماء الفئات وتنزيلات برامج التشغيل لقواعد البيانات الشائعة.

قاعدة البيانات اسم فئة السائق برنامج تشغيل JDBC
PostgreSQL org.postgresql.Driver تنزيل
MySQL com.mysql.jdbc.Driver تنزيل (اختر "منصة مستقلة")
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver تنزيل

لتكوين Tomcat لاستخدام اتصال قاعدة بيانات Java (JDBC) أو واجهة برمجة تطبيقات Java Persistence (JPA)، قم أولا بتخصيص CATALINA_OPTS متغير البيئة الذي تتم قراءته بواسطة Tomcat عند بدء التشغيل. قم بتعيين هذه القيم من خلال إعداد تطبيق في المكون الإضافي App Service Maven:

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

أو قم بتعيين متغيرات البيئة في صفحة الإعدادات ConfigurationApplication> في مدخل Azure.

بعد ذلك ، حدد ما إذا كان يجب أن يكون مصدر البيانات متاحا لتطبيق واحد أو لجميع التطبيقات التي تعمل على Tomcat servlet.

مصادر البيانات على مستوى التطبيق

  1. قم بإنشاء ملف context.xml في دليل META-INF / الخاص بمشروعك. إنشاء الدليل META-INF/ إذا لم يكن موجودا.

  2. في context.xml، أضف عنصرا Context لربط مصدر البيانات بعنوان JNDI. استبدل driverClassName العنصر النائب باسم فئة السائق من الجدول أعلاه.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${dbuser}"
            driverClassName="<insert your driver class name>"
            username="${dbpassword}"
            password="${connURL}"
        />
    </Context>
    
  3. قم بتحديث web.xml التطبيق لاستخدام مصدر البيانات في التطبيق.

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

الموارد المشتركة على مستوى الخادم

ستتطلب منك إضافة مصدر بيانات مشترك على مستوى الخادم تحرير server.xml Tomcat. أولا ، قم بتحميل برنامج نصي لبدء التشغيل وقم بتعيين المسار إلى البرنامج النصي في أمر ConfigurationStartup>. يمكنك تحميل البرنامج النصي لبدء التشغيل باستخدام FTP.

سيقوم البرنامج النصي لبدء التشغيل بإجراء تحويل xsl إلى ملف server.xml وإخراج ملف xml الناتج إلى /usr/local/tomcat/conf/server.xml. يجب تثبيت البرنامج النصي لبدء التشغيل libxslt عبر apk. يمكن تحميل ملف xsl والبرنامج النصي لبدء التشغيل عبر FTP. فيما يلي مثال على البرنامج النصي لبدء التشغيل.

# 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

يتم توفير مثال على ملف xsl أدناه. يضيف ملف xsl المثال عقدة موصل جديدة إلى 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 is 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 is 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" 
               keystroreFile="${{user.home}}/.keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS" />
  </xsl:template>

</xsl:stylesheet>

وضع اللمسات الأخيرة على التكوين

أخيرا ، ضع JARs برنامج التشغيل في مسار Tomcat classpath وأعد تشغيل خدمة التطبيق.

  1. تأكد من توفر ملفات برنامج تشغيل JDBC ل Tomcat classloader عن طريق وضعها في الدليل / home/tomcat/lib . (قم بإنشاء هذا الدليل إذا لم يكن موجودا بالفعل.) لتحميل هذه الملفات إلى مثيل App Service، نفذ الخطوات التالية:

    1. في Cloud Shell، ثبت ملحق تطبيق الويب:
    az extension add -–name webapp
    
    1. قم بتشغيل الأمر CLI التالي لإنشاء نفق SSH من النظام المحلي إلى App Service:
    az webapp remote-connection create --resource-group <resource-group-name> --name <app-name> --port <port-on-local-machine>
    
    1. الاتصال إلى منفذ الأنفاق المحلي باستخدام عميل SFTP وقم بتحميل الملفات إلى المجلد /home/tomcat/lib.

    بدلا من ذلك، يمكنك استخدام عميل FTP لتحميل برنامج تشغيل JDBC. اتبع هذه الإرشادات للحصول على بيانات اعتماد FTP الخاصة بك.

  2. إذا قمت بإنشاء مصدر بيانات على مستوى الخادم، فأعد تشغيل تطبيق App Service Linux. سيقوم Tomcat بإعادة التعيين إلى /home/tomcat التكوين CATALINA_BASE المحدث واستخدامه.

مصادر بيانات JBoss EAP

هناك ثلاث خطوات أساسية عند تسجيل مصدر بيانات باستخدام JBoss EAP: تحميل برنامج تشغيل JDBC ، وإضافة برنامج تشغيل JDBC كوحدة نمطية ، وتسجيل الوحدة النمطية. App Service هي خدمة استضافة عديمة الجنسية، لذلك يجب برمجة أوامر التكوين لإضافة وحدة مصدر البيانات وتسجيلها وتطبيقها عند بدء تشغيل الحاوية.

  1. احصل على برنامج تشغيل JDBC الخاص بقاعدة البيانات.

  2. إنشاء ملف تعريف وحدة XML النمطية لبرنامج تشغيل JDBC. المثال الموضح أدناه هو تعريف الوحدة النمطية ل 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. ضع أوامر JBoss CLI في ملف باسم jboss-cli-commands.cli. يجب أن تضيف أوامر JBoss الوحدة النمطية وتسجيلها كمصدر بيانات. يوضح المثال أدناه أوامر JBoss CLI ل 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. إنشاء برنامج نصي لبدء التشغيل، startup_script.sh الذي يستدعي أوامر JBoss CLI. يوضح المثال أدناه كيفية الاتصال بك jboss-cli-commands.cli. في وقت لاحق ، ستقوم بتكوين App Service لتشغيل هذا البرنامج النصي عند بدء تشغيل الحاوية.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
    
  5. باستخدام عميل FTP من اختيارك ، قم بتحميل برنامج تشغيل JDBC الخاص بك ، ، jboss-cli-commands.clistartup_script.shوتعريف الوحدة النمطية إلى /site/deployments/tools/.

  6. قم بتكوين موقعك ليتم تشغيله startup_script.sh عند بدء تشغيل الحاوية. في مدخل Azure، انتقل إلى ConfigurationGeneral>الإعدادات>Startup Command. قم بتعيين حقل أمر بدء التشغيل إلى /home/site/deployments/tools/startup_script.sh. احفظ تغييراتك.

للتأكد من إضافة مصدر البيانات إلى خادم JBoss ، SSH في تطبيق الويب الخاص بك وتشغيله $JBOSS_HOME/bin/jboss-cli.sh --connect. بمجرد اتصالك ب JBoss ، /subsystem=datasources:read-resource قم بتشغيل قائمة بمصادر البيانات لطباعتها.

robots933456 في السجلات

قد تشاهد الرسالة التالية في سجلات الحاوية:

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

بإمكانك تجاهل تلك الرسالة. /robots933456.txt هو مسار عنوان URL وهمي يستخدم "خدمة التطبيقات" للتحقق من إمكانية تقديم الحاوية "طلبات". يُشير رد 404 ببساطة إلى أن المسار غير موجود، ولكنه يتيح لـ"خدمة التطبيقات" معرفة أن الحاوية سليمة وجاهزة للاستجابة للطلبات.

اختيار إصدار وقت تشغيل Java

تتيح خدمة التطبيقات للمستخدمين اختيار الإصدار الرئيسي من JVM ، مثل Java 8 أو Java 11 ، وإصدار التصحيح ، مثل 1.8.0_232 أو 11.0.5. يمكنك أيضا اختيار تحديث إصدار التصحيح تلقائيا مع توفر إصدارات ثانوية جديدة. في معظم الحالات ، يجب أن تستخدم مواقع الإنتاج إصدارات JVM التصحيح المثبتة. سيؤدي ذلك إلى منع حدوث انقطاعات غير متوقعة أثناء التحديث التلقائي لإصدار التصحيح. تستخدم جميع تطبيقات الويب Java JVMs 64 بت ، وهذا غير قابل للتكوين.

إذا كنت تستخدم Tomcat، فيمكنك اختيار تثبيت إصدار التصحيح من Tomcat. على Windows ، يمكنك تثبيت إصدارات التصحيح من JVM و Tomcat بشكل مستقل. على Linux ، يمكنك تثبيت إصدار التصحيح من Tomcat. سيتم أيضا تثبيت إصدار التصحيح من JVM ولكنه غير قابل للتكوين بشكل منفصل.

إذا اخترت تثبيت الإصدار الثانوي ، فستحتاج إلى تحديث الإصدار الثانوي JVM بشكل دوري على الموقع. للتأكد من تشغيل التطبيق الخاص بك على الإصدار الثانوي الأحدث، قم بإنشاء فتحة تدريج وزيادة الإصدار الثانوي على موقع التدريج. بمجرد التأكد من تشغيل التطبيق بشكل صحيح على الإصدار الثانوي الجديد ، يمكنك تبديل فتحات التدريج والإنتاج.

JBoss EAP

التجميع في JBoss EAP

تدعم خدمة التطبيق التجميع لإصدارات JBoss EAP 7.4.1 والإصدارات الأحدث. لتمكين التجميع، يجب دمج تطبيق الويب الخاص بك مع شبكة افتراضية. عندما يتم دمج تطبيق الويب مع شبكة افتراضية ، سيتم إعادة تشغيل تطبيق الويب وسيتم بدء تشغيل JBoss EAP تلقائيا بتكوين مجمع. ستتصل مثيلات JBoss EAP عبر الشبكة الفرعية المحددة في تكامل الشبكة الظاهرية، باستخدام المنافذ الموضحة في متغير البيئة في WEBSITES_PRIVATE_PORTS وقت التشغيل. يمكنك تعطيل التجميع عن طريق إنشاء إعداد تطبيق باسم WEBSITE_DISABLE_CLUSTERING أي قيمة.

ملاحظة

إذا كنت تقوم بتمكين تكامل الشبكة الظاهرية باستخدام قالب ARM ، فستحتاج إلى تعيين الخاصية vnetPrivatePorts يدويا إلى قيمة 2. إذا قمت بتمكين تكامل الشبكة الظاهرية من CLI أو Portal، تعيين هذه الخاصية لك تلقائيا.

عند تمكين التجميع، تستخدم مثيلات JBoss EAP بروتوكول اكتشاف JGroups FILE_PING لاكتشاف مثيلات جديدة واستمرار معلومات المجموعة مثل أعضاء المجموعة ومعرفاتهم وعناوين IP الخاصة بهم. في خدمة التطبيقات، تكون هذه الملفات ضمن /home/clusterinfo/. سيحصل مثيل EAP الأول الذي يبدأ تشغيله على أذونات قراءة/كتابة على ملف عضوية نظام المجموعة. ستقوم مثيلات أخرى بقراءة الملف والعثور على العقدة الأساسية والتنسيق مع تلك العقدة ليتم تضمينها في الكتلة وإضافتها إلى الملف.

خطط خدمة تطبيق JBoss EAP

لا يتوفر JBoss EAP إلا في أنواع خطة خدمة تطبيقات Premium v3 و v2 المعزولة. يجب على العملاء الذين قاموا بإنشاء موقع JBoss EAP على طبقة مختلفة أثناء المعاينة العامة توسيع نطاق Premium أو طبقة الأجهزة المعزولة لتجنب السلوك غير المتوقع.

بيان وقت تشغيل Java للدعم

إصدارات JDK والصيانة

يتم توفير إصدارات Microsoft و Adoptium من OpenJDK ودعمها على خدمة التطبيقات ل Java 8 و 11 و 17. يتم توفير هذه الثنائيات كتوزيع مجاني ومتعدد المنصات وجاهز للإنتاج ل OpenJDK for Azure. أنها تحتوي على جميع المكونات لبناء وتشغيل تطبيقات Java SE. للتطوير المحلي أو الاختبار، يمكنك تثبيت إصدار Microsoft من OpenJDK من صفحة التنزيلات. يصف الجدول أدناه إصدارات Java الجديدة المضمنة في إصدار النظام الأساسي لخدمة التطبيقات لشهر يناير 2022:

إصدار جافا Linux Windows
Java 8 1.8.0_312 (الزولو) * 1.8.0_312 (تبني)
Java 11 11.0.13 (MSFT) 11.0.13 (MSFT)
جافا 17 17.0.1 (MSFT) 17.0.1 (MSFT)

* في الإصدارات التالية ، سيتم توزيع Java 8 على Linux من إصدارات Adoptium من OpenJDK.

إذا تم تثبيتك بإصدار ثانوي أقدم من Java ، فقد يستخدم موقعك ثنائيات Zulu ل Azure المقدمة من خلال Azul Systems. يمكنك الاستمرار في استخدام هذه الثنائيات لموقعك، ولكن لن تتوفر أي تصحيحات أمان أو تحسينات إلا في الإصدارات الجديدة من OpenJDK، لذلك نوصي بتحديث تطبيقات الويب بشكل دوري إلى إصدار أحدث من Java.

سيتم توفير تحديثات الإصدار الرئيسية من خلال خيارات وقت التشغيل الجديدة في Azure App Service. يقوم العملاء بالتحديث إلى هذه الإصدارات الأحدث من Java من خلال تكوين نشر خدمة التطبيقات الخاصة بهم وهم مسؤولون عن اختبار وضمان تلبية التحديث الرئيسي لاحتياجاتهم.

يتم تصحيح JDKs المدعومة تلقائيا على أساس ربع سنوي في يناير وأبريل ويوليو وأكتوبر من كل عام. لمزيد من المعلومات حول Java على Azure، راجع مستند الدعم هذا.

تحديثات أمنية

سيتم إصدار تصحيحات وإصلاحات لثغرات أمنية كبيرة بمجرد توفرها في إصدارات Microsoft من OpenJDK. يتم تعريف الثغرة الأمنية "الرئيسية" من خلال درجة أساس 9.0 أو أعلى على نظام تسجيل نقاط الضعف المشتركة NIST، الإصدار 2.

وصل Tomcat 8.0 إلى نهاية الحياة (EOL) اعتبارا من 30 سبتمبر 2018. على الرغم من أن وقت التشغيل لا يزال متاحا على Azure App Service، فلن يطبق Azure تحديثات الأمان على Tomcat 8.0. إذا كان ذلك ممكنا، قم بترحيل تطبيقاتك إلى Tomcat 8.5 أو 9.0. يتوفر كل من Tomcat 8.5 و 9.0 على Azure App Service. راجع موقع Tomcat الرسمي لمزيد من المعلومات.

سيتم إنهاء دعم المجتمع ل Java 7 في 29 يوليو 2022 وسيتم إيقاف Java 7 من خدمة التطبيقات في ذلك الوقت. إذا كان لديك تطبيق ويب يعمل على Java 7 ، فيرجى الترقية إلى Java 8 أو 11 قبل 29 يوليو.

الإهمال والتقاعد

إذا تم إيقاف وقت تشغيل Java مدعوم، منح مطوري Azure الذين يستخدمون وقت التشغيل المتأثر إشعارا بالإهمال قبل ستة أشهر على الأقل من إيقاف وقت التشغيل.

التطوير المحلي

يمكن للمطورين تنزيل إصدار الإنتاج من Azul Zulu Enterprise JDK للتنمية المحلية من موقع تنزيل Azul.

دعم التنمية

يتوفر دعم المنتج ل Microsoft Build of OpenJDK من خلال Microsoft عند التطوير ل Azure أو Azure Stack باستخدام خطة دعم Azure مؤهلة.

الخطوات التالية

تفضل بزيارة مركز Azure for Java Developers للعثور على عمليات التشغيل السريع ل Azure والبرامج التعليمية والوثائق المرجعية ل Java.