Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Resumen
En este artículo se responden preguntas comunes sobre App Service en Linux.
Imágenes integradas
¿Cuáles son los valores esperados para la sección del archivo de inicio cuando configuro la pila de tiempo de ejecución?
En la tabla siguiente se enumeran los valores esperados para cada pila:
| Stack | Valor esperado |
|---|---|
| Java Platform, Standard Edition (Java SE) | Comando para iniciar la aplicación JAR (por ejemplo, java -jar /home/site/wwwroot/app.jar --server.port=80) |
| Tomcat | Ubicación de un script para realizar configuraciones necesarias (por ejemplo, /home/site/deployments/tools/startup_script.sh) |
| Node.js. | El archivo de configuración de Process Manager 2 (PM2) o el archivo de script |
| .NET Core | El nombre del archivo DLL compilado como dotnet <myapp>.dll |
| PHP | Inicio personalizado opcional |
| Pitón | Script de inicio opcional |
| Rubí | Script de Ruby que inicializa la aplicación |
Estos comandos o scripts se ejecutan después de que se inicie el contenedor integrado de Docker, pero antes de que se inicie el código de la aplicación.
Administración
¿Qué ocurre cuando selecciono el botón reiniciar en el portal de Azure?
Esta acción es igual a un reinicio de Docker.
¿Puedo usar el protocolo Secure Shell (SSH) para conectarse a la máquina virtual del contenedor de aplicaciones?
Sí, puede conectarse a través del sitio de administración de control de código fuente (SCM) de Azure.
Note
También puede conectarse al contenedor de aplicaciones desde la máquina local mediante SSH, Protocolo seguro de transferencia de archivos (SFTP) o Visual Studio (VS).
¿Cómo puedo crear un plan de App Service de Linux mediante un SDK o una plantilla de Azure Resource Manager (ARM)?
Establezca el reserved campo de App Service en true.
Integración e implementación continuas
Mi aplicación web sigue usando una imagen de contenedor de Docker antigua después de actualizarla en Docker Hub. ¿Admite la integración e implementación continuas (CI/CD) de contenedores personalizados?
Sí, se admite CI/CD. Para obtener más información, consulte Implementación continua con Web App for Containers.
¿Ofrecen soporte para entornos de ensayo?
Sí.
¿Puedo usar WebDeploy/MSDeploy?
Sí, establezca el ajuste WEBSITE_WEBDEPLOY_USE_SCM en false.
Se produce un error en la implementación de Git mediante aplicaciones web de Linux. ¿Cómo puedo solucionar el problema?
Use una de las siguientes opciones:
- Utilizar Azure Continuous Delivery con Azure DevOps o GitHub.
- Use la
zipdeployAPI y ejecute el siguiente comando desde la máquina local:
curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy
Compatibilidad con idiomas
Quiero usar sockets web en mi aplicación Node.js. ¿Hay ajustes o configuraciones especiales que establecer?
Sí, deshabilite perMessageDeflate en el código de Node.js en el servidor. Por ejemplo, si usa socket.io, use el código siguiente:
const io = require('socket.io')(server,{
perMessageDeflate: false
});
¿Se admiten aplicaciones de .NET Core sin compilar?
Sí.
¿Soporta Composer como administrador de dependencias para aplicaciones PHP?
Sí. Durante una implementación de Git, Kudu debe detectar que va a implementar una aplicación PHP (debido a la presencia de un composer.lock archivo). A continuación, Kudu desencadena una instalación de composer.
Contenedores personalizados
¿Puedo usar identidades administradas al extraer imágenes de Azure Container Registry?
Sí. Use la CLI de Azure (no Azure Portal). Puede usar identidades asignadas por el sistema o asignadas por el usuario.
Utilizo mi propio contenedor personalizado. Quiero que la plataforma monte un recurso compartido de bloque de mensajes de servidor (SMB) en el /home/ directorio. ¿Esto es factible?
Si la WEBSITES_ENABLE_APP_SERVICE_STORAGE configuración no está especificada o se establece en false, el /home/ directorio no se compartirá entre instancias de escalado y los archivos escritos no se conservarán en los reinicios. Establecer explícitamente WEBSITES_ENABLE_APP_SERVICE_STORAGE en true habilita el montaje. Una vez que esto se establece en true, para desactivar el montaje, debe establecer explícitamente WEBSITES_ENABLE_APP_SERVICE_STORAGE en false.
Mi contenedor no se inicia y muestra un mensaje de "no queda espacio en el dispositivo". ¿Qué significa este error?
App Service en Linux usa dos tipos diferentes de almacenamiento:
- Almacenamiento del sistema de archivos: el almacenamiento del sistema de archivos se incluye en la cuota del plan de App Service. Se usa cuando los archivos se guardan en el almacenamiento persistente que se basa en el
/homedirectorio. - Espacio en disco host: el espacio en disco host se usa para almacenar imágenes de contenedor. Se administra mediante la plataforma a través del controlador de almacenamiento de Docker.
El espacio en disco del host es independiente de la cuota de almacenamiento del sistema de archivos. No se puede expandir y hay un límite de 15 GB para cada instancia. Se utiliza para almacenar cualquier imagen personalizada en el trabajador. Es posible que pueda usar más de 15 GB en función de la disponibilidad exacta del espacio en disco host, pero esto no está garantizado.
Si la capa grabable del contenedor guarda datos fuera del /home directorio o una ruta de acceso de Azure Storage montada, también se consume el espacio en disco host. La plataforma limpia de forma rutinaria el espacio en disco host para quitar contenedores no usados. Si el contenedor escribe una gran cantidad de datos fuera del /home directorio o usa bring your own storage (BYOS), se producirán errores de inicio o excepciones en tiempo de ejecución una vez que se supere el límite de espacio en disco host. Mantenga las imágenes de contenedor lo más pequeñas posible y escriba datos en el almacenamiento persistente o BYOS cuando se ejecute en App Service para Linux. Si esto no es posible, divida el plan de App Service porque el espacio en disco del host es fijo y compartido entre todos los contenedores del plan de App Service.
Mi contenedor personalizado tarda mucho tiempo en iniciarse y la plataforma reinicia el contenedor antes de que finalice el inicio. ¿Cómo puedo corregirlo?
Puede configurar la cantidad de tiempo que espera la plataforma antes de reiniciar el contenedor. Para ello, establezca el valor WEBSITES_CONTAINER_START_TIME_LIMIT de la aplicación en el valor que desee. El valor mínimo predeterminado es 230 segundos y el valor máximo es de 1800 segundos.
¿Cuál es el formato de la dirección URL del servidor de registro privado?
Proporcione la dirección URL completa del Registro, incluida https://.
¿Cuál es el formato del nombre de la imagen en la opción del registro privado?
Agregue el nombre de la imagen completa, incluida la dirección URL del Registro privado (por ejemplo, myacr.azurecr.io/dotnet:latest). Los nombres de imagen que usan un puerto personalizado no se pueden escribir a través del portal. Para establecer docker-custom-image-name, use la azherramienta de línea de comandos.
¿Se puede exponer más de un puerto en mi imagen de contenedor personalizado?
No es una opción admitida.
¿Puedo traer mi propio almacenamiento (BYOS)?
Sí. BYOS está actualmente en versión preliminar.
¿Por qué no puedo examinar el sistema de archivos de mi contenedor personalizado o ejecutar procesos desde el sitio de SCM?
El sitio de SCM se ejecuta en un contenedor independiente. no puede comprobar el sistema de archivos o los procesos en ejecución del contenedor de la aplicación.
¿Es necesario implementar HTTPS en mi contenedor personalizado?
N.º La plataforma controla la terminación HTTPS en el front-end compartido.
¿Es necesario usar WEBSITES_PORT para contenedores personalizados?
Sí. Esta configuración es necesaria para contenedores personalizados. Para configurar manualmente un puerto personalizado, use la EXPOSE instrucción en el Dockerfile y la configuración WEBSITES_PORT de la app con un valor de puerto para enlazarlo en el contenedor.
¿Puedo usar ASPNETCORE_URLS en la imagen de Docker?
Sí. Asegúrese de sobrescribir la variable de entorno antes de que se inicie la aplicación de .NET Core. Por ejemplo, en el guion init.sh, utilice: export ASPNETCORE_URLS={Your value}.
Contenedores múltiples con Docker Compose
¿Cómo se configura Azure Container Registry para usarlo con varios contenedores?
Para usar Azure Container Registry con varios contenedores, hospede todas las imágenes de contenedor en el mismo servidor del Registro de Azure Container Registry. Cuando las imágenes se encuentren en el mismo servidor del Registro, cree la configuración de la aplicación y actualice el archivo de configuración de Docker Compose para incluir el nombre de la imagen de Azure Container Registry.
Cree la siguiente configuración de la aplicación:
DOCKER_REGISTRY_SERVER_USERNAME-
DOCKER_REGISTRY_SERVER_URL(Use una dirección URL completa. Por ejemplo:https://<server-name>.azurecr.io.) -
DOCKER_REGISTRY_SERVER_PASSWORD(Habilite el acceso de administrador en Azure Container Registry configuración).
En el archivo de configuración, haga referencia a la imagen de Azure Container Registry como en el ejemplo siguiente:
image: <server-name>.azurecr.io/<image-name>:<tag>
¿Cómo puedo saber qué contenedor es accesible desde Internet?
- Solo se puede abrir un contenedor para acceder.
- Solo se puede acceder a los puertos 80 y 8080 (puertos expuestos).
Estas son las reglas para determinar qué contenedor es accesible (en el orden de prioridad):
- Configuración de la aplicación
WEBSITES_WEB_CONTAINER_NAMEconfigurada como el nombre del contenedor. - Primer contenedor para definir el puerto 80 o 8080.
- Si ninguna de las reglas anteriores es true, se puede acceder al primer contenedor definido en el archivo (expuesto).
¿Cómo uso depends_on?
App Service no admite la depends_on opción y la omite. Al igual que la recomendación de inicio y apagado de control de Docker, las aplicaciones de varios contenedores de App Service deben comprobar las dependencias a través del código de la aplicación, tanto en el inicio como en la desconexión.
En el código de ejemplo siguiente se muestra una comprobación de aplicaciones de Python para ver si se está ejecutando un contenedor de Redis:
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)
¿Se admite WebSockets?
Se admiten WebSockets en aplicaciones en Linux. La webSocketsEnabled configuración de ARM no se aplica a las aplicaciones linux, ya que WebSockets siempre está habilitada para Linux.
Importante
WebSockets ahora son compatibles con aplicaciones Linux en planes de App Service gratuitos. Puede tener hasta cinco conexiones de WebSocket. Si se supera este límite, se produce un error HTTP 429 (demasiadas solicitudes).
Contrato de licencia de precios y servicios (SLA)
¿Cuál es el precio ahora que el servicio está disponible con carácter general?
Los precios varían según la SKU y la región. Consulte más detalles en nuestra página de precios: Precios de App Service.
Otras preguntas
¿Cómo funciona la solicitud de calentamiento del contenedor?
Cuando App Service inicia su contenedor, la solicitud de precalentamiento envía una solicitud HTTP al extremo /robots933456.txt de su aplicación. Este punto de conexión es un marcador de posición, pero la aplicación debe responder devolviendo cualquier código de estado (incluido 5xx). Si la lógica de la aplicación no responde enviando un código de estado HTTP a puntos de conexión inexistentes, la solicitud de preparación no puede recibir una respuesta. Por lo tanto, reinicia constantemente el contenedor.
Para cambiar este comportamiento predeterminado, personalice la ruta del punto de conexión de calentamiento y los códigos de estado que indican que el sitio ya se ha inicializado. Establezca la configuración de la aplicación WEBSITE_WARMUP_PATH y WEBSITE_WARMUP_STATUSES.
La solicitud de calentamiento también podría producir un error debido a una configuración incorrecta del puerto.
¿Es posible aumentar el tiempo de espera de la solicitud de inicialización del contenedor?
Por defecto, se produce un error en la solicitud de preparación después de esperar 240 segundos para obtener una respuesta del contenedor. Puede aumentar el tiempo de espera de la solicitud de precalentamiento del contenedor agregando la configuración WEBSITES_CONTAINER_START_TIME_LIMIT de la aplicación con un valor entre 240 y 1800 segundos.
¿Cómo se especifica el puerto en mi contenedor de Linux?
En la tabla siguiente se describe cómo especificar el puerto en el contenedor de Linux:
| Tipo de contenedor | Description | Establecimiento o uso del puerto |
|---|---|---|
| Contenedores integrados | Si selecciona una versión de lenguaje o marco para una aplicación de Linux, se selecciona un contenedor predefinido de forma automática. | Para apuntar el código de la aplicación al puerto correcto, use la variable de entorno PORT. |
| Contenedores personalizados | Tiene control total sobre el contenedor. | App Service no tiene control sobre cuál puerto escucha el contenedor. Lo que sí necesita es saber a qué puerto reenviar las solicitudes. Si el contenedor escucha en el puerto 80 o el 8080, el App Service puede detectarlo automáticamente. Si escucha en cualquier otro puerto, debe establecer la configuración de la aplicación WEBSITES_PORT al número de puerto, y App Service reenviará las solicitudes a ese puerto dentro del contenedor. La WEBSITES_PORT configuración de la aplicación no tiene ningún efecto en el contenedor y no puede acceder a ella como una variable de entorno dentro del contenedor. |
¿Puedo usar una base de datos basada en archivos (como SQLite) con mi aplicación web Linux?
El sistema de archivos de la aplicación es un recurso compartido de red montado. Esto permite escenarios de escalado horizontal donde su código necesita ejecutarse en varios servidores. Sin embargo, esto bloquea el uso de proveedores de bases de datos basadas en archivos como SQLite, ya que no es posible adquirir bloqueos exclusivos en el archivo de base de datos. Use un servicio de base de datos administrado como Azure SQL, Azure Database for MySQL o Azure Database for PostgreSQL.
¿Cuáles son los caracteres admitidos en los nombres de configuración de la aplicación?
Puede usar solo letras (A-Z, a-z), números (0-9) y el carácter de subrayado (_) para la configuración de la aplicación.
¿Dónde puedo solicitar nuevas características?
Puede enviar su idea en el foro de comentarios de Web Apps. Agregue [Linux] en el título de la idea.