为 Azure 应用服务配置 PHP 应用

显示 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 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

设置 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 中的说明将 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

如果希望应用服务在部署时运行常用的自动化工具(如 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

此代码片段运行 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

此代码片段运行 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

此代码片段运行 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 应用的详细信息,请参阅 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。

检测 HTTPS 会话

在应用服务中,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.ini 设置

如果需要更改 PHP 安装,可以按照以下步骤更改任何 php.ini 指令

备注

查看 PHP 版本和当前 php.ini 配置的最佳方式是在应用中调用 phpinfo()。

自定义非 PHP_INI_SYSTEM 指令

若要自定义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 会话中创建它。

  1. 转到你的 KUDU 站点 https://<sitename>.scm.chinacloudsites.cn。
  2. 从顶部菜单中选择 Bash 或 SSH。
  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. 对于“应用设置名称”,请输入“PHP_INI_SCAN_DIR”;对于“值”,请输入“:/home/site/wwwroot/ini”。
  5. 选择“保存”按钮。

备注

如果重新编译 PHP 扩展(如 GD),请按照 在 Azure 应用服务中重新编译 PHP 扩展的步骤作 - 添加 PHP 扩展

自定义PHP_INI_SYSTEM指令

若要自定义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 安装包含最常用的扩展。 可以采用与 自定义 php.ini 指令相同的方式启用其他扩展。

备注

查看 PHP 版本和当前 php.ini 配置的最佳方式是在应用中调用 phpinfo()。

若要启用其他扩展,请执行以下步骤:

bin 目录添加到应用的根目录,并将扩展文件放入 .dll 其中(例如 ,mongodb.dll)。 确保扩展与 Azure 中的 PHP 版本兼容,并且与 VC9 和非线程安全(nts)兼容。

部署所做的更改。

按照自定义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()。

若要启用其他扩展,请执行以下步骤:

bin 目录添加到应用的根目录,并将扩展文件放入 .so 其中(例如 ,mongodb.so)。 确保扩展与 Azure 中的 PHP 版本兼容,并且与 VC9 和非线程安全(nts)兼容。

部署所做的更改。

按照自定义PHP_INI_SYSTEM指令中的步骤进行,使用extensionzend_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 的可能值为:ErrorWarningInfoVerbose。 每个后续级别包括上一个级别。 例如: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,可以为生产模式安装不同的包(requirerequire-dev
    • 某些 Web 框架可能会在生产模式下以不同的方式部署静态文件。
    • 某些 Web 框架可能会在生产模式下运行时使用自定义启动脚本。
  • 在调试模式下在应用服务中运行应用。 例如,在 Laravel 中,可以通过 将应用设置设置为 APP_DEBUGtrue 将应用配置为输出生产中的调试消息。

日志中的 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 路径,应用服务使用它来检查容器能否为请求提供服务。 404 响应只是指示该路径不存在,但它让应用服务知道容器处于正常状态并已准备就绪,可以响应请求。

后续步骤

或者参阅其他资源:

环境变量和应用设置参考