警告
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
您的儲存庫根現在有兩個新檔: .deployment
和 deploy.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
您的儲存庫根現在有兩個新檔: .deployment
和 deploy.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 包來部署應用,則應用服務中的生成自動化將按以下順序執行:
- 若
PRE_BUILD_SCRIPT_PATH
指定自定義腳本,則運行它。 - 執行
php composer.phar install
。 - 若
POST_BUILD_SCRIPT_PATH
指定自定義腳本,則運行它。
PRE_BUILD_COMMAND
和 POST_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_PERDIR
PHP_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_USER
Linux Web 應用程式的、 PHP_INI_PERDIR
和 PHP_INI_ALL
指令(如 upload_max_filesize
和 expose_php
),請使用自訂 .ini 檔。 您可以在 SSH 工作階段中建立它。 首先,設置目錄:
- 轉到您的 Kudu 網站。 若要取得隨機哈希和區域值,請在您的應用程式 [概 觀] 中複製 [預設網域]。
- 在頂部功能表上,選擇 Debug console(調試控制台),然後選擇 Bash 或 SSH。
- 在Bash或 SSH 中,轉到您的
/home/site/wwwroot
目錄。 - 創建名為
ini
( 例如,mkdir ini
) 的目錄。 - 將當前工作目錄更改為
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
。
- 轉到 Azure 門戶 ,然後選擇應用服務 Linux PHP 應用程式。
- 轉到 設置>環境變數。
- 選取 [+ 新增]。
- 對於 Name (名稱),輸入 PHP_INI_SCAN_DIR ,對於 Value (值),輸入 .
:/home/site/wwwroot/ini
- 選擇 應用,然後再次 應用。 確認您的更改。
備註
如果您重新編譯了 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.d
是 php.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()
。
要啟用其他擴展,請使用以下步驟:
在應用的根目錄下添加一個
bin
目錄,並將 .dll 擴展檔放入其中,例如mongodb.dll
. 確保擴展與 Azure 中的 PHP 版本相容,並且它們與 VC9 和非線程安全 (NTS) 相容。實施你的更改。
按照 自訂 PHP_INI_SYSTEM 指令中的步驟作,並使用 extension 或 zend_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()
。
要啟用其他擴展,請使用以下步驟:
將目錄
bin
添加到應用程式的根目錄,並將 .so 擴展檔放入其中(例如,mongodb.so
)。 確保擴展與 Azure 中的 PHP 版本相容,並且它們與 VC9 和非線程安全 (NTS) 相容。實施你的更改。
按照 自訂 PHP_INI_SYSTEM 指令中的步驟作,並使用 extension 或 zend_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
的可能值為 --level
Error
、 Warning
、 Info
和 Verbose
。 後續的每個層級都包含上一個層級。 例如, 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
檔案,不同的套件可能會安裝於生產模式中(require
與require-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發出訊號,指出容器狀況良好且已準備好回應要求。