Настройка приложения Java для Службы приложений Azure

Примечание.

Для приложений Spring рекомендуется использовать Azure Spring Apps. Однако вы по-прежнему можете использовать службу приложение Azure в качестве назначения. Рекомендации по назначению рабочей нагрузки Java см. в руководстве по назначению рабочей нагрузки Java.

Служба приложений Azure позволяет разработчикам быстро создавать, развертывать и масштабировать веб-приложения на основе пакетов Java SE, Tomcat и JBoss EAP в полностью управляемой службе. Возможно развертывание приложений с подключаемыми модулями Maven из командной строки или в редакторах, например Visual Studio Code, Eclipse или IntelliJ.

Это руководство содержит основные понятия и инструкции для разработчиков для Java, использующих Службу приложений Azure. Если вы раньше не использовали Службу приложений Azure, мы рекомендуем сначала ознакомиться с кратким руководством по Java. Ответы на общие вопросы об использовании службы приложений, не относящиеся к разработке для Java, можно найти в разделе вопросов и ответов о Службе приложений Azure.

Отображение версии 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"

Дополнительные сведения о поддержке версий см. в Служба приложений политике поддержки среды выполнения языка.

Развертывание приложения

Build Tools

Maven

Подключаемый модуль Maven для веб-приложений Azure позволяет легко подготовить проект Maven на Java для веб-приложения Azure с помощью одной команды в корневом каталоге проекта:

mvn com.microsoft.azure:azure-webapp-maven-plugin:2.11.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.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. Настройте подключаемый модуль Gradle для Azure веб-приложения, добавив подключаемый модуль в вашbuild.gradle:

    plugins {
      id "com.microsoft.azure.azurewebapp" version "1.7.1"
    }
    
  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
    

Интерфейсы IDE

Azure поддерживает удобные возможности для разработки Java-приложений в Службе приложений в популярных интегрированных средах разработки Java, включая:

API Kudu

Java SE

Чтобы развернуть файлы JAR в Java SE, используйте конечную точку /api/publish/ сайта Kudu. Дополнительные сведения об этом API см. в этой документации.

Примечание.

Чтобы Служба приложений Azure могла идентифицировать и запускать ваше приложение JAR, ему необходимо назначить имя app.jar. Подключаемый модуль Maven выполняет это автоматически во время развертывания. Если вы не хотите переименовать JAR-файл в app.jar, можно отправить скрипт оболочки с помощью команды, чтобы запустить приложение .jar. Вставьте абсолютный путь в этот скрипт в текстовом поле Файл запуска в разделе конфигурации на портале. Скрипт запуска выполняется не в том каталоге, в который он помещен. Поэтому всегда используйте абсолютные пути для создания ссылок на файлы в скрипте запуска (например, java -jar /home/myapp/myapp.jar).

Tomcat

Чтобы развернуть файлы WAR в Tomcat, используйте конечную точку /api/wardeploy/ для публикации файла архива. Дополнительные сведения об этом API см. в этой документации.

JBoss EAP

Чтобы развернуть файлы WAR в JBoss, используйте конечную точку /api/wardeploy/ для публикации файла архива. Дополнительные сведения об этом API см. в этой документации.

Чтобы развернуть файлы 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. После выполнения проверки подлинности отобразится оболочка в браузере. Здесь можно запускать команды внутри контейнера.

SSL-подключение

Примечание.

Любые изменения, внесенные не в каталоге /home, сохраняются в самом контейнере и не применяются до перезапуска приложения.

Чтобы открыть удаленный сеанс SSH на локальном компьютере см. инструкцию в разделе Открытие сеанса SSH из удаленной оболочки.

Средства диагностики

Встроенные образы Java основаны на операционной системе Alpine Linux. Используйте диспетчер пакетов apk, чтобы установить любые средства или команды для устранения неполадок.

Профилировщик Java

Все среды выполнения Java в службе приложение Azure входят в JDK Flight Recorder для профилирования рабочих нагрузок Java. Его можно использовать для записи событий JVM, системы и приложений и устранения неполадок в приложениях.

Дополнительные сведения о профилировщике Java см. в документации по приложение Azure Аналитика.

«Черный ящик»

Все среды выполнения Java в Служба приложений входят в пакет записи тестов Java. Его можно использовать для записи событий JVM, системы и приложений и устранения неполадок в приложениях Java.

Запись за интервал времени

Для записи времени требуется идентификатор PID (идентификатор процесса) приложения Java. Чтобы найти PID, откройте браузер на сайте SCM веб-приложения по адресу https://<your-site-name>.scm.azurewebsites.net/ProcessExplorer/. На этой странице отображаются запущенные процессы в веб-приложении. Найдите в таблице процесс с именем java и скопируйте соответствующий PID (идентификатор процесса).

Затем откройте консоль отладки на верхней панели инструментов сайта SCM и выполните следующую команду. Замените <pid> идентификатором процесса, скопированным ранее. Эта команда запускает запись 30-секундного профилировщика приложения Java и создает файл с именем timed_recording_example.jfr в каталоге C:\home .

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

Подключитесь к Службе приложений Azure по протоколу 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.

Непрерывная запись

Вы можете использовать средство записи тестов Java для непрерывного профилирования приложения 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-файл, скачайте и установите Java Mission Control. Инструкции по Java Mission Control см. в документации по JMC и инструкциям по установке.

Ведение журнала приложений

Включите ведение журнала приложений с помощью портала Azure или Azure CLI, чтобы настроить службу приложений для записи выходных данных стандартной консоли приложения и потоков ошибок стандартной консоли в локальную файловую систему или хранилище BLOB-объектов Azure. Ведение журнала в локальном экземпляре файловой системы Служба приложений отключено через 12 часов после настройки. Если необходимо более длительное хранение, настройте приложение для записи выходных данных в контейнер больших двоичных объектов. Журналы приложений Java и Tomcat можно найти в каталоге /home/LogFiles/Application/.

Включите ведение журнала приложений с помощью портала Azure или Azure CLI, чтобы настроить службу приложений для записи выходных данных стандартной консоли приложения и потоков ошибок стандартной консоли в локальную файловую систему или хранилище BLOB-объектов Azure. Если необходимо более длительное хранение, настройте приложение для записи выходных данных в контейнер больших двоичных объектов. Журналы приложений Java и Tomcat можно найти в каталоге /home/LogFiles/Application/.

Хранилище BLOB-объектов Azure ведение журнала для приложений на основе Linux можно настроить только с помощью Azure Monitor.

Если приложение использует Logback или Log4j для трассировки, то эти данные трассировки можно передать в Azure Application Insights для просмотра, выполнив инструкции по настройке платформы ведения журнала в разделе Просмотр журналов трассировки Java в Application Insights.

Примечание.

Из-за известной уязвимости CVE-2021-44228 обязательно используйте Log4j версии 2.16 или более поздней.

Настройка

Служба приложений Azure поддерживает настройку с помощью портала Azure и интерфейса командной строки. Ознакомьтесь со следующими статьями о настройке конкретных веб-приложений не на платформе Java:

Локальное копирование содержимого приложения

Задайте параметр JAVA_COPY_ALL приложения, чтобы true скопировать содержимое приложения в локальную рабочую роль из общей файловой системы. Этот параметр помогает устранить проблемы с блокировкой файлов.

Настройка параметров среды выполнения Java

Чтобы настроить выделенную память или другие параметры среды выполнения виртуальной машины Java, создайте параметр приложения с именем JAVA_OPTS с параметрами. При запуске Служба приложений Azure передает этот параметр в качестве переменной среды в среду выполнения Java.

На портале Azure в разделе Параметры приложения для веб-приложения создайте параметр приложения JAVA_OPTS для Java SE или CATALINA_OPTS для Tomcat с другими параметрами, такими как -Xms512m -Xmx1204m.

Чтобы настроить параметр приложения из подключаемого модуля Maven, добавьте теги "параметр/значение" в раздел подключаемого модуля Azure. В следующем примере задаются минимальный и максимальный размеры кучи для Java.

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

Примечание.

При использовании Tomcat в Windows Служба приложений не требуется создать файл web.config.

Разработчики, запускающие отдельное приложение в одном слоте развертывания в плане службы приложений, могут использовать следующие параметры.

  • Экземпляры 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.

Можно также настроить параметр приложения с помощью подключаемого модуля Maven для службы приложений. Добавьте теги имени и значения параметра в конфигурацию подключаемого модуля.

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

Предварительная компиляция JSP-файлов

Чтобы повысить производительность приложений Tomcat, можно скомпилировать JSP-файлы перед развертыванием в службе приложений. Вы можете использовать подключаемый модуль Maven, предоставляемый Apache Sling, или использовать этот файла сборки Ant.

Защита приложений

Для приложений Java, работающих в Службе приложений Azure, предлагается тот же набор рекомендаций по обеспечению безопасности, что и для других приложений.

Аутентификация пользователей (Easy Auth)

Настройте аутентификацию приложения на портале Azure с помощью параметра Проверка подлинности и авторизация. Оттуда можно включить проверку подлинности с помощью идентификатора Microsoft Entra или социальных входов, таких как Facebook, Google или GitHub. На портале Azure можно настроить только один поставщик аутентификации. Дополнительные сведения см. в статье "Настройка приложения Служба приложений для использования входа в Microsoft Entra" и связанных статей для других поставщиков удостоверений. Если необходимо включить несколько поставщиков входа, следуйте инструкциям в разделе "Настройка входов и выходов".

Java SE

Разработчики Spring Boot могут использовать начальное средство Microsoft Entra Spring Boot для защиты приложений с помощью знакомых заметок Spring Security и API. Увеличьте максимальный размер заголовка в файле application.properties. Мы рекомендуем использовать значение 16384.

Tomcat

Приложение Tomcat может получить доступ к утверждениям пользователя непосредственно из сервлета, приведя объект Principal к объекту Map. Объект Map сопоставляет каждый тип утверждения с коллекцией утверждений для этого типа. В следующем примере 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 и его методам. В зависимости от конфигурации Службы приложений также происходит расконсервация следующих методов сервлета:

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

Чтобы отключить эту функцию, создайте параметр приложения с именем WEBSITE_AUTH_SKIP_PRINCIPAL со значением 1. Чтобы отключить все фильтры сервлета, добавленные службой приложений, создайте параметр с именем WEBSITE_SKIP_FILTERS со значением 1.

Настройка TLS/SSL

Чтобы отправить существующий TLS/SSL-сертификат и привязать его к доменному имени приложения, следуйте инструкциям в статье "Защита пользовательского DNS-имени с привязкой TLS/SSL" в службе приложение Azure. Вы также можете настроить приложение для принудительного применения TLS/SSL.

Использование возможностей Key Vault

Azure Key Vault обеспечивает централизованное управление секретами с помощью политик доступа и журнала аудита. Вы можете хранить секреты (например, пароли или строки подключения) в Key Vault и обращаться к этим секретам в приложении с помощью переменных среды.

Сначала следуйте инструкциям, чтобы предоставить приложению доступ к хранилищу ключей и сделать ссылку KeyVault на секрет в параметре приложения. Чтобы проверить, что ссылка разрешается в секрет, можно выполнить печать переменной среды во время удаленного доступа к терминалу Службы приложений.

Чтобы внедрить эти секреты в файл конфигурации Spring или Tomcat, используйте синтаксис внедрения переменных среды (${MY_ENV_VAR}). Дополнительные сведения о файлах конфигурации Spring см. в этой документации по внешним конфигурациям.

Использование хранилища ключей Java

По умолчанию все общедоступные или частные сертификаты, отправленные в Служба приложений Linux, загружаются в соответствующие хранилища ключей Java по мере запуска контейнера. После отправки сертификата необходимо перезапустить Служба приложений, чтобы он был загружен в Хранилище ключей Java. Общедоступные сертификаты загружаются в хранилище ключей в $JRE_HOME/lib/security/cacerts, а частные сертификаты хранятся в $JRE_HOME/lib/security/client.jks.

Для шифрования подключения JDBC с сертификатами в Хранилище ключей Java может потребоваться дополнительная конфигурация. Дополнительные сведения см. в документации по выбранному драйверу JDBC.

Инициализация хранилища ключей Java

Чтобы инициализировать объект import java.security.KeyStore, загрузите файл хранилища ключей с паролем. Пароль по умолчанию для обоих хранилищ ключей — 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());

Загрузка хранилища ключей вручную

Сертификаты можно загрузить в хранилище ключей вручную. Создайте параметр приложения SKIP_JAVA_KEYSTORE_LOAD со значением 1, чтобы отключить автоматическую загрузку сертификатов в хранилище ключей Службой приложений. Все общедоступные сертификаты, отправленные в Службу приложений через портал Azure, хранятся в /var/ssl/certs/. Закрытые сертификаты хранятся в /var/ssl/private/.

Вы можете взаимодействовать с инструментом для работы с ключами Java или отлаживать его, открыв SSH-подключение к Службе приложений и выполнив команду keytool. Список команд см. в документации по инструменту для работы с ключами. Дополнительные сведения об API KeyStore см . в официальной документации.

Настройка платформ APM

В этом разделе показано, как подключить приложения Java, развернутые на платформах приложение Azure мониторинга производительности приложений (APM) Azure Monitor Аналитика, NewRelic и AppDynamics.

Настройка Application Insights

Приложение Azure Monitor Аналитика — это облачная служба мониторинга приложений, которая позволяет клиентам наблюдать за сбоями, узкими местами и шаблонами использования, чтобы повысить производительность приложений и сократить среднее время разрешения (MTTR). С помощью нескольких щелчков или команд CLI вы можете включить мониторинг для приложений Node.js или Java, автозабор журналов, метрик и распределенных трассировок, устраняя необходимость включения пакета SDK в приложение. Дополнительные сведения о доступных параметрах приложения для настройки агента см. в документации по приложению Аналитика.

Портал Azure

Чтобы включить Application Insights на портале Azure, перейдите в раздел Application Insights в меню слева и выберите Включить Application Insights. По умолчанию используется новый ресурс Application Insights с тем же именем, что и веб-приложение. Вы можете выбрать существующий ресурс Application Insights или изменить имя нового ресурса. Выберите "Применить" внизу.

Azure CLI

Чтобы включить с помощью Azure CLI, необходимо создать ресурс application Аналитика и задать несколько параметров приложения в портал Azure для подключения приложения Аналитика к веб-приложению.

  1. Включение расширения Application Insights

    az extension add -n application-insights
    
  2. Создайте ресурс приложения Аналитика с помощью следующей команды CLI. Замените значения заполнителей нужными именами ресурса и группы.

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

    Обратите внимание на значения и instrumentationKey, эти значения connectionString потребуются на следующем шаге.

    Чтобы получить список других расположений, выполните 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"
    

Настройка New Relic

  1. Создайте учетную запись NewRelic на сайте NewRelic.com

  2. Скачайте агент Java из NewRelic. Он имеет имя файла, аналогичное newrelic-java-x.x.x.zip.

  3. Скопируйте ключ лицензии, вам потребуется настроить агент позже.

  4. Подключитесь к экземпляру службы приложений по протоколу SSH и создайте каталог /home/site/wwwroot/apm.

  5. Отправьте распакованные файлы агента Java NewRelic в каталог /home/site/wwwroot/apm. Файлы агента должны располагаться в /home/site/wwwroot/apm/newrelic.

  6. Измените файл YAML в каталоге /home/site/wwwroot/apm/newrelic/newrelic.yml и замените значение лицензии в заполнителе собственным ключом лицензии.

  7. На портале Azure перейдите к приложению в службе приложений и создайте параметр приложения.

    • Для приложений 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. Отправьте распакованные файлы агента Java NewRelic в каталог /home/site/wwwroot/apm. Файлы агента должны располагаться в /home/site/wwwroot/apm/newrelic.

  6. Измените файл YAML в каталоге /home/site/wwwroot/apm/newrelic/newrelic.yml и замените значение лицензии в заполнителе собственным ключом лицензии.

  7. На портале Azure перейдите к приложению в службе приложений и создайте параметр приложения.

    • Для приложений 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. Отправьте файлы агента Java в каталог /home/site/wwwroot/apm. Файлы агента должны располагаться в /home/site/wwwroot/apm/appdynamics.

  5. На портале Azure перейдите к приложению в службе приложений и создайте параметр приложения.

    • Для приложений Java SE создайте переменную среды JAVA_OPTS со значением -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name>, где <app-name> — имя Службы приложений Azure.
    • Для Tomcat создайте переменную среды CATALINA_OPTS со значением -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name>, где <app-name> — имя Службы приложений Azure.
  1. Создайте учетную запись AppDynamics на сайте AppDynamics.com

  2. Скачайте агент Java с веб-сайта AppDynamics. Имя файла похоже на AppServerAgent-x.x.x.xxxxx.zip

  3. Подключитесь к экземпляру службы приложений по протоколу SSH и создайте каталог /home/site/wwwroot/apm.

  4. Отправьте файлы агента Java в каталог /home/site/wwwroot/apm. Файлы агента должны располагаться в /home/site/wwwroot/apm/appdynamics.

  5. На портале Azure перейдите к приложению в службе приложений и создайте параметр приложения.

    • Для приложений Java SE создайте переменную среды JAVA_OPTS со значением -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name>, где <app-name> — имя Службы приложений Azure.
    • Для Tomcat создайте переменную среды CATALINA_OPTS со значением -javaagent:/home/site/wwwroot/apm/appdynamics/javaagent.jar -Dappdynamics.agent.applicationName=<app-name>, где <app-name> — имя Службы приложений Azure.

Примечание.

Если у вас уже есть переменная среды 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 Скачать (выберите "Platform Independent" (Независимо от платформы))
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Скачать

Чтобы настроить Tomcat для использования Java Database Connectivity (JDBC) или Java Persistence API (JPA), сначала настройте переменную среды CATALINA_OPTS, считываемую Tomcat при запуске. Задайте эти значения с помощью параметра приложения в подключаемом модуле Maven для службы приложений:

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

Переменные среды можно также задать на странице Конфигурация>Параметры приложения на портале Azure.

Затем определите, должен ли источник данных быть доступным для одного приложения или для всех приложений, работающих в сервлете Tomcat.

Источники данных уровня приложения

  1. Создайте файл context.xml в каталоге проекта META-INF/. Создайте каталог META-INF или, если он не существует.

  2. В context.xml добавьте элемент Context, чтобы связать источник данных с адресом JNDI. Замените заполнитель driverClassName именем класса драйвера из приведенной выше таблицы.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </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 в Службе приложений в Windows существуют в общем пространстве в плане службы приложений. Нельзя напрямую изменить установку Tomcat для конфигурации на уровне сервера. Чтобы внести изменения в конфигурацию установки Tomcat на уровне сервера, необходимо скопировать Tomcat в локальную папку, в которой можно изменить конфигурацию Tomcat.

Автоматизация создания пользовательской версии Tomcat при запуске приложения

Скрипт запуска можно использовать для выполнения действий перед запуском веб-приложения. Скрипт запуска для настройки Tomcat должен выполнить следующие действия.

  1. Проверка, что Tomcat уже скопирован и настроен локально. Если это так, скрипт запуска может завершить работу.
  2. Копирование Tomcat локально.
  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 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
Преобразования

Распространенным вариантом использования для настройки версии Tomcat является изменение файлов конфигурации Tomcat server.xml, context.xml или web.xml. Служба приложений уже изменяет эти файлы для предоставления функций платформы. Чтобы продолжить использовать этих функций, важно сохранить содержимое этих файлов при внесении в них изменений. Для этого рекомендуется использовать преобразование 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'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>
Функция для преобразования 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 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
    }

Завершение конфигурации

Наконец, вы поместите JAR драйвера в путь к классу Tomcat и перезапустите Служба приложений. Убедитесь, что файлы драйверов JDBC доступны для классзагрузчика Tomcat, поместив их в каталог /home/site/lib . В Cloud Shell запустите az webapp deploy --type=lib для каждого JAR-файла драйвера:

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

Tomcat

Эти инструкции применимы ко всем подключениям к базе данных. Заполнители необходимо заполнить именем класса драйвера выбранной базы данных и JAR-файлом. Ниже приведена таблица с именами классов и ссылками для скачивания драйверов для распространенных баз данных.

База данных Имя класса драйвера драйвер JDBC.
PostgreSQL org.postgresql.Driver Скачать
MySQL com.mysql.jdbc.Driver Скачать (выберите "Platform Independent" (Независимо от платформы))
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Скачать

Чтобы настроить Tomcat для использования Java Database Connectivity (JDBC) или Java Persistence API (JPA), сначала настройте переменную среды CATALINA_OPTS, считываемую Tomcat при запуске. Задайте эти значения с помощью параметра приложения в подключаемом модуле Maven для службы приложений:

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

Переменные среды можно также задать на странице Конфигурация>Параметры приложения на портале Azure.

Затем определите, должен ли источник данных быть доступным для одного приложения или для всех приложений, работающих в сервлете Tomcat.

Источники данных уровня приложения

  1. Создайте файл context.xml в каталоге проекта META-INF/. Создайте каталог META-INF или, если он не существует.

  2. В context.xml добавьте элемент Context, чтобы связать источник данных с адресом JNDI. Замените заполнитель driverClassName именем класса драйвера из приведенной выше таблицы.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </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. Сначала отправьте сценарий запуска и задайте путь к скрипту в разделе Конфигурация>Команда запуска. Сценарий запуска можно добавить с помощью 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-файл добавляет новый узел соединителя в 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>

Завершение конфигурации

Наконец, разместите JAR-файлы драйверов в пути к классам Tomcat и перезапустите службу приложений.

  1. Убедитесь, что файлы драйверов JDBC доступны для классзагрузчика Tomcat, поместив их в каталог /home/site/lib . В Cloud Shell запустите az webapp deploy --type=lib для каждого JAR-файла драйвера:
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

Если вы создали источник данных на уровне сервера, перезапустите приложение Linux службы приложений. Tomcat сбросит CATALINA_BASE до значения /home/tomcat и будет использовать обновленную конфигурацию.

Источники данных EAP JBoss

Для регистрации источника данных с помощью JBoss EAP необходимо выполнить три основных шага: передать драйвер JDBC, добавить драйвер JDBC в качестве модуля и зарегистрировать модуль. Служба приложений — это служба размещения без отслеживания состояния, поэтому команды конфигурации для добавления и регистрации модуля источника данных необходимо внести в скрипт и применить при запуске контейнера.

  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 в файл jboss-cli-commands.cli. Команды JBoss должны добавить модуль и зарегистрировать его в качестве источника данных. В следующем примере показаны команды интерфейса командной строки JBoss для 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. В следующем примере показано, как вызвать объект jboss-cli-commands.cli. Позже вы настроите Служба приложений для запуска этого скрипта при запуске контейнера.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
    
  5. С помощью любого FTP-клиента передайте драйвер JDBC jboss-cli-commands.cli, startup_script.sh и определение модуля в /site/deployments/tools/.

  6. Настройте сайт для выполнения startup_script.sh при запуске контейнера. На портале Azure перейдите к разделу Конфигурация>Общие параметры>Команда запуска. Задайте полю "Команда запуска" значение /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

Служба приложений позволяет пользователям выбрать основной номер версии виртуальной машины Java, например Java 8 или Java 11, а также номер исправления, например 1.8.0_232 или 11.0.5. Кроме того, можно выбрать автоматическое обновление номера исправления при появлении новых дополнительных версий. В большинстве случаев рабочие приложения должны использовать закрепленные версии JVM исправлений. Это предотвращает непредвиденные сбои во время автоматического обновления версии исправлений. Все веб-приложения Java используют 64-разрядные виртуальные машины JVM и не настраивается.

Если вы используете Tomcat, можно закрепить версию исправления Tomcat. На Windows версии исправления виртуальной машины Java и 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. Если включить интеграцию виртуальной сети с помощью интерфейса командной строки или портала, это свойство устанавливается автоматически.

Если кластеризация включена, то экземпляры JBoss EAP используют протокол обнаружения FILE_PING JGroups для обнаружения новых экземпляров и сохранения сведений о кластере, таких как члены кластера, их идентификаторы и IP-адреса. В службе приложений эти файлы находятся в папке /home/clusterinfo/. Первый экземпляр EAP для запуска получает разрешения на чтение и запись в файле членства в кластере. Другие экземпляры считывают файл, находят основной узел и координируется с этим узлом, который необходимо включить в кластер и добавить в файл.

Типы планов службы приложений "Премиум" версии 3 и "Изолированный" версии 2 также можно распределить по зонам доступности для повышения устойчивости и надежности критически важных для бизнеса рабочих нагрузок. Эта архитектура также называется избыточностью между зонами. Функция JBoss EAP кластеризация совместима с функцией избыточности зоны.

Правила автомасштабирования

При настройке правил автомасштабирования для горизонтального масштабирования важно удалять экземпляры постепенно (по одному за раз), чтобы каждый удаленный экземпляр может передавать свое действие (например, обработку транзакции базы данных) другому члену кластера. При настройке правил автомасштабирования на портале для уменьшения масштаба используйте следующие параметры:

  • Операция: "Уменьшить количество на".
  • Ожидание: "5 минут" или больше.
  • Число экземпляров: 1.

Вам не нужно добавочно добавлять экземпляры (масштабирование), одновременно добавлять несколько экземпляров в кластер.

Планы службы приложений JBoss EAP

JBoss EAP доступен только для типов планов службы приложений "Премиум" версии 3 и "Изолированный" версии 2. Клиенты, которые создали сайт JBoss EAP на другом уровне в общедоступной предварительной версии, должны повысить уровень оборудования до "Премиум" или "Изолированный" во избежание непредвиденного поведения.

Базовая конфигурация Tomcat в Служба приложений

Разработчики Java могут настраивать параметры сервера, устранять проблемы и развертывать приложения в Tomcat с уверенностью, если они знают о файле server.xml и конфигурации Tomcat. Возможные настройки:

  • Настройка конфигурации Tomcat: понимая сведения о конфигурации server.xml и сведения о конфигурации Tomcat, можно точно настроить параметры сервера в соответствии с потребностями своих приложений.
  • Отладка. При развертывании приложения на сервере Tomcat разработчики должны знать конфигурацию сервера для отладки любых проблем, которые могут возникнуть. Это включает проверка журналы сервера, изучение файлов конфигурации и выявление ошибок, которые могут возникнуть.
  • Устранение неполадок Tomcat: неизбежно разработчики Java сталкиваются с проблемами с сервером Tomcat, такими как проблемы с производительностью или ошибки конфигурации. Понимая server.xml файл и сведения о конфигурации Tomcat, разработчики могут быстро диагностировать и устранять эти проблемы, что может сэкономить время и усилия.
  • Развертывание приложений в Tomcat. Чтобы развернуть веб-приложение Java в Tomcat, разработчикам необходимо знать, как настроить файл server.xml и другие параметры Tomcat. Понимание этих сведений важно для успешного развертывания приложений и обеспечения плавной работы на сервере.

При создании приложения со встроенным tomcat для размещения рабочей нагрузки Java (WAR-файла или JAR-файла) существуют определенные параметры, которые вы получаете из поля для конфигурации Tomcat. Для получения подробных сведений см. официальную документацию по Apache Tomcat, включая конфигурацию по умолчанию для веб-сервера Tomcat.

Кроме того, существуют некоторые преобразования, которые применяются далее поверх server.xml распределения Tomcat при запуске. Это преобразования в параметры Подключение or, Host и Valve.

Обратите внимание, что последние версии Tomcat имеют server.xml (8.5.58 и 9.0.38). Старые версии Tomcat не используют преобразования и могут иметь другое поведение в результате.

Соединитель

<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 задано значение 16384
  • URIEncoding задано значение UTF-8
  • conectionTimeout имеет значение WEBSITE_TOMCAT_CONNECTION_TIMEOUT, для которого по умолчанию задано значение 240000
  • maxThreads имеет значение WEBSITE_CATALINA_MAXTHREADS, для которого по умолчанию задано значение 200
  • maxConnections имеет значение WEBSITE_CATALINA_MAXCONNECTIONS, для которого по умолчанию задано значение 10000

Примечание.

Параметры connectionTimeout, maxThreads и max Подключение ions можно настроить с помощью параметров приложения.

Ниже приведены примеры команд CLI, которые можно использовать для изменения значений conectionTimeout, maxThreads или max Подключение 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
  • Подключение or использует адрес контейнера вместо 127.0.0.1

Хост

<Host appBase="${site.appbase}" xmlBase="${site.xmlbase}" unpackWARs="${site.unpackwars}" workDir="${site.tempdir}" errorReportValveClass="com.microsoft.azure.appservice.AppServiceErrorReportValve" name="localhost" autoDeploy="true">
  • appBase имеет значение AZURE_SITE_APP_BASE, для которого по умолчанию задан локальный WebappsLocalPath
  • xmlBase имеет значение AZURE_SITE_HOME, для которого по умолчанию задано значение /site/wwwroot
  • unpackWARs имеет значение AZURE_UNPACK_WARS, для которого по умолчанию задано значение true
  • workDir имеет значение JAVA_TMP_DIR, для которого задано значение по умолчанию TMP
  • errorReportValveClass использует наш настраиваемый клапан отчета об ошибках

Клапан

<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 имеет значение AZURE_LOGGING_DIR, для которого по умолчанию задано значение home\logFiles
  • maxDays значение WEBSITE_HTTPLOGGING_RETENTION_DAYS/>, значение которого по умолчанию 0 равно [навсегда]

В Linux она имеет одну и ту же настройку, а также:

  • Добавляет некоторые страницы ошибок и отчетов в клапан:
               <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>

Следующие шаги

Посетите центр Azure для разработчиков Java, чтобы найти краткие руководства Azure, руководства и справочную документацию по Java.