共用方式為


在 Azure 應用服務中配置 PHP 應用

警告

Windows 上的 PHP 已於 2022 年 11 月 終止支援 。 只有 Linux 上的應用服務支援 PHP。 本文僅供參考。

本指南介紹如何在 Azure 應用服務中配置 PHP Web 應用、移動後端和 API 應用。 涵蓋了最常見的配置任務。

如果你不熟悉應用服務,應首先按照 在 Azure 應用服務中創建 PHP Web 應用 快速入門和 將 PHP、MySQL 和 Redis 應用部署到 Azure 應用服務 教程進行作。

顯示 PHP 版本

要顯示當前的 PHP 版本,請執行以下命令。 您可以使用 Azure Cloud Shell

az webapp config show --resource-group <resource-group-name> --name <app-name> --query phpVersion

<resource-group-name><app-name> 替換為適合您 Web 應用程式的名稱。

備註

要設定開發插槽,在參數 --slot 後附加插槽名稱。

要顯示所有支援的 PHP 版本,請執行以下命令:

az webapp list-runtimes --os windows | grep PHP

本指南介紹如何在 Azure 應用服務中配置 PHP Web 應用、移動後端和 API 應用。 涵蓋了最常見的配置任務。

如果你不熟悉應用服務,應首先按照 在 Azure 應用服務中創建 PHP Web 應用 快速入門和 將 PHP、MySQL 和 Redis 應用部署到 Azure 應用服務 教程進行作。

顯示 PHP 版本

要顯示當前的 PHP 版本,請執行以下命令。 您可以使用 Azure Cloud Shell

az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion

<resource-group-name><app-name> 替換為適合您 Web 應用程式的名稱。

備註

要設定開發插槽,在參數 --slot 後附加插槽名稱。

要顯示所有支援的 PHP 版本,請執行以下命令:

az webapp list-runtimes --os linux | grep PHP

設置 PHP 版本

若要將 PHP 版本設置為 8.1,請執行以下命令。

az webapp config set --resource-group <resource-group-name> --name <app-name> --php-version 8.1

若要將 PHP 版本設置為 8.1,請執行以下命令。

az webapp config set --resource-group <resource-group-name> --name <app-name> --linux-fx-version "PHP|8.1"

App Service 中過期的運行時間會發生什麼事?

維護組織已不再支持過期的執行環境,或是發現它們存在重大弱點。 因此,它們會從門戶中的建立和設定頁面中移除。 當入口網站隱藏過期的運行時間時,仍在使用該運行時間的任何應用程式會繼續執行。

如果您想要使用不再顯示在入口網站上過期的運行時間版本來建立應用程式,請使用 Azure CLI、ARM 範本或 Bicep。 這些部署替代方案可讓您建立已在主控台中移除但仍受到支援的已過時運行時間。

如果從 App Service 平臺完全移除運行時間,您的 Azure 訂用帳戶擁有者會在移除之前收到電子郵件通知。

執行 Composer

如果希望應用服務在部署時運行 Composer ,最簡單的方法是將 Composer 包含在存儲庫中。

在本地終端視窗中,將目錄更改為您的儲存庫根目錄。 然後,按照 Download Composer 中的說明下載到 composer.phar 目錄根目錄。

執行下列命令。 要運行它們,您需要安裝 npm

npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt

您的儲存庫根現在有兩個新檔: .deploymentdeploy.sh.

開啟 deploy.sh 並找到該 Deployment 部分,如以下範例所示:

##################################################################################################################################
# Deployment
# ----------

本節 Deployment 末尾,添加運行所需工具所需的代碼部分:

# 4. Use composer
echo "$DEPLOYMENT_TARGET"
if [ -e "$DEPLOYMENT_TARGET/composer.json" ]; then
  echo "Found composer.json"
  pushd "$DEPLOYMENT_TARGET"
  php composer.phar install $COMPOSER_ARGS
  exitWithMessageOnError "Composer install failed"
  popd
fi

提交所有更改後,您可以使用 Git 或使用 啟用構建自動化功能的 ZIP 部署來部署代碼。 Composer 現在應作為部署自動化的一部分來運行。

執行 Bower、Gulp 或 Grunt

如果希望應用服務在部署時運行常用的自動化工具(如 Bower、Gulp 或 Grunt),則需要提供 自定義部署腳本。 使用 Git 或使用 啟用了生成自動化的 ZIP deploy 進行部署時,應用服務將運行此腳本。

要使您的儲存庫能夠運行這些工具,您需要將它們添加到 中的 package.json依賴項中。 例如:

"dependencies": {
  "bower": "^1.7.9",
  "grunt": "^1.0.1",
  "gulp": "^3.9.1",
  ...
}

在本地終端視窗中,將目錄更改為儲存庫根目錄並運行以下命令。 要運行它們,您需要安裝 npm

npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt

您的儲存庫根現在有兩個新檔: .deploymentdeploy.sh.

開啟 deploy.sh 並找到該 Deployment 部分,如以下範例所示:

##################################################################################################################################
# Deployment
# ----------

本節以執行npm install --production結束。 本節 Deployment 末尾,添加運行所需工具所需的代碼部分:

請參閱 MEAN.js 示例中的範例,其中部署腳本還運行自定義 npm install 命令。

涼亭

此代碼段執行 bower install

if [ -e "$DEPLOYMENT_TARGET/bower.json" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/bower install
  exitWithMessageOnError "bower failed"
  cd - > /dev/null
fi

吞掉

此代碼段執行 gulp imagemin

if [ -e "$DEPLOYMENT_TARGET/gulpfile.js" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/gulp imagemin
  exitWithMessageOnError "gulp failed"
  cd - > /dev/null
fi

咕嚕聲

此代碼段執行 grunt

if [ -e "$DEPLOYMENT_TARGET/Gruntfile.js" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/grunt
  exitWithMessageOnError "Grunt failed"
  cd - > /dev/null
fi

自訂組建自動化

如果使用 Git 或使用 啟用了生成自動化的 ZIP 包來部署應用,則應用服務中的生成自動化將按以下順序執行:

  1. PRE_BUILD_SCRIPT_PATH 指定自定義腳本,則運行它。
  2. 執行 php composer.phar install
  3. POST_BUILD_SCRIPT_PATH 指定自定義腳本,則運行它。

PRE_BUILD_COMMANDPOST_BUILD_COMMAND 是預設為空值的環境變數。 若要執行預先建置命令,請定義 PRE_BUILD_COMMAND。 若要執行建置後命令,請定義 POST_BUILD_COMMAND

以下範例將兩個變數指定給一系列命令,以逗號分隔:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PRE_BUILD_COMMAND="echo foo, scripts/prebuild.sh"
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings POST_BUILD_COMMAND="echo foo, scripts/postbuild.sh"

若要了解其他可自訂組建自動化的環境變數,請參閱 Oryx 設定

若要瞭解應用服務如何在Linux中運行和構建 PHP 應用程式,請參閱 有關如何檢測和構建 PHP 應用程式的 Oryx 文件

自訂啟動

您可以在容器啟動時執行自訂命令。 執行下列命令:

az webapp config set --resource-group <resource-group-name> --name <app-name> --startup-file "<custom-command>"

存取環境變數

在 App Service 中,您可以在應用程式程式代碼之外 設定應用程式設定 。 然後,您可以使用標準 getenv() 模式訪問這些設置。 例如,要存取名為 DB_HOST的應用程式設置,請使用以下代碼:

getenv("DB_HOST")

更改網站根目錄

您選擇的 Web 框架可能會使用子目錄作為網站根目錄。 例如, Laravel 使用 public/ 子目錄作為網站根目錄。

要自訂網站根目錄,請使用以下 az resource update 命令設置應用程式的虛擬應用程式路徑。 以下範例將網站根目錄設定為 public/ 儲存庫中的子目錄:

az resource update --name web --resource-group <group-name> --namespace Microsoft.Web --resource-type config --parent sites/<app-name> --set properties.virtualApplications[0].physicalPath="site\wwwroot\public" --api-version 2015-06-01

默認情況下,Azure 應用服務將根虛擬應用程式路徑 ()/ 指向已部署應用程式檔的根目錄 (sites\wwwroot)。

您選擇的 Web 框架可能會使用子目錄作為網站根目錄。 例如, Laravel 使用 public/ 子目錄作為網站根目錄。

應用服務的預設 PHP 映像使用 NGINX,您可以通過 使用 root 指令配置 NGINX 伺服器來更改網站根目錄。 此範例設定檔包含以下代碼段,用於變更root指令:

server {
    #proxy_cache cache;
    #proxy_cache_valid 200 1s;
    listen 8080;
    listen [::]:8080;
    root /home/site/wwwroot/public; # Changed for Laravel

    location / {            
        index  index.php index.html index.htm hostingstart.html;
        try_files $uri $uri/ /index.php?$args; # Changed for Laravel
    }
    ...

預設容器使用 位於的 /etc/nginx/sites-available/default配置檔。 應用程式重新啟動時,您對此檔所做的任何編輯都將被擦除。 要進行在應用程式重啟時有效的更改, 請添加自定義啟動命令 ,如下例所示:

cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload

此命令將預設 NGINX 設定檔替換為儲存庫根目錄中的命名 default 檔,並重新啟動 NGINX。

檢測 HTTPS 會話

在 App Service 中,TLS/SSL 終止發生在網路負載平衡器上,因此,所有 HTTPS 要求都以未加密的 HTTP 要求的形式到達應用程式。 如果您的 App Logic 需要檢查使用者要求是否加密,請檢查 X-Forwarded-Proto header:

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
// Do something when HTTPS is used
}

熱門的 Web 架構可讓您在標準的應用程式模式中存取 X-Forwarded-* 資訊。 在 CodeIgniter 中, is_https() 函數預設檢查 of X_FORWARDED_PROTO 的值。

自訂 php.ini 設定

如果需要更改 PHP 安裝,可以使用以下步驟更改任何 php.ini 指令

備註

查看 PHP 版本和當前 php.ini 設定的最佳方法是在應用程式中使用 phpinfo()

自訂非PHP_INI_SYSTEM指令

要自訂PHP_INI_USER、 和 PHP_INI_PERDIRPHP_INI_ALL 指令,請將檔案.user.ini添加到應用程式的根目錄。

將配置設定新增到 .user.ini 檔中,並使用與在 php.ini 檔中相同的語法。 例如,如果要開啟 display_errors 設置並將設置 upload_max_filesize 設置為 10M,則檔 .user.ini 將包含以下文本:

 ; Example Settings
 display_errors=On
 upload_max_filesize=10M

 ; Write errors to d:\home\LogFiles\php_errors.log
 ; log_errors=On

使用更改重新部署應用程式,然後重新啟動它。

作為使用 .user.ini 檔的替代方法,您可以在 App 中使用 ini_set() 來自定義這些非PHP_INI_SYSTEM 指令。

要自訂 PHP_INI_USERLinux Web 應用程式的、 PHP_INI_PERDIRPHP_INI_ALL 指令(如 upload_max_filesizeexpose_php),請使用自訂 .ini 檔。 您可以在 SSH 工作階段中建立它。 首先,設置目錄:

  1. 轉到您的 Kudu 網站。 若要取得隨機哈希和區域值,請在您的應用程式 [概 ] 中複製 [預設網域]。
  2. 在頂部功能表上,選擇 Debug console(調試控制台),然後選擇 BashSSH
  3. 在Bash或 SSH 中,轉到您的 /home/site/wwwroot 目錄。
  4. 創建名為 ini ( 例如, mkdir ini) 的目錄。
  5. 將當前工作目錄更改為 ini 您創建的資料夾。

接下來,創建一個 .ini 檔,您可以在其中添加設置。 這個範例使用 extensions.ini。 沒有 Vi、Vim 或 Nano 等文件編輯器,因此請使用 Echo 將設置添加到檔中。 將 upload_max_filesize 值從 2M 變更為 50M。 使用以下命令新增設定並建立檔案 extensions.ini (如果尚不存在):

/home/site/wwwroot/ini>echo "upload_max_filesize=50M" >> extensions.ini
/home/site/wwwroot/ini>cat extensions.ini

upload_max_filesize=50M

/home/site/wwwroot/ini>

在 Azure 門戶中,新增應用程式設定,以掃描您剛剛建立的 ini 目錄,以套用變更至 upload_max_filesize

  1. 轉到 Azure 門戶 ,然後選擇應用服務 Linux PHP 應用程式。
  2. 轉到 設置>環境變數
  3. 選取 [+ 新增]。
  4. 對於 Name (名稱),輸入 PHP_INI_SCAN_DIR ,對於 Value (值),輸入 .:/home/site/wwwroot/ini
  5. 選擇 應用,然後再次 應用。 確認您的更改。

備註

如果您重新編譯了 PHP 擴展,例如 GD,請按照 重新編譯 PHP 擴展中的步驟作。

自訂 PHP_INI_SYSTEM 指令

要自訂 PHP_INI_SYSTEM 指令,請使用 PHP_INI_SCAN_DIR 應用程式設定。

首先,執行以下命令以新增一個名為 PHP_INI_SCAN_DIR 的應用程式設定。

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PHP_INI_SCAN_DIR="d:\home\site\ini"

在 Azure 門戶中,選擇你的應用。 在側邊欄功能表中的 Development Tools 下,選擇 Advanced Tools,然後轉到 d:\home\site 使用SSH。

d:\home\site 中創建一個名為 ini 的目錄。 然後,在目錄中創建一個 d:\home\site\ini 檔(例如 settings.ini),其中包含要自定義的指令。 請使用與您在 php.ini 檔案中相同的語法。

例如,要更改 expose_php 的值,請執行以下命令:

cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini

要使更改生效,請重新啟動應用程式。

要自定義 PHP_INI_SYSTEM 指令,您不能使用 .htaccess 方法。 App Service 提供一種使用 PHP_INI_SCAN_DIR 應用程式設定的獨立機制。

首先,執行以下命令以新增一個名為 PHP_INI_SCAN_DIR 的應用程式設定。

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PHP_INI_SCAN_DIR="/usr/local/etc/php/conf.d:/home/site/ini"

該值 /usr/local/etc/php/conf.dphp.ini 所在的預設目錄。 該值 /home/site/ini 是您在其中添加自訂 .ini 檔的自定義目錄。 用冒號 (): 分隔值。

前往您的 Linux 容器的 Web SSH 會話。

/home/site 中創建一個名為 ini 的目錄。 然後,在目錄中創建一個 /home/site/ini 檔(例如 settings.ini),其中包含要自定義的指令。 請使用與您在 php.ini 檔案中相同的語法。

小提示

應用服務中的內置 Linux 容器用作 /home 持久共用存儲。

例如,要更改 expose_php 的值,請執行以下命令:

cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini

要使更改生效,請重新啟動應用程式。

啟用 PHP 擴展

內置 PHP 安裝包含最常用的擴展。 您可以像 自訂 php.ini 指令一樣啟用更多擴展。

備註

查看 PHP 版本和當前 php.ini 設定的最佳方法是在應用程式中使用 phpinfo()

要啟用其他擴展,請使用以下步驟:

  1. 在應用的根目錄下添加一個 bin 目錄,並將 .dll 擴展檔放入其中,例如 mongodb.dll. 確保擴展與 Azure 中的 PHP 版本相容,並且它們與 VC9 和非線程安全 (NTS) 相容。

  2. 實施你的更改。

  3. 按照 自訂 PHP_INI_SYSTEM 指令中的步驟作,並使用 extensionzend_extension 指令將擴展名添加到自訂 .ini 檔中:

    extension=d:\home\site\wwwroot\bin\mongodb.dll
    zend_extension=d:\home\site\wwwroot\bin\xdebug.dll
    

要使更改生效,請重新啟動應用程式。

內置 PHP 安裝包含最常用的擴展。 您可以像 自訂 php.ini 指令一樣啟用更多擴展。

備註

查看 PHP 版本和當前 php.ini 設定的最佳方法是在應用程式中使用 phpinfo()

要啟用其他擴展,請使用以下步驟:

  1. 將目錄 bin 添加到應用程式的根目錄,並將 .so 擴展檔放入其中(例如, mongodb.so)。 確保擴展與 Azure 中的 PHP 版本相容,並且它們與 VC9 和非線程安全 (NTS) 相容。

  2. 實施你的更改。

  3. 按照 自訂 PHP_INI_SYSTEM 指令中的步驟作,並使用 extensionzend_extension 指令將擴展名添加到自訂 .ini 檔中:

    extension=/home/site/wwwroot/bin/mongodb.so
    zend_extension=/home/site/wwwroot/bin/xdebug.so
    

要使更改生效,請重新啟動應用程式。

存取診斷記錄

使用標準 error_log() 工具使診斷日誌顯示在 Azure 應用服務中。

若要存取 App Service 中應用程式程式代碼內產生的控制台記錄,請在 Cloud Shell 中執行下列命令來開啟診斷記錄:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

的可能值為 --levelErrorWarningInfoVerbose。 後續的每個層級都包含上一個層級。 例如, Error 只包含錯誤訊息。 Verbose 包含所有訊息。

開啟診斷記錄之後,請執行下列命令來查看記錄資料流:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

如果主控台記錄未立即出現,請在30秒後再次檢查。

若要隨時停止記錄串流,請選取 Ctrl+C

您可以存取從容器內部生成的控制台日誌。

若要開啟容器記錄,請執行下列命令:

az webapp log config --name <app-name> --resource-group <resource-group-name> --docker-container-logging filesystem

<app-name><resource-group-name> 替換為適合您 Web 應用程式的名稱。

開啟容器記錄之後,請執行下列命令來查看記錄數據流:

az webapp log tail --name <app-name> --resource-group <resource-group-name>

如果主控台記錄未立即出現,請在30秒後再次檢查。

若要隨時停止記錄串流,請選取 Ctrl+C

疑難排解

當正常工作的 PHP 應用在應用服務中的行為不同或出現錯誤時,請嘗試以下解決方案:

  • 訪問 診斷日誌流
  • 在生產模式下在本地測試應用程式。 應用服務在生產模式下運行應用,因此需要確保專案在本地生產模式下按預期工作。 例如:
    • 根據您的 composer.json 檔案,不同的套件可能會安裝於生產模式中(requirerequire-dev)。
    • 某些 Web 框架在生產模式下可能會以不同的方式部署靜態檔。
    • 某些 Web 框架在生產模式下運行時可能會使用自訂啟動腳本。
  • 在調試模式下在應用服務中運行應用。 例如,在 Laravel 中,您可以通過 APP_DEBUG 應用程式設置設置為 true來設定應用程式以在生產環境中輸出調試消息。

忽略記錄中的 robots933456 訊息

您可能會在容器記錄中看到下列訊息:

2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"

您可以放心忽略這個訊息。 /robots933456.txt 是一個虛擬 URL 路徑,App Service 會使用該路徑來檢查容器是否可以處理要求。 404 回應指出路徑不存在,並且會向App Service發出訊號,指出容器狀況良好且已準備好回應要求。