編輯

共用方式為


Linux 上的 Azure App Service 常見問題

注意

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

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

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

內建映像

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

Stack 預期的值
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 您想要使用 初始化應用程式的 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/』 目錄。

如果未指定設定或設定為 false/home/則不會在縮放實體之間共享目錄,而寫入的檔案將不會在重新啟動時保存 WEBSITES_ENABLE_APP_SERVICE_STORAGE 將明確設定 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 寫入大量數據或「攜帶您自己的記憶體」,則一旦超過主機磁碟空間限制,就會造成啟動失敗或運行時間例外狀況。

建議您盡可能縮小容器映射,並在 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 的多容器

如何? 將 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 應用程式,因為一律會針對 Linux 啟用 Web 套接字。

重要

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

定價和 SLA

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

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

其他問題

容器熱身要求如何運作?

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

若要確保埠已在 Azure App 服務 上正確設定,請參閱在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]” 新增至您的想法標題。