Linux의 Azure App Service FAQ

참고

이 문서가 도움이 되었나요? 귀하의 입력은 우리에게 중요합니다. 이 페이지의 피드백 단추를 사용하여 이 문서가 얼마나 잘 작동했는지 또는 어떻게 개선할 수 있는지 알려주세요.

App Service on Linux 릴리스를 통해 기능을 추가하고 플랫폼을 개선하는 작업을 진행하고 있습니다. 이 문서에서는 고객이 최근에 문의한 질문에 대한 답변을 제공합니다.

질문이 있는 경우 이 문서에 댓글을 달 수 있습니다.

기본 제공 이미지

플랫폼에서 제공하는 기본 제공 Docker 컨테이너를 포크하려고 합니다. 해당 파일은 어디에서 찾을 수 있나요?

GitHub에서 모든 Docker 파일을 찾을 수 있습니다.

런타임 스택을 구성할 때 시작 파일 섹션에 필요한 값은 무엇인가요?

스택 예상 값
Java SE JAR 앱을 시작하는 명령(예: java -jar /home/site/wwwroot/app.jar --server.port=80)
톰캣 필요한 구성을 수행하는 스크립트의 위치(예: /home/site/deployments/tools/startup_script.sh)
Node.js PM2 구성 파일 또는 스크립트 파일
.NET Core 컴파일된 DLL 이름 dotnet <myapp>.dll
Php 선택적 사용자 지정 시작
Python 선택적 시작 스크립트
루비 앱을 초기화하려는 Ruby 스크립트

이러한 명령 또는 스크립트는 기본 제공 Docker 컨테이너가 시작된 후 애플리케이션 코드가 시작되기 전에 실행됩니다.

관리

Azure Portal 다시 시작 단추를 누르면 어떻게 되나요?

이 작업은 Docker 다시 시작과 동일합니다.

SSH(Secure Shell)를 사용하여 앱 컨테이너 VM(가상 머신)에 연결할 수 있나요?

예, SCM(소스 제어 관리) 사이트를 통해 수행할 수 있습니다.

참고

SSH, SFTP 또는 Visual Studio Code(라이브 디버깅 Node.js 앱용)을 사용하여 로컬 개발 머신에서 직접 앱 컨테이너에 연결할 수도 있습니다. 자세한 내용은 App Service on Linux 원격 디버깅 및 SSH를 참조하세요.

SDK 또는 Azure Resource Manager 템플릿을 통해 Linux App Service 계획을 만들려면 어떻게 해야 하나요?

App Service의 예약 된 필드를 true로 설정합니다.

연속 통합 및 배포

Docker Hub 이미지를 업데이트한 후에도 웹앱은 여전히 이전 Docker 컨테이너 이미지를 사용합니다. 사용자 지정 컨테이너의 지속적인 통합 및 배포를 지원합니까?

예, Web App for Containers를 사용하여 연속 배포를 수행하여 Azure Container Registry 또는 DockerHub에 대한 연속 통합/배포를 설정합니다. 프라이빗 레지스트리의 경우 웹앱을 중지한 다음 시작하여 컨테이너를 새로 고칠 수 있습니다. 또는 더미 애플리케이션 설정을 변경하거나 추가하여 컨테이너를 강제로 새로 고칠 수 있습니다.

스테이징 환경을 지원합니까?

예.

'WebDeploy/MSDeploy'를 사용하여 웹앱을 배포할 수 있나요?

예, 라는 WEBSITE_WEBDEPLOY_USE_SCM 앱 설정을 false로 설정해야 합니다.

Linux 웹앱을 사용할 때 내 애플리케이션의 Git 배포가 실패합니다. 이 문제를 어떻게 해결할 수 있나요?

Git 배포가 Linux 웹앱에 실패하는 경우 다음 옵션 중 하나를 선택하여 애플리케이션 코드를 배포합니다.

  • 지속적인 업데이트(미리 보기) 기능 사용: Azure DevOps Git 리포지토리 또는 GitHub 리포지토리에 앱의 소스 코드를 저장하여 Azure 지속적인 업데이트를 사용할 수 있습니다. 자세한 내용은 Linux 웹앱에 대한 지속적인 업데이트를 구성하는 방법을 참조하세요.

  • ZIP 배포 API 사용: 이 API를 사용하려면 웹앱에 SSH를 사용하고 코드를 배포할 폴더로 이동합니다. 다음 코드를 실행합니다.

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

    명령을 찾을 수 없다는 오류가 curl 발생하면 이전 curl 명령을 실행하기 전에 를 사용하여 apt-get install curl curl을 설치해야 합니다.

언어 지원

Node.js 애플리케이션, 특수 설정 또는 설정할 구성에서 웹 소켓을 사용하려고 하나요?

예, 서버 쪽 Node.js 코드에서 사용하지 않도록 설정합니다 perMessageDeflate . 예를 들어 socket.io 사용하는 경우 다음 코드를 사용합니다.

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

컴파일되지 않은 .NET Core 앱을 지원하나요?

예.

Composer를 PHP 앱에 대한 종속성 관리자로 지원합니까?

예, Git 배포 중에 Kudu는 PHP 애플리케이션을 배포하고 있음을 감지해야 합니다(composer.lock 파일의 존재 덕분). 그러면 Kudu는 작성기 설치를 트리거합니다.

사용자 지정 컨테이너

이미지를 끌어와 ACR을 구성할 때 App Service 관리 ID를 사용할 수 있나요?

예, 이 기능은 Azure CLI에서 사용할 수 있습니다. 시스템 할당 또는 사용자 할당 ID를 사용할 수 있습니다. 이 기능은 현재 Azure Portal 지원되지 않습니다.

사용자 지정 컨테이너를 사용하고 있습니다. 플랫폼이 SMB 공유를 '/home/' 디렉터리에 탑재하려고 합니다.

설정이 지정되지 않았거나 false/home/로 설정된 경우 WEBSITES_ENABLE_APP_SERVICE_STORAGE 디렉터리가 확장 인스턴스 간에 공유되지 않으며, 작성된 파일은 다시 시작할 때 유지되지 않습니다. 명시적으로 true로 설정 WEBSITES_ENABLE_APP_SERVICE_STORAGE 하면 탑재가 활성화됩니다. 이 값이 true로 설정되면 탑재를 사용하지 않도록 설정하려면 명시적으로 false로 설정 WEBSITES_ENABLE_APP_SERVICE_STORAGE 해야 합니다.

컨테이너가 "디바이스에 남아 있는 공간이 없음"으로 시작하지 못합니다. 오류의 의미

App Service on Linux 두 가지 유형의 스토리지를 사용합니다.

  • 파일 시스템 스토리지: 파일 시스템 스토리지는 App Service 계획 할당량에 포함됩니다. 파일이 디렉터리에 루트된 영구 스토리지에 /home 저장될 때 사용됩니다.
  • 호스트 디스크 공간: 호스트 디스크 공간은 컨테이너 이미지를 저장하는 데 사용됩니다. Docker 스토리지 드라이버를 통해 플랫폼에서 관리됩니다.

호스트 디스크 공간은 파일 시스템 스토리지 할당량과 별개입니다. 확장할 수 없으며 각 instance 대해 15GB 제한이 있습니다. 작업자에 사용자 지정 이미지를 저장하는 데 사용됩니다. 호스트 디스크 공간의 정확한 가용성에 따라 15GB보다 큰 을 사용할 수 있지만 이것이 보장되지는 않습니다.

컨테이너의 쓰기 가능한 계층이 디렉터리 또는 탑재된 Azure 스토리지 경로 외부에 /home 데이터를 저장하는 경우 호스트 디스크 공간도 사용됩니다.

플랫폼은 호스트 디스크 공간을 정기적으로 정리하여 사용되지 않는 컨테이너를 제거합니다. 컨테이너가 디렉터리 외부 또는 BYOS(Bring Your Own Storage) 외부에서 /home 대량의 데이터를 쓰는 경우 호스트 디스크 공간 제한을 초과하면 시작 실패 또는 런타임 예외가 발생합니다.

Linux App Service 실행할 때 컨테이너 이미지를 가능한 한 작게 유지하고 영구 스토리지 또는 BYOS에 데이터를 쓰는 것이 좋습니다. 가능하지 않은 경우 호스트 디스크 공간이 고정되어 있고 App Service 계획의 모든 컨테이너 간에 공유되므로 App Service 계획을 분할해야 합니다.

사용자 지정 컨테이너를 시작하는 데 시간이 오래 걸리고 플랫폼은 시작이 완료되기 전에 컨테이너를 다시 시작합니다.

플랫폼이 컨테이너를 다시 시작하기 전에 대기하는 시간을 구성할 수 있습니다. 이렇게 하려면 앱 설정을 원하는 값으로 설정합니다 WEBSITES_CONTAINER_START_TIME_LIMIT . 기본값은 230초이고 최대값은 1800초입니다.

프라이빗 레지스트리 서버 URL의 형식은 무엇인가요?

또는 https://를 포함하여 http:// 전체 레지스트리 URL을 제공합니다.

프라이빗 레지스트리 옵션의 이미지 이름 형식은 무엇인가요?

개인 레지스트리 URL(예: myacr.azurecr.io/dotnet:latest)을 포함하여 전체 이미지 이름을 추가합니다. 사용자 지정 포트를 사용하는 이미지 이름은 포털을 통해 입력할 수 없습니다. 를 설정docker-custom-image-name하려면 명령줄 도구를 사용합니다az.

사용자 지정 컨테이너 이미지에 둘 이상의 포트를 노출할 수 있나요?

둘 이상의 포트 노출은 지원하지 않습니다.

내 스토리지를 가져올 수 있나요?

예, 사용자 고유의 스토리지를 미리 보기로 가져옵니다.

사용자 지정 컨테이너의 파일 시스템 또는 SCM 사이트에서 실행 중인 프로세스를 찾아볼 수 없는 이유는 무엇인가요?

SCM 사이트는 별도의 컨테이너에서 실행됩니다. 파일 시스템 또는 앱 컨테이너의 실행 프로세스를 검사 수 없습니다.

사용자 지정 컨테이너에서 HTTPS를 구현해야 하나요?

아니요, 플랫폼은 공유 프런트 엔드에서 HTTPS 종료를 처리합니다.

사용자 지정 컨테이너에 WEBSITES_PORT 사용해야 하나요?

예, 사용자 지정 컨테이너에 필요합니다. 사용자 지정 포트를 수동으로 구성하려면 Dockerfile의 EXPOSE 명령과 컨테이너에 바인딩할 포트 값과 함께 WEBSITES_PORT 앱 설정을 사용합니다.

Docker 이미지에서 ASPNETCORE_URLS 사용할 수 있나요?

예, .NET Core 앱이 시작되기 전에 환경 변수를 덮어씁니다. 예를 들어 init.sh 스크립트: 내보내기 ASPNETCORE_URLS={사용자 값}

Docker Compose를 사용하여 다중 컨테이너

다중 컨테이너와 함께 사용하도록 ACR(Azure Container Registry)을 구성할 어떻게 할까요? 있나요?

다중 컨테이너에서 ACR을 사용하려면 모든 컨테이너 이미지를 동일한 ACR 레지스트리 서버에서 호스트해야 합니다. 동일한 레지스트리 서버에 있으면 애플리케이션 설정을 만든 다음, ACR 이미지 이름을 포함하도록 Docker Compose 구성 파일을 업데이트해야 합니다.

다음 애플리케이션 설정을 만듭니다.

  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_URL(전체 URL, 예: https://<server-name>.azurecr.io)
  • DOCKER_REGISTRY_SERVER_PASSWORD(ACR 설정에서 관리자 액세스 사용)

구성 파일 내에서 다음 예제와 같이 ACR 이미지를 참조합니다.

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

인터넷에 액세스할 수 있는 컨테이너를 어떻게 할까요? 알고 있나요?

  • 액세스를 위해 하나의 컨테이너만 열 수 있습니다.
  • 포트 80 및 8080만 액세스할 수 있음(노출된 포트)

우선 순위에 따라 액세스할 수 있는 컨테이너를 결정하는 규칙은 다음과 같습니다.

  • 컨테이너 이름으로 설정된 애플리케이션 설정 WEBSITES_WEB_CONTAINER_NAME
  • 포트 80 또는 8080을 정의하는 첫 번째 컨테이너
  • 위의 두 컨테이너 중 어느 것도 true가 아니면 파일에 정의된 첫 번째 컨테이너에 액세스할 수 있습니다(노출됨).

depends_on 사용할 어떻게 할까요? 있나요?

옵션은 depends_on App Service 지원되지 않으며 무시됩니다. Docker의 제어 시작 및 종료 권장 사항과 마찬가지로 App Service 다중 컨테이너 앱은 시작 및 연결 끊김 모두에서 애플리케이션 코드를 통해 종속성을 검사 합니다. 아래 예제 코드는 Redis 컨테이너가 실행 중인지 확인하는 Python 앱을 보여 줍니다.

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)

웹 소켓

웹 소켓은 Linux 앱에서 지원됩니다. 웹 소켓은 webSocketsEnabled 항상 Linux에 대해 사용하도록 설정되므로 ARM 설정은 Linux 앱에 적용되지 않습니다.

중요

이제 무료 App Service 플랜의 Linux 앱에 웹 소켓이 지원됩니다. 무료 App Service 플랜에서 최대 5개의 웹 소켓 연결을 지원합니다. 이 제한을 초과하면 HTTP 429(너무 많은 요청) 응답이 발생합니다.

가격 책정 및 SLA

서비스가 일반 공급되었으므로 가격 책정은 무엇인가요?

가격은 SKU 및 지역에 따라 다르지만 가격 책정 페이지에서 App Service 자세한 내용을 볼 수 있습니다.

기타 질문

컨테이너 준비 요청은 어떻게 작동하나요?

Azure 앱 Services가 컨테이너를 시작하면 준비 요청은 애플리케이션의 /robots933456.txt 엔드포인트에 HTTP 요청을 보냅니다. 이것은 단순히 더미 엔드포인트이지만 애플리케이션은 5XX가 아닌 상태 코드로 회신해야 합니다. 애플리케이션 논리가 존재하지 않는 엔드포인트에 HTTP 상태 코드로 회신하지 않으면 준비 요청은 응답을 받을 수 없으며 컨테이너를 영구적으로 다시 시작합니다. 포트 구성 오류로 인해 준비 요청이 실패할 수도 있습니다.

Azure 앱 Services에서 포트가 올바르게 구성되었는지 확인하려면 내 Linux 컨테이너에서 포트를 지정할 어떻게 할까요? 질문을 참조하세요.

컨테이너 준비 요청 시간 제한을 늘릴 수 있나요?

컨테이너의 회신을 240초 동안 기다린 후 기본적으로 준비 요청이 실패합니다. 값이 240~1800초인 애플리케이션 설정을 WEBSITES_CONTAINER_START_TIME_LIMIT 추가하여 컨테이너 준비 요청 시간 제한을 늘릴 수 있습니다.

내 Linux 컨테이너에서 포트를 지정할 어떻게 할까요? 있나요?

컨테이너 유형 설명 포트 설정/사용 방법
기본 제공 컨테이너 Linux 앱에 대한 언어/프레임워크 버전을 선택하는 경우 미리 정의된 컨테이너가 선택됩니다. 앱 코드를 올바른 포트로 가리키려면 PORT 환경 변수를 사용합니다.
사용자 지정 컨테이너 컨테이너를 완전히 제어할 수 있습니다. App Service 컨테이너가 수신 대기하는 포트를 제어할 수 없습니다. 필요한 것은 요청을 전달할 포트를 아는 것입니다. 컨테이너가 포트 80 또는 8080을 수신 대기하는 경우 App Service 자동으로 검색할 수 있습니다. 다른 포트를 수신 대기하는 경우 WEBSITES_PORT 앱 설정을 포트 번호로 설정하고 App Service 컨테이너의 해당 포트에 요청을 전달해야 합니다. WEBSITES_PORT 앱 설정은 컨테이너 내에서 아무런 영향을 주지 않으며 컨테이너 내에서 환경 변수로 액세스할 수 없습니다.

Linux Webapp에서 파일 기반 데이터베이스(예: SQLite)를 사용할 수 있나요?

애플리케이션의 파일 시스템은 탑재된 네트워크 공유입니다. 이렇게 하면 여러 호스트에서 코드를 실행해야 하는 시나리오를 확장할 수 있습니다. 아쉽게도 이것은 데이터베이스 파일에 대한 배타적 잠금을 획득할 수 없으므로 SQLite와 같은 파일 기반 데이터베이스 공급자의 사용을 차단합니다. Azure SQL, Azure Database for MySQL또는Azure Database for PostgreSQL 관리되는 데이터베이스 서비스를 권장합니다.

애플리케이션 설정 이름에서 지원되는 문자는 무엇인가요?

애플리케이션 설정에는 문자(A-Z, a-z), 숫자(0-9) 및 밑줄 문자(_)만 사용할 수 있습니다.

새 기능은 어디에서 요청할 수 있나요?

Web Apps 피드백 포럼에서 아이디어를 제출할 수 있습니다. 아이디어 제목에 "[Linux]"를 추가합니다.