Linux 上的 Azure App 服務 常見問題

注意事項

本文是否有幫助? 您的輸入對我們很重要。 請使用此頁面上的 [ 意見反應 ] 按鈕,讓我們知道本文如何為您運作,或我們如何加以改善。

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

如果您有問題,請對本文留言。

內建映像

我想要分支平臺提供的內建 Docker 容器。 哪裡可以找到這些檔案?

您可以在 GitHub 上找到所有 Docker 檔案。

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

堆疊 預期值
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 應用程式) 進行即時偵錯。 如需詳細資訊,請參閱遠端偵錯和 SSH in Linux 上的 App Service

如何透過 SDK 或 Azure Resource Manager 樣本建立 Linux 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 ,請務必先使用 apt-get install curl 安裝 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_STORAGEtrue 將會啟用掛接。 一旦此設定為 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 的格式為何?

提供完整的登入網址,包括 http://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 的多容器

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

若要搭配多容器使用 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 的第一個容器
  • 如果上述兩者都不成立,則可存取檔案中定義的第一個容器, (公開)

如何? 使用 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 套接字。 ARM webSocketsEnabled 設定不適用於 Linux 應用程式,因為 Web 套接字一律會針對 Linux 啟用。

重要事項

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

定價和 SLA

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

定價會依 SKU 和區域而有所不同,但您可以在我們的定價頁面上看到更多詳細數據:App Service 定價]

其他問題

容器準備要求如何運作?

當 Azure App 服務啟動您的容器時,準備要求會將 HTTP 要求傳送至應用程式的 /robots933456.txt 端點。 這隻是虛擬端點,但您的應用程式必須以任何非 5XX 狀態代碼回復。 如果您的應用程式邏輯未以任何 HTTP 狀態代碼回復至不存在的端點,則準備要求無法接收回應,且會永久重新啟動您的容器。 準備要求也可能因為埠設定錯誤而失敗。

若要確保已在 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應用程式設定在容器內沒有任何作用,而且您無法將它存取為容器內的環境變數。

我可以使用 SQLite) 等檔案資料庫 (與我的 Linux Webapp 嗎?

應用程式的檔案系統是掛接的網路共用。 這可讓您在多個主機上執行程式碼的相應放大案例。 不幸的是,這會封鎖使用 SQLite 之類的檔案資料庫提供者,因為無法取得資料庫檔案的獨佔鎖定。 我們建議使用受控資料庫服務:Azure SQL適用於 MySQL 的 Azure 資料庫適用於 PostgreSQL 的 Azure 資料庫

應用程式設定名稱中支援的字元為何?

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

哪裡可以要求新功能?

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