常見問題(FAQ)- Azure Linux 上的 App Service

總結

本文將回答關於 Linux 上的 App Service 的常見問題。

內建映像

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

下表列出每個堆疊的期望值:

Stack 預期值
Java 平台,標準版(Java SE) 啟動你的 JAR 應用程式的指令(例如, java -jar /home/site/wwwroot/app.jar --server.port=80)
Tomcat 腳本用於執行必要配置的位置(例如, /home/site/deployments/tools/startup_script.sh)
Node.js Process Manager 2(PM2)設定檔或你的腳本檔
.NET 核心 編譯後的 DLL 名稱為 dotnet <myapp>.dll
PHP 可選自訂啟動
Python 可選啟動腳本
Ruby 初始化你應用程式的 Ruby 腳本

這些指令或腳本會在內建的 Docker 容器啟動後執行,但在你的應用程式程式碼開始之前。

Management

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

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

我可以用安全殼(SSH)協定連接應用程式容器虛擬機(VM)嗎?

是的,你可以透過 Azure 的原始碼控制管理(SCM)網站連接。

備註

你也可以從本地機器使用 SSH、安全檔案傳輸協定(SFTP)或 Visual Studio(VS)程式碼連接到應用程式容器。

我該如何透過 SDK 或 Azure Resource Manager(ARM)範本建立 Linux 應用程式服務計畫?

將應用程式服務欄位設 reserved 為 true。

持續整合和部署

我在 Docker Hub 上更新後,我的網頁應用程式仍然使用舊的 Docker 容器映像。 你們是否支援自訂容器的持續整合與部署(CI/CD)?

是的,支援 CI/CD。 欲了解更多資訊,請參閱 容器持續部署與網頁應用程式。

您是否支援預備環境?

是的。

我可以使用 WebDeploy/MSDeploy 嗎?

是的,設定 WEBSITE_WEBDEPLOY_USE_SCM 為 false。

在使用 Linux 網頁應用程式進行 Git 部署時發生失敗。 如何解決此問題?

使用下列其中一個選項:

  • 使用 Azure Continuous Delivery 搭配 Azure DevOps 或 GitHub。
  • 使用 zipdeploy API,並從你的本機執行以下指令:
curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy

語言支援

我想在我的 Node.js 應用程式中使用 web sockets。 有什麼特別的設定或設定可以設定嗎?

是,請在伺服器端Node.js程式代碼中停用 perMessageDeflate 。 例如,如果你使用 socket.io,請使用以下程式碼:

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

您是否支援未編譯的 .NET Core 應用程式?

是的。

您是否支援 Composer 作為 PHP 應用程式的相依性管理員?

是的。 在 Git 部署時,Kudu 應該會偵測到你正在部署 PHP 應用程式(因為有檔案 composer.lock 存在)。 Kudu 接著會觸發 composer install 命令。

自訂容器

我可以在從 Azure Container Registry 拉取映像時使用受管理身份嗎?

是的。 使用 Azure CLI(不是 Azure Portal)。 您可以使用 系統指派 或 使用者指派的 身分識別。

我正在使用自己的自定義容器。 我希望平台將伺服器訊息區塊(SMB)共用掛載到 /home/ 目錄。 這可行嗎?

如果設定 WEBSITES_ENABLE_APP_SERVICE_STORAGE 未指定或設 為 false, /home/ 目錄就不會在 Scale 實例間共享,寫入的檔案也不會在重啟後持續存在。 明確將 WEBSITES_ENABLE_APP_SERVICE_STORAGE 設定為 true 會啟用掛載。 一旦將此項設為 true,若要停用掛載功能,你必須明確地將 WEBSITES_ENABLE_APP_SERVICE_STORAGE 設為 false。

我的容器因顯示「裝置上沒有剩餘空間」訊息而無法啟動。 此錯誤的意義為何?

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

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

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

如果容器的可寫層將資料儲存在/home目錄外或掛載的 Azure 儲存體 路徑外,主機磁碟空間也會被佔用。 平臺會定期清除主機磁碟空間,以移除未使用的容器。 若容器在目錄外 /home 寫入大量資料或使用自帶儲存(BYOS),一旦超過主機磁碟空間限制,就會導致啟動失敗或執行時異常。 讓容器映像保持盡可能精簡,並在 Linux 版 App Service 上執行時,將資料寫入持久性儲存體或 BYOS。 如果無法做到,請拆分 App Service 方案,因為主機磁碟空間是固定且所有容器共享的。

我的自定義容器需要很長的時間才能啟動,而平臺會在容器完成啟動之前重新啟動。 如何修正此問題?

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

私有登錄伺服器的網址格式是什麼?

提供完整的登錄檔網址,包括 https://。

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

新增完整映像檔名稱,包括私有登錄檔 URL(例如)。 myacr.azurecr.io/dotnet:latest 使用自訂埠的映像名稱無法透過入口網站輸入。 若要設定 docker-custom-image-name,請使用 az 命令行工具。

我可以在自定義容器映像上公開多個埠嗎?

不支援這項功能。

我可以自備倉庫(BYOS)嗎?

是的。 BYOS 目前還在預覽階段。

為什麼我無法從 SCM 網站流覽自訂容器的檔案系統或執行中的進程?

SCM 網站會在獨立的容器中執行。 您無法檢查檔案系統或應用程式容器的執行中進程。

我需要在自定義容器中實作 HTTPS 嗎?

No. 該平台在共享前端處理 HTTPS 終止。

我需要用 WEBSITES_PORT 來自訂容器嗎?

是的。 自訂容器需要此設定。 要手動配置自訂埠,請在 Dockerfile 中使用 EXPOSE 指令,並在應用程式設定 WEBSITES_PORT 中指定要綁定至容器的埠值。

我可以在 Docker 映像中使用 ASPNETCORE_URLS 嗎?

是的。 務必在 .NET Core 應用程式啟動前覆寫環境變數。 例如,在腳本中使用如下所示:init.shexport ASPNETCORE_URLS={Your value}。

使用 Docker Compose 的多容器

我該如何設定 Azure Container Registry 以搭配多容器使用?

要使用 Azure Container Registry 進行多容器管理,請將所有容器映像置於同一個 Azure Container Registry 登錄伺服器上。 當映像檔在同一台登錄伺服器上時,建立應用程式設定並更新 Docker Compose 設定檔,加入 Azure Container Registry 映像名稱。

建立下列應用程式設定:

  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_URL (請使用完整網址。例如: https://<server-name>.azurecr.io.)
  • DOCKER_REGISTRY_SERVER_PASSWORD(在 Azure Container Registry 設定中啟用管理員存取權限。)

在設定檔中,請參考您的 Azure Container Registry 映像,如以下範例:

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

如何知道哪一個容器可從網際網路存取?

  • 你只能打開一個容器才能進入。
  • 僅有 80 和 8080 埠可存取(暴露埠)。

以下是判斷可存取容器的規則(依優先順序):

  • 應用程式設定 WEBSITES_WEB_CONTAINER_NAME 已設定為容器名稱。
  • 第一個定義80或8080端口的貨櫃。
  • 如果上述兩條規則都不成立,則檔案中定義的第一個容器是可存取的(暴露的)。

我該怎麼使用 depends_on?

App Service 不支援這個 depends_on 選項,且會忽略它。 就像 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)

WebSockets 支援嗎?

Linux 應用程式支援 WebSockets。 webSocketsEnabled ARM 設定不適用於 Linux 應用程式,因為 Linux 上 WebSockets 總是啟用的。

這很重要

WebSockets 現已支援 Linux 應用程式在免費 App Service 方案中使用。 你可以有最多五個 WebSocket 連線。 超過此限制 會產生 HTTP 429(請求過多) 錯誤。

定價與服務授權協議(SLA)

現在這項服務已經普遍可用,價格是多少?

價格會依SKU和地區而異。 更多詳情請參閱我們的定價頁面: App Service Pricing。

其他問題

容器熱身要求如何運作?

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

要改變此預設行為,請自訂預熱端點路徑及將網站視為已預熱狀態的狀態碼。 設定 WEBSITE_WARMUP_PATH 並 WEBSITE_WARMUP_STATUSES 應用程式設定。

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

是否可以增加容器準備請求的超時時間?

預設情況下,預熱要求在等待容器回覆 240 秒後會失敗。 你可以透過新增應用程式設定 WEBSITES_CONTAINER_START_TIME_LIMIT ,將值設在 240 到 1800 秒之間,來增加容器預熱請求的逾時時間。

如何在Linux容器中指定埠?

下表說明如何在 Linux 容器中指定埠口:

容器類型 Description 如何設定或使用埠口
內建容器 如果您為 Linux 應用程式選取語言/架構版本,則會為您選取預先定義的容器。 要將應用程式程式碼指向正確的埠口,請使用 PORT environment 變數。
自訂容器 您可以完全控制容器。 App Service 無法控制您的容器會接聽哪個連接埠。 需要知道要轉送要求至哪個埠。 如果您的容器接聽埠 80 或 8080,App Service 就能夠自動偵測它。 如果它監聽其他埠口,你需要把 WEBSITES_PORT 應用程式設定成埠號,App Service 會將請求轉發到容器中的該埠。 WEBSITES_PORT應用程式設定在容器內沒有任何影響,你也無法在容器內以環境變數存取它。

我可以用基於檔案的資料庫(像是 SQLite)來搭配我的 Linux 網頁應用程式嗎?

您的應用程式檔案系統是已掛載的網路共用。 當程式碼需要跨多台主機執行時,這使擴展成為可能的情境。 然而,這會阻止像 SQLite 這類基於檔案的資料庫服務提供者的使用,因為無法取得資料庫檔案的專屬鎖。 使用管理式資料庫服務,如 Azure SQL、適用於 MySQL 的 Azure 資料庫 或 適用於 PostgreSQL 的 Azure 資料庫。

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

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

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

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

參考資料