Vanliga frågor och svar om Azure App Service på Linux

Obs!

Var den här artikeln användbar? Dina indata är viktiga för oss. Använd knappen Feedback på den här sidan för att berätta hur bra den här artikeln fungerade för dig eller hur vi kan förbättra den.

I och med lanseringen av App Service på Linux arbetar vi med att lägga till funktioner och förbättra vår plattform. Den här artikeln innehåller svar på frågor som våra kunder har ställt till oss nyligen.

Om du har en fråga kan du kommentera den här artikeln.

Inbyggda avbildningar

Jag vill förgrena de inbyggda Docker-containrar som plattformen tillhandahåller. Var hittar jag filerna?

Du hittar alla Docker-filer på GitHub.

Vilka är de förväntade värdena för avsnittet Startfil när jag konfigurerar körningsstacken?

Stack Förväntat värde
Java SE kommandot för att starta JAR-appen (till exempel java -jar /home/site/wwwroot/app.jar --server.port=80)
Tomcat platsen för ett skript för att utföra nödvändiga konfigurationer (till exempel /home/site/deployments/tools/startup_script.sh)
Node.js PM2-konfigurationsfilen eller skriptfilen
.NET Core det kompilerade DLL-namnet som dotnet <myapp>.dll
PHP valfri anpassad start
Python valfritt startskript
Ruby Ruby-skriptet som du vill initiera din app med

Dessa kommandon eller skript körs när den inbyggda Docker-containern har startats, men innan programkoden startas.

Hantering

Vad händer när jag trycker på omstartsknappen i Azure Portal?

Den här åtgärden är samma som en Docker-omstart.

Kan jag använda Secure Shell (SSH) för att ansluta till den virtuella datorn (VM) för appcontainern?

Ja, det kan du göra via platsen för källkontrollhantering (SCM).

Obs!

Du kan också ansluta till appcontainern direkt från din lokala utvecklingsdator med hjälp av SSH, SFTP eller Visual Studio Code (för direkt felsökning Node.js appar). Mer information finns i Fjärrfelsökning och SSH i App Service på Linux.

Hur skapar jag en Linux-App Service-plan via en SDK eller en Azure Resource Manager-mall?

Ange det reserverade fältet för apptjänsten till true.

Kontinuerlig integrering och distribution

Min webbapp använder fortfarande en gammal Docker-containeravbildning när jag har uppdaterat avbildningen på Docker Hub. Stöder du kontinuerlig integrering och distribution av anpassade containrar?

Ja, för att konfigurera kontinuerlig integrering/distribution för Azure Container Registry eller DockerHub, genom att följa Kontinuerlig distribution med Web App for Containers. För privata register kan du uppdatera containern genom att stoppa och sedan starta webbappen. Eller så kan du ändra eller lägga till en dummy-programinställning för att framtvinga en uppdatering av containern.

Stöder du mellanlagringsmiljöer?

Ja.

Kan jag använda "WebDeploy/MSDeploy" för att distribuera min webbapp?

Ja, du måste ange en appinställning med namnet WEBSITE_WEBDEPLOY_USE_SCMfalse.

Git-distributionen av mitt program misslyckas när du använder Linux-webbappen. Hur kan jag kringgå problemet?

Om Git-distributionen misslyckas med linux-webbappen väljer du något av följande alternativ för att distribuera programkoden:

  • Använd funktionen Kontinuerlig leverans (förhandsversion): Du kan lagra appens källkod på en Azure DevOps Git-lagringsplats eller GitHub-lagringsplats för att använda Azure Continuous Delivery. Mer information finns i Konfigurera kontinuerlig leverans för Linux-webbapp.

  • Använd ZIP-distributions-API:et: Om du vill använda det här API:et använder du SSH i webbappen och går till mappen där du vill distribuera koden. Kör följande kod:

    curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy
    

    Om du får ett felmeddelande om curl att kommandot inte hittas kontrollerar du att du installerar curl med hjälp apt-get install curl av innan du kör föregående curl kommando.

Språkstöd

Jag vill använda webbsocketer i mitt Node.js program, eventuella särskilda inställningar eller konfigurationer som ska anges?

Ja, inaktivera perMessageDeflate Node.js kod på serversidan. Om du till exempel använder socket.io använder du följande kod:

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

Har du stöd för okompilerade .NET Core-appar?

Ja.

Har du stöd för Composer som beroendehanterare för PHP-appar?

Ja, under en Git-distribution bör Kudu identifiera att du distribuerar ett PHP-program (tack vare förekomsten av en composer.lock-fil), och Kudu utlöser sedan en kompositörsinstallation.

Anpassade containrar

Kan jag använda hanterade identiteter med App Service när jag hämtar bilder från ACR?

Ja, den här funktionen är tillgänglig från Azure CLI. Du kan använda systemtilldelade eller användartilldelade identiteter. Den här funktionen stöds för närvarande inte i Azure Portal.

Jag använder min egen anpassade container. Jag vill att plattformen ska montera en SMB-resurs till katalogen "/home/".

Om WEBSITES_ENABLE_APP_SERVICE_STORAGE inställningen är ospecificerad eller inställd på false/home/delas inte katalogen mellan skalningsinstanser och de filer som skrivs bevaras inte mellan omstarter. Om du uttryckligen anger WEBSITES_ENABLE_APP_SERVICE_STORAGEtrue aktiveras monteringen. Om du vill inaktivera monteringen måste du uttryckligen ange false när detta är inställt WEBSITES_ENABLE_APP_SERVICE_STORAGEtrue.

Det går inte att starta containern med "inget utrymme kvar på enheten". Vad innebär det här felet?

App Service på Linux använder två olika typer av lagring:

  • Lagring av filsystem: Filsystemlagringen ingår i App Service plankvot. Den används när filer sparas till den beständiga lagring som rotas i /home katalogen.
  • Värddiskutrymme: Värddiskutrymmet används för att lagra containeravbildningar. Den hanteras av plattformen via Docker-lagringsdrivrutinen.

Värddiskutrymmet är separat från filsystemets lagringskvot. Den kan inte expanderas och det finns en gräns på 15 GB för varje instans. Den används för att lagra anpassade avbildningar på arbetaren. Du kanske kan använda större än 15 GB beroende på den exakta tillgängligheten för värddiskutrymmet, men detta är inte garanterat.

Om containerns skrivbara lager sparar data utanför /home katalogen eller en monterad Azure Storage-sökväg används även värddiskutrymmet.

Plattformen rensar rutinmässigt värddiskutrymmet för att ta bort oanvända containrar. Om containern skriver en stor mängd data utanför /home katalogen eller BYOS (Bring Your Own Storage) resulterar det i startfel eller körningsundundanter när diskutrymmesgränsen för värddisken överskrids.

Vi rekommenderar att du håller dina containeravbildningar så små som möjligt och skriver data till den beständiga lagringen eller BYOS när du kör på Linux App Service. Om det inte är möjligt måste du dela upp App Service-planen eftersom värddiskutrymmet är fast och delat mellan alla containrar i App Service-planen.

Min anpassade container tar lång tid att starta och plattformen startar om containern innan den har startats klart.

Du kan konfigurera hur lång tid plattformen ska vänta innan den startar om containern. Det gör du genom att ange appinställningen WEBSITES_CONTAINER_START_TIME_LIMIT till önskat värde. Standardvärdet är 230 sekunder och det maximala värdet är 1 800 sekunder.

Vilket format har url:en för den privata registerservern?

Ange den fullständiga register-URL:en, inklusive http:// eller https://.

Vilket format har avbildningsnamnet i det privata registret?

Lägg till det fullständiga avbildningsnamnet, inklusive url:en för det privata registret (till exempel myacr.azurecr.io/dotnet:latest). Det går inte att ange avbildningsnamn som använder en anpassad port via portalen. Om du vill ange docker-custom-image-nameanvänder du az kommandoradsverktyget.

Kan jag exponera fler än en port på min anpassade containeravbildning?

Vi stöder inte exponering av fler än en port.

Kan jag ta med mitt eget lagringsutrymme?

Ja, Bring Your Own Storage finns i förhandsversion.

Varför kan jag inte bläddra i min anpassade containers filsystem eller köra processer från SCM-platsen?

SCM-platsen körs i en separat container. Du kan inte kontrollera filsystemet eller köra processer för appcontainern.

Behöver jag implementera HTTPS i min anpassade container?

Nej, plattformen hanterar HTTPS-avslutning på delade klientdelar.

Behöver jag använda WEBSITES_PORT för anpassade containrar?

Ja, detta krävs för anpassade containrar. Om du vill konfigurera en anpassad port manuellt använder du instruktionen EXPOSE i Dockerfile och appinställningen WEBSITES_PORT med ett portvärde som ska bindas till containern.

Kan jag använda ASPNETCORE_URLS i Docker-avbildningen?

Ja, skriv över miljövariabeln innan .NET Core-appen startar. T.ex. I init.sh skriptet: export ASPNETCORE_URLS={Ditt värde}

Flera containrar med Docker Compose

Hur gör jag för att konfigurera Azure Container Registry (ACR) för användning med flera containrar?

För att kunna använda ACR med flera containrar måste alla containeravbildningar finnas på samma ACR-registerserver. När de finns på samma registerserver måste du skapa programinställningar och sedan uppdatera Docker Compose-konfigurationsfilen så att den innehåller ACR-avbildningens namn.

Skapa följande programinställningar:

  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_URL (fullständig URL, till exempel ) https://<server-name>.azurecr.io
  • DOCKER_REGISTRY_SERVER_PASSWORD (aktivera administratörsåtkomst i ACR-inställningar)

I konfigurationsfilen refererar du till din ACR-avbildning som i följande exempel:

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

Hur gör jag för att vet vilken container som är tillgänglig via Internet?

  • Endast en container kan vara öppen för åtkomst
  • Endast port 80 och 8080 är tillgängliga (exponerade portar)

Här är reglerna för att avgöra vilken container som är tillgänglig – i prioritetsordning:

  • Programinställningen WEBSITES_WEB_CONTAINER_NAME inställd på containernamnet
  • Den första containern som definierar port 80 eller 8080
  • Om inget av ovanstående är sant är den första containern som definierats i filen tillgänglig (exponerad)

Hur gör jag för att använda depends_on?

Alternativet depends_onstöds inte på App Service och ignoreras. Precis som rekommendationen om start och avstängning av kontroll från Docker bör App Service appar med flera containrar kontrollera beroenden via programkod – både vid start och frånkoppling. Exempelkoden nedan visar en Python-app som kontrollerar om en Redis-container körs.

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)

Web Sockets

Web Sockets stöds i Linux-appar. webSocketsEnabled ARM-inställningen gäller inte för Linux-appar eftersom Web Sockets alltid är aktiverade för Linux.

Viktigt

Web Sockets stöds nu för Linux-appar på kostnadsfria App Service planer. Vi stöder upp till fem web socket-anslutningar på kostnadsfria App Service planer. Om den här gränsen överskrids resulterar det i ett HTTP 429-svar (för många begäranden).

Prissättning och serviceavtal

Vad är prissättningen, nu när tjänsten är allmänt tillgänglig?

Prissättningen varierar beroende på SKU och region, men du kan se mer information på vår prissida: App Service Prissättning.

Andra frågor

Hur fungerar containerns uppvärmningsbegäran?

När Azure App Services startar containern skickar uppvärmningsbegäran en HTTP-begäran till slutpunkten /robots933456.txt för ditt program. Det här är bara en dummy-slutpunkt, men ditt program måste svara med statuskod som inte är 5XX. Om din programlogik inte svarar med någon HTTP-statuskod till obefintliga slutpunkter kan uppvärmningsbegäran inte ta emot något svar och den startar ständigt om containern. Uppvärmningsbegäran kan också misslyckas på grund av felaktig konfiguration av portar.

Se frågan Hur gör jag för att ange port i min Linux-container för att säkerställa att porten är korrekt konfigurerad på Azure App Services?

Går det att öka tidsgränsen för containerns uppvärmningsbegäran?

Uppvärmningsbegäran misslyckas som standard efter att ha väntat i 240 sekunder på ett svar från containern. Du kan öka tidsgränsen för containerns uppvärmningsbegäran genom att lägga till programinställningen WEBSITES_CONTAINER_START_TIME_LIMIT med ett värde mellan 240 och 1 800 sekunder.

Hur gör jag för att ange port i min Linux-container?

Containertyp Beskrivning Så här ställer du in/använder port
Inbyggda containrar Om du väljer en språk-/ramverksversion för en Linux-app väljs en fördefinierad container åt dig. Om du vill peka appkoden till rätt port använder du miljövariabeln PORT.
Anpassade containrar Du har fullständig kontroll över containern. App Service har ingen kontroll över vilken port containern lyssnar på. Vad den behöver är att veta vilken port som begäranden ska vidarebefordras till. Om containern lyssnar på port 80 eller 8080 kan App Service identifiera den automatiskt. Om den lyssnar på någon annan port måste du ange WEBSITES_PORT appinställning till portnumret och App Service vidarebefordrar begäranden till den porten i containern. Den WEBSITES_PORT appinställningen har ingen effekt i containern och du kan inte komma åt den som en miljövariabel i containern.

Kan jag använda en filbaserad databas (till exempel SQLite) med min Linux-webbapp?

Filsystemet i ditt program är en monterad nätverksresurs. På så sätt kan du skala ut scenarier där koden måste köras över flera värdar. Tyvärr blockerar detta användningen av filbaserade databasproviders som SQLite eftersom det inte går att hämta exklusiva lås på databasfilen. Vi rekommenderar en hanterad databastjänst: Azure SQL, Azure Database for MySQL eller Azure Database for PostgreSQL

Vilka tecken stöds i namn på programinställningar?

Du kan bara använda bokstäver (A-Z, a-z), siffror (0-9) och understreck (_) för programinställningar.

Var kan jag begära nya funktioner?

Du kan skicka in din idé på Web Apps feedbackforum. Lägg till "[Linux]" i rubriken för din idé.