本指南介绍如何在 Azure 应用服务中配置 PHP Web 应用、移动后端和 API 应用。
本指南为将应用部署到应用服务的 PHP 开发人员提供了关键概念和说明。 如果从未使用过 Azure 应用服务,请先学习 PHP 快速入门 和 PHP 和 MySQL 教程 。
若要显示当前的 PHP 版本,请在 Azure CLI 中运行以下命令:
az webapp config show --resource-group <resource-group-name> --name <app-name> --query phpVersion
备注
若要对开发槽进行寻址,请包含参数 --slot
,后跟槽的名称。
若要显示所有受支持的 PHP 版本,请在 Azure CLI 中运行以下命令:
az webapp list-runtimes --os windows | grep PHP
本指南介绍如何在 Azure 应用服务中配置 PHP Web 应用、移动后端和 API 应用。
本指南为将应用部署到应用服务的 PHP 开发人员提供了关键概念和说明。 如果从未使用过 Azure 应用服务,请先学习 PHP 快速入门 和 PHP 和 MySQL 教程 。
若要显示当前的 PHP 版本,请在 Azure CLI 中运行以下命令:
az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion
备注
若要对开发槽进行寻址,请包含参数 --slot
,后跟槽的名称。
若要显示所有受支持的 PHP 版本,请在 Azure CLI 中运行以下命令:
az webapp list-runtimes --os linux | grep PHP
在 Azure CLI 中运行以下命令,将 PHP 版本设置为 8.1:
az webapp config set --resource-group <resource-group-name> --name <app-name> --php-version 8.1
在 Azure CLI 中运行以下命令,将 PHP 版本设置为 8.1:
az webapp config set --resource-group <resource-group-name> --name <app-name> --linux-fx-version "PHP|8.1"
如果希望应用服务在部署时运行 Composer ,最简单的方法是在存储库中包含 Composer。
从本地终端窗口中,将目录更改为存储库根目录,并按照 下载 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 应作为部署自动化的一部分运行。
如果希望应用服务在部署时运行常用的自动化工具(如 Grunt、Bower 或 Gulp),则需要提供 自定义部署脚本。 当你在启用了生成自动化的情况下通过 Git 或 Zip 部署进行部署时,应用服务会运行此脚本。
若要使你的存储库能够运行这些工具,需要将它们添加到 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 应用的详细信息,请参阅 Oryx 文档:如何检测和生成 PHP 应用。
如果需要,可以通过在 Azure CLI 中运行以下命令,在容器启动时运行自定义命令:
az webapp config set --resource-group <resource-group-name> --name <app-name> --startup-file "<custom-command>"
在应用服务中,可以在应用代码外部设置应用设置。 然后,可以使用标准 getenv() 模式访问它们。 例如,若要访问名为 DB_HOST
的应用设置,请使用以下代码:
getenv("DB_HOST")
所选的 Web 框架可以使用子目录作为网站根目录。 例如, Laravel 使用 公共/ 子目录作为站点根目录。
若要自定义站点根目录,请使用 az resource update
命令为应用设置虚拟应用程序路径。 以下示例将站点根目录设置为存储库中的 公共/ 子目录。
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,并通过使用指令配置 Nginx 服务器root
来更改站点根。 此示例 配置文件 包含以下代码片段,用于更改 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 配置文件替换为存储库根目录中名为 默认值 的文件,并重启 Nginx。
在应用服务中,TLS/SSL 终止在网络负载均衡器上发生,因此,所有 HTTPS 请求将以未加密的 HTTP 请求形式访问你的应用。 如果应用逻辑需要检查用户请求是否已加密,可以检查 X-Forwarded-Proto
标头。
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() 默认检查其值 X_FORWARDED_PROTO
。
如果需要更改 PHP 安装,可以按照以下步骤更改任何 php.ini 指令 。
备注
查看 PHP 版本和当前 php.ini 配置的最佳方式是在应用中调用 phpinfo()。
若要自定义PHP_INI_USER、PHP_INI_PERDIR和PHP_INI_ALL指令(请参阅 php.ini 指令),请将文件添加到 .user.ini
应用的根目录。
使用与php.ini
文件相同的语法将配置设置添加到.user.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
文件的替代方法,可以在应用中使用 ini_set() 来自定义这些非PHP_INI_SYSTEM指令。
若要为 linux Web 应用(如 upload_max_filesize 和 expose_php)自定义PHP_INI_USER、PHP_INI_PERDIR和PHP_INI_ALL指令,请使用自定义的“ini”文件。 可以在 SSH 会话中创建它。
- 转到你的 KUDU 站点 https://<sitename>.scm.chinacloudsites.cn。
- 从顶部菜单中选择 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 应用程序。
- 选择应用的应用程序设置。
- 在“应用程序设置”部分下,选择“ + 添加新设置”。
- 对于“应用设置名称”,请输入“PHP_INI_SCAN_DIR”;对于“值”,请输入“:/home/site/wwwroot/ini”。
- 选择“保存”按钮。
备注
如果重新编译 PHP 扩展(如 GD),请按照 在 Azure 应用服务中重新编译 PHP 扩展的步骤作 - 添加 PHP 扩展
若要自定义PHP_INI_SYSTEM指令(请参阅 php.ini 指令),请使用 PHP_INI_SCAN_DIR
应用设置。
首先,在 Azure CLI 中运行以下命令,以添加名为 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"
导航到 Kudu 控制台(https://<app-name>.scm.chinacloudsites.cn/DebugConsole
)并导航到 d:\home\site
。
在d:\home\site
中创建一个名为ini
的目录,然后在d:\home\site\ini
目录中创建一个.ini文件(例如settings.ini),并在其中写入您要自定义的指令。 在 php.ini 文件中使用相同的语法。
例如,若要更改 expose_php 的值,请运行以下命令:
cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini
若要使更改生效,请重启应用。
若要自定义PHP_INI_SYSTEM指令(请参阅 php.ini 指令),无法使用 .htaccess 方法。 应用服务通过 PHP_INI_SCAN_DIR
应用设置提供一种独立的机制。
首先,在 Azure CLI 中运行以下命令,以添加名为 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 会话(https://<app-name>.scm.chinacloudsites.cn/webssh/host
)。
在/home/site
中创建名为ini
的目录,然后在/home/site/ini
目录中创建一个.ini文件 (例如 settings.ini),并加入你想要自定义的指令。 在 php.ini 文件中使用相同的语法。
提示
在应用服务中的内置 Linux 容器中, /home 用作持久共享存储。
例如,若要更改 expose_php 的值,请运行以下命令:
cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini
若要使更改生效,请重启应用。
内置 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 应用服务中。
若要访问应用服务中的应用程序代码内生成的控制台日志,请在 Azure CLI 中运行以下命令以打开诊断日志记录:
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 秒后重新查看。
备注
也可通过浏览器在 https://<app-name>.scm.chinacloudsites.cn/api/logs/docker
中检查日志文件。
若要随时停止日志流式处理,请键入 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。
您也可以在浏览器中通过https://<app-name>.scm.chinacloudsites.cn/api/logs/docker
检查日志文件。
当工作 PHP 应用在应用服务中的行为不同或有错误时,请尝试以下操作:
- 访问日志流。
- 在生产模式下,在本地测试应用。 应用服务在生产模式下运行应用,因此需要确保项目在本地生产模式下按预期工作。 例如:
- 根据 composer.json,可以为生产模式安装不同的包(
require
与require-dev
)。 - 某些 Web 框架可能会在生产模式下以不同的方式部署静态文件。
- 某些 Web 框架可能会在生产模式下运行时使用自定义启动脚本。
- 根据 composer.json,可以为生产模式安装不同的包(
- 在调试模式下在应用服务中运行应用。 例如,在 Laravel 中,可以通过 将应用设置设置为
APP_DEBUG
true
将应用配置为输出生产中的调试消息。
你可能会在容器日志中看到以下消息:
2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"
可以放心忽略此消息。 /robots933456.txt
是一个虚拟 URL 路径,应用服务使用它来检查容器能否为请求提供服务。 404 响应只是指示该路径不存在,但它让应用服务知道容器处于正常状态并已准备就绪,可以响应请求。
或者参阅其他资源: