共用方式為


Linux 上的 Azure App Service 常見問題

注意

本篇文章實用嗎? 您的輸入對我們很重要。 請使用此頁面上的 [ 意見反應 ] 按鈕,讓我們知道這篇文章為您運作得有多好,或我們如何加以改善。

隨著 Linux 上的 App Service 的發行,我們正努力新增功能,並改善我們的平臺。 本文提供客戶最近詢問的問題解答。

如果您有問題,請對本文發表評論。

內建映像

當我設定運行時間堆疊時,啟動檔案區段的預期值為何?

堆疊 預期的值
Java SE 啟動 JAR 應用程式的指令 (例如, java -jar /home/site/wwwroot/app.jar --server.port=80
Tomcat 文稿執行任何必要組態的位置(例如, /home/site/deployments/tools/startup_script.sh
Node.js PM2 組態檔或腳本檔案
.NET Core 編譯的 DLL 名稱為 dotnet <myapp>.dll
PHP 選擇性自定義啟動
Python(程式語言) 選擇性 啟動腳本
紅寶石 您想要使用 初始化應用程式的 Ruby 腳稿

這些命令或文本會在啟動內建 Docker 容器之後執行,但在啟動應用程式程式代碼之前。

管理

當我在 Azure 入口網站 中按下重新啟動按鈕時,會發生什麼事?

此動作與 Docker 重新啟動相同。

我可以使用安全殼層 (SSH) 連線到應用程式容器虛擬機 (VM)嗎?

是,您可以透過原始檔控制管理 (SCM) 網站執行此動作。

注意

您也可以使用 SSH、SFTP 或 Visual Studio Code 直接從本機開發電腦連線到應用程式容器(適用於即時偵錯Node.js應用程式)。 如需詳細資訊,請參閱 Linux 上的 App Service 中的遠端偵錯和 SSH

如何透過 SDK 或 Azure Resource Manager 範本建立 Linux App Service 方案?

將 App Service 的 保留 字段設定為 true

持續整合和部署

在 Docker Hub 上更新映射之後,我的 Web 應用程式仍會使用舊的 Docker 容器映射。 您是否支援自訂容器的持續整合和部署?

是,若要設定 Azure Container Registry 或 DockerHub 的持續整合/部署,請遵循 使用適用於容器的 Web 應用程式進行持續部署。 針對私人登錄,您可以停止並啟動 Web 應用程式來重新整理容器。 或者,您可以變更或新增虛擬應用程式設定,以強制重新整理容器。

您是否支援預備環境?

是。

我可以使用 'WebDeploy/MSDeploy' 來部署我的 Web 應用程式嗎?

是,您必須將名為 WEBSITE_WEBDEPLOY_USE_SCM 的應用程式設定設為 false

使用 Linux Web 應用程式時,我的應用程式 Git 部署會失敗。 如何解決此問題?

如果 Git 部署無法部署 Linux Web 應用程式,請選擇下列其中一個選項來部署應用程式程式代碼:

  • 使用持續傳遞(預覽)功能:您可以將應用程式的原始碼儲存在 Azure DevOps Git 存放庫或 GitHub 存放庫中,以使用 Azure 持續傳遞。 如需詳細資訊,請參閱 如何設定 Linux Web 應用程式的持續傳遞

  • 使用 ZIP 部署 API:若要使用此 API, 請透過 SSH 連線到您的 Web 應用程式 ,然後移至您要部署程式代碼的資料夾。 執行下列程式碼:

    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應用程式中使用 Web 套接字、任何特殊設定或要設定的組態?

是,請在伺服器端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 使用受控識別?

是,此功能可從 Azure CLI 取得。 您可以使用 系統指派使用者指派的 身分識別。 Azure 入口網站 目前不支援此功能。

我正在使用自己的自定義容器。 我希望平臺將 SMB 共用掛接至 『/home/』 目錄。

如果WEBSITES_ENABLE_APP_SERVICE_STORAGE設定未指定或設定為false,則/home/目錄將不會在縮放實例之間共用,而寫入的檔案在重新啟動後不會保留。 明確將 WEBSITES_ENABLE_APP_SERVICE_STORAGE 設定為 true 會啟用掛載。 一旦此設定為 true,如果您想要停用掛接,則必須明確設定 WEBSITES_ENABLE_APP_SERVICE_STORAGEfalse

我的容器無法從「裝置上剩餘的空間」開始。 此錯誤的意義為何?

Linux 上的 App Service 使用兩種不同類型的記憶體:

  • 檔案系統記憶體:檔案系統記憶體包含在App Service 方案配額中。 當檔案儲存至根目錄的 /home 永續性記憶體時,會使用它。
  • 主機磁碟空間:主機磁碟空間是用來儲存容器映像。 它是透過 Docker 記憶體驅動程式由平臺所管理。

主機磁碟空間與文件系統記憶體配額不同。 無法展開,而且每個實例都有 15 GB 的限制。 它用來將任何自定義映像儲存在背景工作角色上。 視主機磁碟空間的確切可用性而定,您可能可以使用大於 15 GB,但這並不保證。

如果容器的可寫入層會在目錄或掛接的 Azure 記憶體路徑之外/home儲存數據,則也會取用主機磁碟空間。

平臺會定期清除主機磁碟空間,以移除未使用的容器。 如果容器在 /home 目錄或自帶儲存裝置(BYOS)外寫入大量數據,一旦超過主機磁碟空間限制,就會導致啟動失敗或執行時例外。

建議您盡可能縮小容器映射,並在 Linux App Service 上執行時將數據寫入永續性記憶體或 BYOS。 如果不可能,您必須分割 App Service 方案,因為 App Service 方案中的所有容器之間固定並共用主機磁碟空間。

我的自定義容器需要很長的時間才能啟動,而平臺會在容器完成啟動之前重新啟動。

您可以設定平臺在重新啟動容器之前等候的時間量。 若要這樣做,請將 WEBSITES_CONTAINER_START_TIME_LIMIT 應用程式設定設為您想要的值。 預設值為 230 秒,而最大值為 1800 秒。

私人登錄伺服器 URL 的格式為何?

提供完整的登入網址,包括 https://

私人登錄選項中映像名稱的格式為何?

新增完整映像名稱,包括私人登錄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 的多容器

如何? 將 Azure Container Registry (ACR) 設定為與多容器搭配使用?

若要搭配多容器使用 ACR, 所有容器映像 都必須裝載在相同的 ACR 登錄伺服器上。 一旦它們位於相同的登錄伺服器上,您必須建立應用程式設定,然後更新 Docker Compose 組態檔以包含 ACR 映像名稱。

建立下列應用程式設定:

  • 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 多容器應用程式應該透過應用程式程式代碼來檢查相依性,無論是在啟動時還是中斷連線。 下列範例程式代碼顯示 Python 應用程式檢查,以查看 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)

Web 通訊端

Linux 應用程式支援 Web 套接字。 webSocketsEnabled ARM 設定不適用於 Linux 應用程式,因為 Web 套接字在 Linux 環境中始終是啟用的。

重要

免費 App Service 方案中的 Linux 應用程式現在支援 Web 套接字。 我們支持免費 App Service 方案中最多五個 Web 套接字連線。 超過此限制會導致 HTTP 429 (要求太多) 回應。

定價和 SLA

現在服務已正式推出,定價為何?

定價會因 SKU 和區域而異,但您可以在我們的定價頁面看到更多詳細數據: App Service 定價

其他問題

容器熱身要求如何運作?

當 Azure App Services 啟動容器時,熱身要求會將 HTTP 要求傳送至應用程式的 /robots933456.txt 端點。 這隻是虛擬端點,但您的應用程式必須透過傳回任何狀態代碼來回復(包括 5xx)。 如果您的應用程式邏輯不會透過將 HTTP 狀態代碼傳送至不存在的端點來回復,則熱身要求無法接收回應。 因此,它會不斷重新啟動您的容器。

若要更改預設行為,您可以自定義熱身端點路徑和認定網站已完成熱身的狀態碼。 若要這樣做,請設定 WEBSITE_WARMUP_PATHWEBSITE_WARMUP_STATUSES 應用程式設定。

熱身要求也可能因為埠設定錯誤而失敗。

若要確定已在 Azure App 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適用於 MySQL 的 Azure 資料庫適用於 PostgreSQL 的 Azure 資料庫

應用程式設定名稱中支援哪些字元?

您只能使用字母 (A-Z, a-z), 數位 (0-9), 和底線字元 (_) 作為應用程式設定。

我可以在哪裡要求新功能?

您可以在 Web Apps 意見反應論壇提交您的想法。 將 “[Linux]” 新增至您的想法標題。