Perguntas frequentes (FAQ) - Azure App Service no Linux

Resumo

Este artigo responde a perguntas comuns sobre Serviço de Aplicativo no Linux.

Imagens embutidas

Quais são os valores esperados para a seção Arquivo de Inicialização quando configuro a pilha de execução?

A tabela a seguir lista os valores esperados para cada pilha:

Stack Valor esperado
Java Platform, Standard Edition (Java SE) O comando para iniciar seu aplicativo JAR (por exemplo, java -jar /home/site/wwwroot/app.jar --server.port=80)
Tomcat O local de um script para executar as configurações necessárias (por exemplo, /home/site/deployments/tools/startup_script.sh)
Node.js O arquivo de configuração do Gerenciador de Processos 2 (PM2) ou o arquivo de script
.NET Core O nome da DLL compilado como dotnet <myapp>.dll
PHP Inicialização personalizada opcional
Python Script de inicialização opcional
Ruby O script Ruby que inicializa seu aplicativo

Esses comandos ou scripts são executados após o início do contêiner interno do Docker, mas antes do início do código do aplicativo.

Management

O que acontece quando seleciono o botão reiniciar no portal do Azure?

Esta ação é igual a um reinício do Docker.

Posso usar o protocolo SSH (Secure Shell) para se conectar à VM (máquina virtual) do contêiner de aplicativos?

Sim, você pode se conectar por meio do site do SCM (gerenciamento de controle do código-fonte) do Azure.

Note

Você também pode se conectar ao contêiner do aplicativo de seu computador local usando SSH, Protocolo SFTP (Protocolo de Transferência de Arquivo Seguro) ou Visual Studio (VS).

Como posso criar um plano do Serviço de Aplicativo linux por meio de um modelo do SDK ou do ARM (Azure Resource Manager)?

Defina o reserved campo do Serviço de Aplicativo como true.

Integração contínua e implantação

Meu aplicativo Web ainda usa uma imagem de contêiner antiga do Docker depois que a atualizei no Docker Hub. Você dá suporte à CI/CD (integração e implantação contínua) de contêineres personalizados?

Sim, há suporte para CI/CD. Para obter mais informações, consulte Implantação Contínua com o Aplicativo Web para Contêineres.

Há suporte para ambientes de teste?

Sim.

Posso usar WebDeploy/MSDeploy?

Sim, defina a WEBSITE_WEBDEPLOY_USE_SCM configuração como false.

Falha na implantação do Git usando aplicativos Web do Linux. Como fazer para resolver o problema??

Use uma das seguintes opções:

  • Use a Entrega Contínua do Azure com o Azure DevOps ou o GitHub.
  • Use a zipdeploy API e execute o seguinte comando em seu computador local:
curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy

Suporte ao idioma

Quero usar soquetes da Web no meu aplicativo Node.js. Há configurações ou configurações especiais a serem definidas?

Sim, desabilite perMessageDeflate no código Node.js do servidor. Por exemplo, se você estiver usando socket.io, use o seguinte código:

const io = require('socket.io')(server,{
  perMessageDeflate: false
});

Há suporte para aplicativos .NET Core não compilados?

Sim.

Você oferece suporte ao Composer como gerenciador de dependências para aplicativos PHP?

Sim. Durante uma implantação do Git, o Kudu deve detectar que você está implantando um aplicativo PHP (devido à presença de um composer.lock arquivo). Em seguida, o Kudu executa o comando composer install.

Contêineres personalizados

Posso usar identidades gerenciadas ao extrair imagens de Registro de Contêiner do Azure?

Sim. Use a CLI do Azure (não o portal do Azure). Você pode usar identidades atribuídas pelo sistema ou atribuídas pelo usuário.

Estou usando meu próprio contêiner personalizado. Quero que a plataforma monte um compartilhamento de SMB (Bloco de Mensagens do Servidor) no /home/ diretório. Isso é factível?

Se a WEBSITES_ENABLE_APP_SERVICE_STORAGE configuração não for especificada ou definida como false, o /home/ diretório não será compartilhado entre instâncias de escala e os arquivos gravados não persistirão entre reinicializações. A configuração WEBSITES_ENABLE_APP_SERVICE_STORAGE explícita como true permite a montagem. Depois que isso for definido como true, para desabilitar a montagem, você precisará definir WEBSITES_ENABLE_APP_SERVICE_STORAGE explicitamente como false.

Meu contêiner falha ao iniciar com uma mensagem "sem espaço no dispositivo". O que esse erro significa?

O Serviço de Aplicativo no Linux usa dois tipos diferentes de armazenamento:

  • Armazenamento do sistema de arquivos: o armazenamento do sistema de arquivos está incluído na cota do plano do Serviço de Aplicativo. Ele é usado quando os arquivos são salvos no armazenamento persistente que está enraizado no /home diretório.
  • Espaço em disco do host: o espaço em disco do host é usado para armazenar imagens de contêiner. Ele é gerenciado pela plataforma por meio do driver de armazenamento do Docker.

O espaço em disco do host é separado da cota de armazenamento do sistema de arquivos. Não é expansível e há um limite de 15 GB para cada instância. Ele é usado para armazenar imagens personalizadas no trabalhador. Você pode usar mais de 15 GBs, dependendo da disponibilidade exata de espaço em disco do host, mas isso não é garantido.

Se a camada gravável do contêiner salvar dados fora do /home diretório ou um caminho de Armazenamento do Azure montado, o espaço em disco do host também será consumido. A plataforma limpa rotineiramente o espaço em disco do host para remover contêineres não utilizados. Se o contêiner gravar uma grande quantidade de dados fora do diretório /home ou usar BYOS (traga seu próprio armazenamento), isso resultará em falhas na inicialização ou exceções em tempo de execução quando o limite de espaço em disco do host for excedido. Mantenha suas imagens de contêiner as menores possível e grave dados no armazenamento persistente ou no BYOS ao executar no App Service no Linux. Se isso não for possível, divida o plano do Serviço de Aplicativo porque o espaço em disco do host é fixo e compartilhado entre todos os contêineres no plano do Serviço de Aplicativo.

Meu contêiner personalizado demora para iniciar e a plataforma o reinicia antes que ele termine a inicialização. Como eu posso corrigir isso?

Você pode configurar a quantidade de tempo que a plataforma aguarda antes de reiniciar o contêiner. Para fazer isso, defina a configuração do aplicativo WEBSITES_CONTAINER_START_TIME_LIMIT como o valor desejado. O valor mínimo padrão é de 230 segundos e o valor máximo é de 1800 segundos.

Qual é o formato da URL do servidor de registro privado?

Forneça a URL completa do Registro, incluindo https://.

Qual é o formato do nome da imagem na opção de Registro privado?

Adicione o nome completo da imagem, incluindo a URL do registro privado (por exemplo, myacr.azurecr.io/dotnet:latest). Os nomes de imagem que usam uma porta personalizada não podem ser inseridos por meio do portal. Para definir docker-custom-image-name, use a ferramenta de linha de comando az.

Posso expor mais de uma porta na minha imagem de contêiner personalizada?

Não há suporte para isso.

Posso trazer meu próprio armazenamento (BYOS)?

Sim. O BYOS está atualmente em versão prévia.

Por que não posso navegar pelo sistema de arquivos ou pelos processos em execução do meu contêiner personalizado a partir do site do SCM?

O site do SCM é executado em um contêiner separado. Não é possível verificar o sistema de arquivos ou os processos em execução do contêiner de aplicativo.

É necessário implementar o HTTPS no meu contêiner personalizado?

Não. A plataforma manipula a terminação HTTPS nos front-ends compartilhados.

Preciso usar WEBSITES_PORT para contêineres personalizados?

Sim. Essa configuração é necessária para contêineres personalizados. Para configurar manualmente uma porta personalizada, use a instrução EXPOSE no Dockerfile e defina a configuração WEBSITES_PORT do aplicativo com um valor de porta para associar ao contêiner.

Posso usar ASPNETCORE_URLS na imagem do Docker?

Sim. Certifique-se de sobrescrever a variável de ambiente antes do aplicativo .NET Core iniciar. Por exemplo, no script init.sh, use: export ASPNETCORE_URLS={Your value}.

Vários contêineres com Docker Compose

Como faço para configurar o Registro de Contêiner do Azure para usar com vários contêineres?

Para usar Registro de Contêiner do Azure com vários contêineres, hospede todas as imagens de contêiner no mesmo servidor do Registro Registro de Contêiner do Azure. Quando as imagens estiverem no mesmo servidor do Registro, crie configurações de aplicativo e atualize o arquivo de configuração do Docker Compose para incluir o nome da imagem Registro de Contêiner do Azure.

Crie as seguintes configurações de aplicativo:

  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_URL (Use uma URL completa. Por exemplo: https://<server-name>.azurecr.io.)
  • DOCKER_REGISTRY_SERVER_PASSWORD(Habilite o acesso de administrador nas configurações de Registro de Contêiner do Azure.)

No arquivo de configuração, faça referência à imagem Registro de Contêiner do Azure como o seguinte exemplo:

image: <server-name>.azurecr.io/<image-name>:<tag>

Como saber qual contêiner é acessível pela Internet?

  • Você pode abrir apenas um contêiner para acesso.
  • Somente as portas 80 e 8080 são acessíveis (portas expostas).

Aqui estão as regras para determinar qual contêiner está acessível (na ordem de precedência):

  • Configuração do aplicativo WEBSITES_WEB_CONTAINER_NAME definida para o nome do contêiner.
  • O primeiro contêiner a definir a porta 80 ou 8080.
  • Se nenhuma das regras anteriores for verdadeira, o primeiro contêiner definido no arquivo estará acessível (exposto).

Como posso usar depends_on?

O Serviço de Aplicativo não dá suporte à opção depends_on e a ignora. Assim como a recomendação do Docker para controlar a inicialização e o desligamento, os aplicativos multicontêiner do App Service devem verificar as dependências por meio do código do aplicativo, tanto na inicialização quanto quando houver desconexão.

O código de exemplo a seguir mostra um aplicativo Python verificando se um contêiner redis está em execução:

          import time
          import redis
          from flask import Flask
          app = Flask(__name__)
          cache = redis.Redis(host='redis', port=6379)
          def get_hit_count():
              retries = 5
              while True:
                  try:
                      return cache.incr('hits')
                  except redis.exceptions.ConnectionError as exc:
                      if retries == 0:
                          raise exc
                      retries -= 1
                      time.sleep(0.5)
          @app.route('/')
          def hello():
              count = get_hit_count()
              return 'Hello from Azure App Service team! I have been seen {} times.\n'.format(count)
          if __name__ == "__main__":
              app.run(host="0.0.0.0", port=80, debug=True)

Há suporte para WebSockets?

Há suporte para WebSockets em aplicativos Linux. A webSocketsEnabled configuração do ARM não se aplica a aplicativos Linux, pois WebSockets estão sempre habilitados para Linux.

Importante

Agora há suporte para WebSockets para aplicativos Linux em planos gratuitos do Serviço de Aplicativo. Você pode ter até cinco conexões WebSocket. Exceder esse limite resulta em um erro HTTP 429 (Muitas Solicitações).

SLA (contrato de licença de preços e serviço)

Qual é o preço agora que o serviço está disponível em geral?

Os preços variam de acordo com a SKU e a região. Confira mais detalhes em nossa página de preços: Preços do Serviço de Aplicativo.

Outras perguntas

Como funciona a solicitação de aquecimento do contêiner?

Quando o App Service inicia seu contêiner, a requisição de aquecimento envia uma solicitação HTTP para o endpoint /robots933456.txt da sua aplicação. Este endpoint é apenas um placeholder, mas sua aplicação deve responder retornando qualquer código de status (incluindo 5xx). Se a lógica interna do aplicativo não responder enviando um código de status HTTP para endpoints inexistentes, a solicitação de aquecimento não poderá receber uma resposta. Portanto, ele reinicia constantemente o contêiner.

Para alterar esse comportamento padrão, personalize o caminho do endpoint de warmup e os códigos de status que indicam que o site foi inicializado. Defina as configurações do aplicativo WEBSITE_WARMUP_PATH e WEBSITE_WARMUP_STATUSES.

A solicitação de aquecimento também pode falhar devido à configuração incorreta da porta.

É possível aumentar o tempo limite da solicitação de aquecimento do contêiner?

A solicitação de aquecimento falha por padrão depois de aguardar uma resposta do contêiner por 240 segundos. Você pode aumentar o tempo limite de solicitação de aquecimento do contêiner adicionando a configuração WEBSITES_CONTAINER_START_TIME_LIMIT do aplicativo com um valor entre 240 e 1800 segundos.

Como especifique a porta em meu contêiner do Linux?

A tabela a seguir descreve como especificar a porta em seu contêiner do Linux:

Tipo de contêiner Description Como definir ou usar a porta
Contêineres embutidos Se você selecionar uma versão do idioma/framework para um aplicativo Linux, um contêiner predefinido será selecionado para você. Para apontar o código do aplicativo para a porta certa, use a variável de ambiente PORT.
Contêineres personalizados Você tem controle total sobre o contêiner. O Serviço de Aplicativo não tem controle sobre em qual porta o contêiner escuta. O que ele precisa é saber para qual porta encaminhar solicitações. Se o contêiner escutar a porta 80 ou 8080, o Serviço de Aplicativo poderá detectá-lo automaticamente. Se escutar qualquer outra porta, você precisará definir a configuração de aplicativo WEBSITES_PORT como o número da porta, e o Serviço de Aplicativo redireciona solicitações para essa porta no contêiner. A WEBSITES_PORT configuração do aplicativo não tem nenhum efeito dentro do contêiner e você não pode acessá-la como uma variável de ambiente dentro do contêiner.

Posso usar um banco de dados baseado em arquivo (como SQLite) com meu aplicativo Web Linux?

O sistema de arquivos do seu aplicativo é um compartilhamento de rede montado. Isso permite a expansão de cenários em que seu código precisa ser executado em vários hosts. No entanto, isso bloqueia o uso de provedores de banco de dados baseados em arquivo, como o SQLite, pois não é possível adquirir bloqueios exclusivos no arquivo de banco de dados. Use um serviço de banco de dados gerenciado, como SQL do Azure, Banco de Dados do Azure para MySQL ou Banco de Dados do Azure para PostgreSQL.

Quais são os caracteres com suporte em nomes de configurações do aplicativo?

Você pode usar apenas letras (A-Z, a-z), números (0-9) e o caractere de sublinhado (_) para as configurações do aplicativo.

Onde posso solicitar os novos recursos?

É possível enviar sua ideia para o fórum de comentários dos Aplicativos Web. Adicione “[Linux]” ao título de sua ideia.

Referências