Implantar e configurar um aplicativo Tomcat, JBoss ou Java SE no Serviço de Aplicativo do Azure
Este artigo mostra a configuração de implementação e tempo de execução mais comum para aplicativos Java no Serviço de Aplicativo. Se você nunca usou o Serviço de Aplicativo do Azure, leia primeiro o início rápido do Java. Perguntas gerais sobre o uso do Serviço de Aplicativo que não são específicas do desenvolvimento Java são respondidas nas Perguntas frequentes do Serviço de Aplicativo.
O Serviço de Aplicativo do Azure executa aplicativos Web Java em um serviço totalmente gerenciado em três variantes:
- Java SE - Pode executar um aplicativo implantado como um pacote JAR que contém um servidor incorporado (como Spring Boot, Dropwizard, Quarkus ou um com um servidor Tomcat ou Jetty incorporado).
- Tomcat - O servidor Tomcat integrado pode executar um aplicativo implantado como um pacote WAR.
- JBoss EAP - Suportado apenas para aplicativos Linux nos níveis de preços Free, Premium v3 e Isolated v2. O servidor JBoss EAP integrado pode executar um aplicativo implantado como um pacote WAR ou EAR.
Nota
Para aplicativos Spring, recomendamos o uso do Azure Spring Apps. No entanto, você ainda pode usar o Serviço de Aplicativo do Azure como destino. Consulte Java Workload Destination Guidance para obter conselhos.
Mostrar versão do Java
Para mostrar a versão atual do Java, execute o seguinte comando no Cloud Shell:
az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion
Para mostrar todas as versões Java suportadas, execute o seguinte comando no Cloud Shell:
az webapp list-runtimes --os linux | grep "JAVA\|TOMCAT\|JBOSSEAP"
Para obter mais informações sobre o suporte à versão, consulte Política de suporte ao tempo de execução do idioma do Serviço de Aplicativo.
Implantando seu aplicativo
Build Tools
Maven
Com o plug-in Maven para Aplicativos Web do Azure, você pode preparar seu projeto Maven Java para o Aplicativo Web do Azure facilmente com um comando na raiz do projeto:
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.13.0:config
Este comando adiciona um plug-in e uma azure-webapp-maven-plugin
configuração relacionada, solicitando que você selecione um Aplicativo Web do Azure existente ou crie um novo. Durante a configuração, ele tenta detetar se seu aplicativo deve ser implantado em Java SE, Tomcat ou (somente Linux) JBoss EAP. Em seguida, você pode implantar seu aplicativo Java no Azure usando o seguinte comando:
mvn package azure-webapp:deploy
Aqui está um exemplo de configuração em 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 17</javaVersion>
</runtime>
<deployment>
<resources>
<resource>
<type>jar</type>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
</deployment>
</configuration>
</plugin>
Gradle
Configure o plug-in Gradle para Aplicativos Web do Azure adicionando o plug-in ao seu
build.gradle
:plugins { id "com.microsoft.azure.azurewebapp" version "1.10.0" }
Configure os detalhes do seu aplicativo Web. Os recursos correspondentes do Azure são criados se não existirem. Aqui está um exemplo de configuração, para obter detalhes, consulte este documento.
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 10.0' // or 'Java SE' if you want to run an executable jar javaVersion = 'Java 17' } appSettings { <key> = <value> } auth { type = 'azure_cli' // support azure_cli, oauth2, device_code and service_principal } }
Implante com um comando.
gradle azureWebAppDeploy
IDEs
O Azure fornece uma experiência de desenvolvimento perfeita do Java App Service em IDEs Java populares, incluindo:
- VS Code: Java Web Apps com Visual Studio Code
- IntelliJ IDEA:Criar um aplicativo Web Hello World para o Serviço de Aplicativo do Azure usando o IntelliJ
- Eclipse:Criar um aplicativo Web Hello World para o Serviço de Aplicativo do Azure usando o Eclipse
Kudu API
Para implementar arquivos .jar no Java SE, use o /api/publish
endpoint do site Kudu. Para obter mais informações sobre essa API, consulte esta documentação.
Nota
Seu aplicativo .jar deve ser nomeado app.jar
para o Serviço de Aplicativo para identificar e executar seu aplicativo. O plug-in Maven faz isso automaticamente durante a implantação. Se você não quiser renomear seu JAR para app.jar, você pode carregar um shell script com o comando para executar seu aplicativo .jar. Cole o caminho absoluto para esse script na caixa de texto Arquivo de inicialização na seção Configuração do portal. O script de inicialização não é executado a partir do diretório no qual foi colocado. Por isso, utilize sempre caminhos absolutos para referenciar ficheiros no script de arranque (por exemplo: java -jar /home/myapp/myapp.jar
).
Para implantar arquivos .war no Tomcat, use o /api/wardeploy/
ponto de extremidade para POSTAR seu arquivo morto. Para obter mais informações sobre essa API, consulte esta documentação.
Para implantar arquivos .war no JBoss, use o /api/wardeploy/
endpoint para POSTAR seu arquivo morto. Para obter mais informações sobre essa API, consulte esta documentação.
Para implantar arquivos .ear, use FTP. Seu aplicativo .ear é implantado na raiz de contexto definida na configuração do aplicativo. Por exemplo, se a raiz de contexto do seu aplicativo for <context-root>myapp</context-root>
, você poderá navegar no site no /myapp
caminho: http://my-app-name.azurewebsites.net/myapp
. Se você quiser que seu aplicativo Web seja servido no caminho raiz, certifique-se de que seu aplicativo defina a raiz de contexto para o caminho raiz: <context-root>/</context-root>
. Para obter mais informações, consulte Definindo a raiz de contexto de um aplicativo Web.
Não implante seu .war ou .jar usando FTP. A ferramenta FTP foi projetada para carregar scripts de inicialização, dependências ou outros arquivos de tempo de execução. Não é a escolha ideal para implantar aplicativos Web.
Reescrever ou redirecionar URL
Para reescrever ou redirecionar URL, use um dos reescritores de URL disponíveis, como UrlRewriteFilter.
O Tomcat também fornece uma válvula de reescrita.
O JBoss também fornece uma válvula de reescrita.
Registro em log e depuração de aplicativos
Relatórios de desempenho, visualizações de tráfego e verificações de integridade estão disponíveis para cada aplicativo por meio do portal do Azure. Para obter mais informações, consulte Visão geral do diagnóstico do Serviço de Aplicativo do Azure.
Transmitir registos de diagnóstico em fluxo
Você pode acessar os logs do console gerados de dentro do contêiner.
Primeiro, ative o log de contêiner executando o seguinte comando:
az webapp log config --name <app-name> --resource-group <resource-group-name> --docker-container-logging filesystem
Substitua <app-name>
e <resource-group-name>
pelos nomes apropriados para seu aplicativo Web.
Quando o log de contêiner estiver ativado, execute o seguinte comando para ver o fluxo de log:
az webapp log tail --name <app-name> --resource-group <resource-group-name>
Se não vir os registos da consola imediatamente, volte a consultar dentro de 30 segundos.
Para interromper o streaming de logs a qualquer momento, digite Ctrl+C.
Você também pode inspecionar os arquivos de log em um navegador em https://<app-name>.scm.azurewebsites.net/api/logs/docker
.
Para obter mais informações, consulte Transmitir logs no Cloud Shell.
Acesso ao console SSH no Linux
Para abrir uma sessão SSH direta com o seu contentor, a sua aplicação deve estar em execução.
Cole o seguinte URL no browser e substitua <app-name>
pelo nome da aplicação:
https://<app-name>.scm.azurewebsites.net/webssh/host
Se ainda não estiver autenticado, é necessário fazê-lo com a sua subscrição do Azure para se ligar. Uma vez autenticado, pode ver uma shell no browser, na qual pode executar comandos dentro do seu contentor.
Nota
Todas as alterações realizadas fora do diretório /home são armazenadas no próprio contentor e não persistem para além do reinício da aplicação.
Para abrir uma sessão SSH remota a partir do computador local, veja Abrir sessão SSH a partir da shell remota.
Ferramentas de solução de problemas do Linux
As imagens Java incorporadas são baseadas no sistema operacional Alpine Linux . Use o gerenciador de apk
pacotes para instalar quaisquer ferramentas ou comandos de solução de problemas.
Criador de perfis Java
Todos os tempos de execução Java no Serviço de Aplicativo do Azure vêm com o JDK Flight Recorder para criar o perfil de cargas de trabalho Java. Você pode usá-lo para registrar eventos da JVM, do sistema e do aplicativo e solucionar problemas em seus aplicativos.
Para saber mais sobre o Java Profiler, visite a documentação do Azure Application Insights.
Gravador de voo
Todos os tempos de execução Java no Serviço de Aplicativo vêm com o Java Flight Recorder. Você pode usá-lo para registrar eventos da JVM, do sistema e do aplicativo e solucionar problemas em seus aplicativos Java.
SSH em seu Serviço de Aplicativo e execute o jcmd
comando para ver uma lista de todos os processos Java em execução. Além de si mesmo, você deve ver seu aplicativo Java em execução com um número de ID de jcmd
processo (pid).
078990bbcd11:/home# jcmd
Picked up JAVA_TOOL_OPTIONS: -Djava.net.preferIPv4Stack=true
147 sun.tools.jcmd.JCmd
116 /home/site/wwwroot/app.jar
Execute o seguinte comando para iniciar uma gravação de 30 segundos da JVM. Ele cria o perfil da JVM e cria um arquivo JFR chamado jfr_example.jfr no diretório base. (Substitua o 116 pelo pid do seu aplicativo Java.)
jcmd 116 JFR.start name=MyRecording settings=profile duration=30s filename="/home/jfr_example.jfr"
Durante o intervalo de 30 segundos, você pode validar que a gravação está ocorrendo executando jcmd 116 JFR.check
. O comando mostra todas as gravações para o processo Java dado.
Gravação contínua
Você pode usar o Java Flight Recorder para criar continuamente o perfil de seu aplicativo Java com impacto mínimo no desempenho do tempo de execução. Para fazer isso, execute o seguinte comando da CLI do Azure para criar uma Configuração de Aplicativo chamada JAVA_OPTS com a configuração necessária. O conteúdo da Configuração do Aplicativo JAVA_OPTS é passado para o java
comando quando seu aplicativo é iniciado.
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
Uma vez que a gravação é iniciada, você pode despejar os dados de gravação atuais a qualquer momento usando o JFR.dump
comando.
jcmd <pid> JFR.dump name=continuous_recording filename="/home/recording1.jfr"
Analise .jfr
arquivos
Use FTPS para baixar seu arquivo JFR para sua máquina local. Para analisar o arquivo JFR, baixe e instale o Java Mission Control. Para obter instruções sobre o Java Mission Control, consulte a documentação do JMC e as instruções de instalação.
Registo de aplicações
Habilite o log do aplicativo por meio do portal do Azure ou da CLI do Azure para configurar o Serviço de Aplicativo para gravar a saída padrão do console do seu aplicativo e os fluxos de erro padrão do console no sistema de arquivos local ou no Armazenamento de Blobs do Azure. Se você precisar de retenção mais longa, configure o aplicativo para gravar a saída em um contêiner de armazenamento de Blob.
Seus logs de aplicativos Java e Tomcat podem ser encontrados no diretório /home/LogFiles/Application/ .
O log do Armazenamento de Blobs do Azure para aplicativos baseados em Linux só pode ser configurado usando o Azure Monitor.
Se seu aplicativo usa Logback ou Log4j para rastreamento, você pode encaminhar esses rastreamentos para revisão no Azure Application Insights usando as instruções de configuração da estrutura de log em Explore Java trace logs in Application Insights.
Nota
Devido à vulnerabilidade conhecida CVE-2021-44228, certifique-se de usar o Log4j versão 2.16 ou posterior.
Personalização e ajuste
O Serviço de Aplicativo do Azure dá suporte ao ajuste e à personalização prontos para uso por meio do portal do Azure e da CLI. Analise os seguintes artigos para obter informações sobre a configuração de aplicativos Web não específicos do Java:
- Definir definições da aplicação
- Configurar um domínio personalizado
- Configurar ligações TLS/SSL
- Adicionar uma CDN
- Configurar o site do Kudu
Copiar conteúdo do aplicativo localmente
Defina a configuração JAVA_COPY_ALL
do aplicativo para true
copiar o conteúdo do aplicativo para o trabalhador local do sistema de arquivos compartilhado. Essa configuração ajuda a resolver problemas de bloqueio de arquivos.
Definir opções de tempo de execução Java
Para definir a memória alocada ou outras opções de tempo de execução da JVM, crie uma configuração de aplicativo nomeada JAVA_OPTS
com as opções. O Serviço de Aplicativo passa essa configuração como uma variável de ambiente para o tempo de execução do Java quando ele é iniciado.
No portal do Azure, em Configurações do Aplicativo para o aplicativo Web, crie uma nova configuração de aplicativo chamada JAVA_OPTS
que inclua outras configurações, como -Xms512m -Xmx1204m
.
No portal do Azure, em Configurações do Aplicativo para o aplicativo Web, crie uma nova configuração de aplicativo chamada CATALINA_OPTS
que inclua outras configurações, como -Xms512m -Xmx1204m
.
Para definir a configuração do aplicativo a partir do plug-in Maven, adicione tags de configuração/valor na seção do plug-in do Azure. O exemplo a seguir define um tamanho de heap Java mínimo e máximo específico:
<appSettings>
<property>
<name>JAVA_OPTS</name>
<value>-Xms1024m -Xmx1024m</value>
</property>
</appSettings>
Nota
Você não precisa criar um arquivo web.config ao usar o Tomcat no Serviço de Aplicativo do Windows.
Os desenvolvedores que executam um único aplicativo com um slot de implantação em seu plano do Serviço de Aplicativo podem usar as seguintes opções:
- Instâncias B1 e S1:
-Xms1024m -Xmx1024m
- Instâncias B2 e S2:
-Xms3072m -Xmx3072m
- Instâncias B3 e S3:
-Xms6144m -Xmx6144m
- Instâncias P1v2:
-Xms3072m -Xmx3072m
- Instâncias P2v2:
-Xms6144m -Xmx6144m
- Instâncias P3v2:
-Xms12800m -Xmx12800m
- Instâncias P1v3:
-Xms6656m -Xmx6656m
- Instâncias P2v3:
-Xms14848m -Xmx14848m
- Instâncias P3v3:
-Xms30720m -Xmx30720m
- Instâncias I1:
-Xms3072m -Xmx3072m
- Instâncias I2:
-Xms6144m -Xmx6144m
- Instâncias I3:
-Xms12800m -Xmx12800m
- Instâncias I1v2:
-Xms6656m -Xmx6656m
- Instâncias I2v2:
-Xms14848m -Xmx14848m
- Instâncias I3v2:
-Xms30720m -Xmx30720m
Ao ajustar as configurações de heap de aplicativos, revise os detalhes do plano do Serviço de Aplicativo e leve em consideração as necessidades de vários aplicativos e slots de implantação para encontrar a alocação ideal de memória.
Ativar soquetes da Web
Ative o suporte para soquetes da Web no portal do Azure nas configurações do aplicativo para o aplicativo. Você precisa reiniciar o aplicativo para que a configuração entre em vigor.
Ative o suporte a soquete da Web usando a CLI do Azure com o seguinte comando:
az webapp config set --name <app-name> --resource-group <resource-group-name> --web-sockets-enabled true
Em seguida, reinicie o aplicativo:
az webapp stop --name <app-name> --resource-group <resource-group-name>
az webapp start --name <app-name> --resource-group <resource-group-name>
Definir codificação de caracteres padrão
No portal do Azure, em Configurações do Aplicativo para o aplicativo Web, crie uma nova configuração de aplicativo nomeada JAVA_OPTS
com valor -Dfile.encoding=UTF-8
.
Como alternativa, você pode definir a configuração do aplicativo usando o plug-in do Serviço de Aplicativo Maven. Adicione o nome da configuração e as tags de valor na configuração do plugin:
<appSettings>
<property>
<name>JAVA_OPTS</name>
<value>-Dfile.encoding=UTF-8</value>
</property>
</appSettings>
Pré-compilação de arquivos JSP
Para melhorar o desempenho dos aplicativos Tomcat, você pode compilar seus arquivos JSP antes de implantar no Serviço de Aplicativo. Você pode usar o plug-in Maven fornecido pelo Apache Sling ou usar este arquivo de compilação Ant.
robots933456 nos registos
Pode ver a seguinte mensagem nos registos do contentor:
2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"
Pode ignorar esta mensagem. /robots933456.txt
é um caminho de URL fictício que o Serviço de Aplicações utiliza para verificar se o contentor consegue satisfazer pedidos. Uma resposta 404 indica simplesmente que o caminho não existe, mas permite que o Serviço de Aplicações saiba que o contentor está em bom estado de funcionamento e pronto para responder aos pedidos.
Escolhendo uma versão de tempo de execução Java
O Serviço de Aplicativo permite que os usuários escolham a versão principal da JVM, como Java 8 ou Java 11, e a versão do patch, como 1.8.0_232 ou 11.0.5. Você também pode optar por ter a versão do patch atualizada automaticamente à medida que novas versões secundárias ficam disponíveis. Na maioria dos casos, os aplicativos de produção devem usar versões JVM de patch fixo. Isso evita interrupções imprevistas durante uma atualização automática da versão do patch. Todos os aplicativos Web Java usam JVMs de 64 bits e não são configuráveis.
Se estiver a utilizar o Tomcat, pode optar por fixar a versão do patch do Tomcat. No Windows, você pode fixar as versões de patch da JVM e do Tomcat de forma independente. No Linux, você pode fixar a versão patch do Tomcat; a versão de patch da JVM também é fixada, mas não é configurável separadamente.
Se você optar por fixar a versão secundária, precisará atualizar periodicamente a versão secundária da JVM no aplicativo. Para garantir que seu aplicativo seja executado na versão secundária mais recente, crie um slot de preparo e incremente a versão secundária no slot de preparo. Depois de confirmar que o aplicativo é executado corretamente na nova versão secundária, você pode trocar os slots de preparação e produção.
Executar a CLI do JBoss
Na sessão SSH do aplicativo JBoss, você pode executar a CLI do JBoss com o seguinte comando:
$JBOSS_HOME/bin/jboss-cli.sh --connect
Dependendo de onde o JBoss está no ciclo de vida do servidor, talvez não seja possível se conectar. Aguarde alguns minutos e tente novamente. Essa abordagem é útil para verificações rápidas do estado atual do servidor (por exemplo, para ver se uma fonte de dados está configurada corretamente).
Além disso, as alterações feitas no servidor com a CLI do JBoss na sessão SSH não persistem após a reinicialização do aplicativo. Sempre que o aplicativo é iniciado, o servidor JBoss EAP começa com uma instalação limpa. Durante o ciclo de vida de inicialização, o Serviço de Aplicativo faz as configurações de servidor necessárias e implanta o aplicativo. Para fazer alterações persistentes no servidor JBoss, use um script de inicialização personalizado ou um comando de inicialização. Para obter um exemplo completo, consulte Configurar fontes de dados para um aplicativo Tomcat, JBoss ou Java SE no Serviço de Aplicativo do Azure.
Como alternativa, você pode configurar manualmente o Serviço de Aplicativo para executar qualquer arquivo na inicialização. Por exemplo:
az webapp config set --resource-group <group-name> --name <app-name> --startup-file /home/site/scripts/foo.sh
Para obter mais informações sobre os comandos da CLI que você pode executar, consulte:
Clustering
O Serviço de Aplicativo oferece suporte a clustering para JBoss EAP versões 7.4.1 e superiores. Para habilitar o clustering, seu aplicativo Web deve ser integrado a uma rede virtual. Quando o aplicativo Web é integrado a uma rede virtual, ele é reiniciado e a instalação do JBoss EAP é iniciada automaticamente com uma configuração clusterizada. Quando você executa várias instâncias com dimensionamento automático, as instâncias EAP do JBoss se comunicam entre si pela sub-rede especificada na integração de rede virtual. Você pode desabilitar o clustering criando uma configuração de aplicativo nomeada WEBSITE_DISABLE_CLUSTERING
com qualquer valor.
Nota
Se você estiver habilitando sua integração de rede virtual com um modelo ARM, precisará definir manualmente a propriedade vnetPrivatePorts
como um valor de 2
. Se você habilitar a integração de rede virtual a partir da CLI ou do Portal, essa propriedade será definida para você automaticamente.
Quando o clustering está habilitado, as instâncias do JBoss EAP usam o protocolo de descoberta JGroups FILE_PING para descobrir novas instâncias e manter as informações do cluster, como os membros do cluster, seus identificadores e seus endereços IP. No Serviço de Aplicativo, esses arquivos estão em /home/clusterinfo/
. A primeira instância EAP a iniciar obtém permissões de leitura/gravação no arquivo de associação do cluster. Outras instâncias leem o arquivo, localizam o nó primário e coordenam-se com esse nó a ser incluído no cluster e adicionado ao arquivo.
Nota
Você pode evitar tempos limite de clustering JBoss limpando arquivos de descoberta obsoletos durante a inicialização do aplicativo.
Os tipos Premium V3 e Isolated V2 App Service Plan podem, opcionalmente, ser distribuídos entre zonas de disponibilidade para melhorar a resiliência e a confiabilidade para suas cargas de trabalho críticas para os negócios. Essa arquitetura também é conhecida como redundância de zona. O recurso de clustering JBoss EAP é compatível com o recurso de redundância de zona.
Regras de dimensionamento automático
Ao configurar regras de dimensionamento automático para dimensionamento horizontal, é importante remover instâncias incrementalmente (uma de cada vez) para garantir que cada instância removida possa transferir sua atividade (como lidar com uma transação de banco de dados) para outro membro do cluster. Ao configurar suas regras de dimensionamento automático no Portal para reduzir a escala, use as seguintes opções:
- Operação: "Diminuir contagem por"
- Arrefecimento: "5 minutos" ou superior
- Contagem de instâncias: 1
Você não precisa adicionar instâncias incrementalmente (dimensionamento), você pode adicionar várias instâncias ao cluster de cada vez.
Planos do Serviço de Aplicações
O JBoss EAP está disponível nos seguintes níveis de preços: F1, P0v3, P1mv3, P2mv3, P3mv3, P4mv3 e P5mv3.
Ciclo de vida do servidor JBoss
Um aplicativo JBoss EAP no Serviço de Aplicativo passa por cinco fases distintas antes de realmente iniciar o servidor.
- 1. Fase de configuração do ambiente
- 2. Fase de lançamento do servidor
- 3. Fase de configuração do servidor
- 4. Fase de implementação da aplicação
- 5. Fase de recarga do servidor
Consulte as respetivas seções abaixo para obter detalhes, bem como oportunidades para personalizá-lo (como por meio das configurações do aplicativo).
1. Fase de configuração do ambiente
- O serviço SSH é iniciado para habilitar sessões SSH seguras com o contêiner.
- O Keystore do tempo de execução Java é atualizado com quaisquer certificados públicos e privados definidos no portal do Azure.
- Os certificados públicos são fornecidos pela plataforma no diretório /var/ssl/certs e são carregados no $JRE_HOME/lib/security/cacerts.
- Os certificados privados são fornecidos pela plataforma no diretório /var/ssl/private e são carregados no $JRE_HOME/lib/security/client.jks.
- Se algum certificado for carregado no keystore Java nesta etapa, as propriedades
javax.net.ssl.keyStore
ejavax.net.ssl.keyStorePassword
javax.net.ssl.keyStoreType
serão adicionadas àJAVA_TOOL_OPTIONS
variável de ambiente. - Algumas configurações iniciais da JVM são determinadas, como diretórios de log e parâmetros de heap de memória Java:
- Se você fornecer os
–Xms
sinalizadores ou–Xmx
para memória na configuraçãoJAVA_OPTS
do aplicativo, esses valores substituem os fornecidos pela plataforma. - Se você definir a configuração
WEBSITES_CONTAINER_STOP_TIME_LIMIT
do aplicativo, o valor será passado para a propriedadeorg.wildfly.sigterm.suspend.timeout
runtime , que controla o tempo máximo de espera de desligamento (em segundos) quando o JBoss está sendo interrompido.
- Se você fornecer os
- Se o aplicativo estiver integrado a uma rede virtual, o tempo de execução do Serviço de Aplicativo passará uma lista de portas a serem usadas para comunicação entre servidores na variável
WEBSITE_PRIVATE_PORTS
de ambiente e iniciará o JBoss usando aclustering
configuração. Caso contrário, astandalone
configuração será usada.- Para a
clustering
configuração, o arquivo de configuração do servidor standalone-azure-full-ha.xml é usado. - Para a
standalone
configuração, o arquivo de configuração do servidor standalone-full.xml é usado.
- Para a
2. Fase de lançamento do servidor
- Se o
clustering
JBoss for iniciado na configuração:- Cada instância do JBoss recebe um identificador interno entre 0 e o número de instâncias para as quais o aplicativo é expandido.
- Se alguns arquivos forem encontrados no caminho do repositório de transações para essa instância do servidor (usando seu identificador interno), isso significa que essa instância do servidor está substituindo uma instância de serviço idêntica que falhou anteriormente e deixou transações não confirmadas para trás. O servidor está configurado para retomar o trabalho nessas transações.
- Independentemente se o JBoss estiver começando na
clustering
configuração oustandalone
, se a versão do servidor for 7.4 ou superior e o tempo de execução usar Java 17, a configuração será atualizada para habilitar o subsistema Elytron para segurança. - Se você definir a configuração
WEBSITE_JBOSS_OPTS
do aplicativo, o valor será passado para o script do iniciador JBoss. Essa configuração pode ser usada para fornecer caminhos para arquivos de propriedade e mais sinalizadores que influenciam a inicialização do JBoss.
3. Fase de configuração do servidor
- No início dessa fase, o Serviço de Aplicativo aguarda primeiro que o servidor JBoss e a interface de administração estejam prontos para receber solicitações antes de continuar. Isso pode levar mais alguns segundos se o Application Insights estiver habilitado.
- Quando o JBoss Server e a interface de administração estiverem prontos, o Serviço de Aplicativo fará o seguinte:
- Adiciona o módulo
azure.appservice
JBoss , que fornece classes de utilitário para registro em log e integração com o Serviço de Aplicativo. - Atualiza o registrador de console para usar um modo incolor para que os arquivos de log não estejam cheios de sequências de fuga de cores.
- Configura a integração com os logs do Azure Monitor.
- Atualiza os endereços IP de ligação das interfaces WSDL e de gerenciamento.
- Adiciona o módulo
azure.appservice.easyauth
JBoss para integração com autenticação do Serviço de Aplicativo e ID do Microsoft Entra. - Atualiza a configuração de log dos logs de acesso e o nome e a rotação do arquivo de log do servidor principal.
- Adiciona o módulo
- A menos que a configuração
WEBSITE_SKIP_AUTOCONFIGURE_DATABASE
do aplicativo esteja definida, o Serviço de Aplicativo deteta automaticamente URLs JDBC nas configurações do aplicativo do Serviço de Aplicativo. Se existirem URLs JDBC válidas para PostgreSQL, MySQL, MariaDB, Oracle, SQL Server ou Banco de Dados SQL do Azure, ele adicionará o(s) driver(es) correspondente(s) ao servidor e adicionará uma fonte de dados para cada URL JDBC e definirá o nome JNDI para cada fonte de dados comojava:jboss/env/jdbc/<app-setting-name>_DS
, onde<app-setting-name>
é o nome da configuração do aplicativo. - Se a
clustering
configuração estiver habilitada, o registrador de console a ser configurado será verificado. - Se houver arquivos JAR implantados no diretório /home/site/libs , um novo módulo global será criado com todos esses arquivos JAR.
- No final da fase, o Serviço de Aplicativo executa o script de inicialização personalizado, se existir. A lógica de pesquisa para o script de inicialização personalizado da seguinte maneira:
- Se você configurou um comando de inicialização (no portal do Azure, com a CLI do Azure, etc.), execute-o; caso contrário,
- Se o caminho /home/site/scripts/startup.sh existir, use-o;
- Se o caminho /home/startup.sh existir, use-o.
O comando ou script de inicialização personalizado é executado como o usuário root (sem necessidade de ), para sudo
que eles possam instalar pacotes Linux ou iniciar a CLI do JBoss para executar mais comandos de instalação/personalização do JBoss (criação de fontes de dados, instalação de adaptadores de recursos), etc. Para obter informações sobre os comandos de gerenciamento de pacotes do Ubuntu, consulte a documentação do Ubuntu Server. Para obter os comandos da CLI do JBoss, consulte o Guia da CLI do JBoss Management.
4. Fase de implementação da aplicação
O script de inicialização implanta aplicativos no JBoss procurando nos seguintes locais, em ordem de precedência:
- Se você definiu a configuração
WEBSITE_JAVA_WAR_FILE_NAME
do aplicativo , implante o arquivo designado por ele. - Se /home/site/wwwroot/app.war existir, implante-o.
- Se existirem outros arquivos EAR e WAR em /home/site/wwwroot, implante-os.
- Se /home/site/wwwroot/webapps existir, implante os arquivos e diretórios nele. Os arquivos WAR são implantados como aplicativos em si, e os diretórios são implantados como aplicativos Web "explodidos" (descompactados).
- Se existirem páginas JSP autônomas em /home/site/wwwroot, copie-as para a raiz do servidor Web e implante-as como um aplicativo Web.
- Se nenhum arquivo implantável for encontrado ainda, implante a página de boas-vindas padrão (página de estacionamento) no contexto raiz.
5. Fase de recarga do servidor
- Quando as etapas de implantação estiverem concluídas, o servidor JBoss será recarregado para aplicar quaisquer alterações que exijam uma recarga do servidor.
- Após o recarregamento do servidor, o(s) aplicativo(s) implantado(s) no servidor JBoss EAP devem estar prontos para responder às solicitações.
- O servidor é executado até que o aplicativo do Serviço de Aplicativo seja interrompido ou reiniciado. Você pode parar ou reiniciar manualmente o aplicativo do Serviço de Aplicativo ou acionar uma reinicialização ao implantar arquivos ou fazer alterações de configuração no aplicativo do Serviço de Aplicativo.
- Se o servidor JBoss sair anormalmente na
clustering
configuração, uma função final chamadaemit_alert_tx_store_not_empty
será executada. A função verifica se o processo JBoss deixou um arquivo de armazenamento de transações não vazio no disco; Em caso afirmativo, é registado um erro na consola:Error: finishing server with non-empty store for node XXXX
. Quando uma nova instância do servidor é iniciada, ela procura esses arquivos de armazenamento de transações não vazios para retomar o trabalho (consulte 2. Fase de lançamento do servidor).
Configuração de linha de base do Tomcat
Nota
Esta secção aplica-se apenas ao Linux.
Os desenvolvedores Java podem personalizar as configurações do servidor, solucionar problemas e implantar aplicativos no Tomcat com confiança se souberem sobre o arquivo de server.xml e os detalhes de configuração do Tomcat. As personalizações possíveis incluem:
- Personalizando a configuração do Tomcat: Entendendo o arquivo server.xml e os detalhes de configuração do Tomcat, você pode ajustar as configurações do servidor para atender às necessidades de seus aplicativos.
- Depuração: Quando um aplicativo é implantado em um servidor Tomcat, os desenvolvedores precisam saber a configuração do servidor para depurar quaisquer problemas que possam surgir. Isso inclui verificar os logs do servidor, examinar os arquivos de configuração e identificar quaisquer erros que possam estar ocorrendo.
- Solução de problemas do Tomcat: Inevitavelmente, os desenvolvedores Java encontram problemas com seu servidor Tomcat, como problemas de desempenho ou erros de configuração. Ao entender o arquivo server.xml e os detalhes de configuração do Tomcat, os desenvolvedores podem diagnosticar e solucionar esses problemas rapidamente, o que pode economizar tempo e esforço.
- Implantando aplicativos no Tomcat: para implantar um aplicativo Web Java no Tomcat, os desenvolvedores precisam saber como configurar o arquivo server.xml e outras configurações do Tomcat. Entender esses detalhes é essencial para implantar aplicativos com êxito e garantir que eles sejam executados sem problemas no servidor.
Quando você cria um aplicativo com o Tomcat integrado para hospedar sua carga de trabalho Java (um arquivo WAR ou um arquivo JAR), há certas configurações que você obtém para a configuração do Tomcat. Você pode consultar a documentação oficial do Apache Tomcat para obter informações detalhadas, incluindo a configuração padrão para o servidor Web Tomcat.
Além disso, há certas transformações que são aplicadas em cima do server.xml para a distribuição do Tomcat no início. Estas são transformações para as configurações de conector, host e válvula.
As últimas versões do Tomcat têm server.xml (8.5.58 e 9.0.38 em diante). As versões mais antigas do Tomcat não usam transformações e podem ter um comportamento diferente como resultado.
Conector
<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
está definido como16384
URIEncoding
está definido comoUTF-8
connectionTimeout
está definido comoWEBSITE_TOMCAT_CONNECTION_TIMEOUT
, cujo padrão é240000
maxThreads
está definido comoWEBSITE_CATALINA_MAXTHREADS
, cujo padrão é200
maxConnections
está definido comoWEBSITE_CATALINA_MAXCONNECTIONS
, cujo padrão é10000
Nota
As configurações connectionTimeout, maxThreads e maxConnections podem ser ajustadas com as configurações do aplicativo
A seguir estão exemplos de comandos da CLI que você pode usar para alterar os valores de connectionTimeout, maxThreads ou maxConnections:
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
- O conector usa o endereço do contêiner em vez de 127.0.0.1
Host
<Host appBase="${site.appbase}" xmlBase="${site.xmlbase}" unpackWARs="${site.unpackwars}" workDir="${site.tempdir}" errorReportValveClass="com.microsoft.azure.appservice.AppServiceErrorReportValve" name="localhost" autoDeploy="true">
appBase
está definido comoAZURE_SITE_APP_BASE
, cujo padrão é localWebappsLocalPath
xmlBase
está definido comoAZURE_SITE_HOME
, cujo padrão é/site/wwwroot
unpackWARs
está definido comoAZURE_UNPACK_WARS
, cujo padrão étrue
workDir
está definido comoJAVA_TMP_DIR
, que assume como predefiniçãoTMP
errorReportValveClass
Usa nossa válvula de relatório de erro personalizado
Válvula
<Valve prefix="site_access_log.${catalina.instance.name}" pattern="%h %l %u %t "%r" %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
está definido comoAZURE_LOGGING_DIR
, cujo padrão éhome\logFiles
maxDays
é para , que é padrãoWEBSITE_HTTPLOGGING_RETENTION_DAYS
para0
[para sempre]
No Linux, ele tem a mesma personalização, além de:
Adiciona algumas páginas de erros e relatórios à válvula:
<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>
Próximos passos
Visite o Centro de Desenvolvedores do Azure para Java para encontrar inícios rápidos, tutoriais e documentação de referência Java do Azure.