连接到 Azure Database for MySQL 时,Azure 应用服务上的 PHP 性能缓慢

2024-03-12

我正在 Linux Azure 应用服务上托管一个基于 CodeIgniter 3 框架编写的 PHP 7.2 网站(计划 P1v2)。该数据库是在 Azure Database for MySQL(通用、2vCore、5GB 存储)上运行的 MySQL 5.7,禁用了 SSL。

当我浏览我的网站时,加载实际上需要大约 8-9 秒,浏览器将保持白色页面并在加载完成后立即显示所有内容。 (大部分网站内容是从数据库中提取的)

我一直在监控应用服务和 MySQL DB,平均 %CPU 从未达到其分配资源的 50%,因此规格似乎不是问题。

我的外包开发团队有自己的测试环境(不在 Azure 上),他们说它几乎立即加载到他们的环境中,所以他们指责 Azure。

然后我注意到 Azure Advisor 告诉我有关此数据库的两件事,其中影响很大

改善MySQL连接延迟我们的内部遥测表明您连接到 MySQL 服务器的应用程序可能无法有效地管理连接。这可能会导致更高的应用程序延迟。为了改善连接延迟,我们建议您启用连接重定向。这可以通过启用 PHP 驱动程序的连接重定向功能来完成。

改进 MySQL 连接管理我们的内部遥测表明您连接到 MySQL 服务器的应用程序可能无法有效地管理连接。这可能会导致不必要的资源消耗和整体更高的应用程序延迟。为了改进连接管理,我们建议您减少短期连接的数量并消除不必要的空闲连接。这可以通过配置服务器端连接池来完成,例如 ProxySQL。

我现在正在努力启用连接重定向以减少延迟,但仍然没有成功,因为我不熟悉 CodeIgniter,所以我需要等待开发人员修复它。

我的问题是:此性能问题的原因是什么?这两个建议真的是这个问题的原因吗?

应用服务和数据库位于同一区域。它们是否像某种 LAN 连接一样进行本地通信?我希望应用服务的连接不会通过互联网传回 Azure DB,从而导致性能下降。

Thanks.


我已经解决了这个问题,事实证明 Azure Advisor 是对的!我已启用连接重定向,现在我的网站在 3 秒内完成加载。这是我所做的。

TL;DR 将您的应用程序配置为在连接到数据库时使用 SSL,并将mysqlnd_azure如果要在部署的应用程序中添加扩展文件,请将 Azure Web 应用程序的应用程序设置设置为读取使其加载扩展的 ini 文件。然后设置Azure MySQL DB服务器参数redirect_enabled打开并启用使用 TLS 1.2 强制实施 SSL。重新启动应用程序。

注意:确保设置强制 SSL 是您最后要做的事情,否则它将拒绝所有非 SSL 连接,并且您的应用程序将根本无法运行。


2021 年 1 月更新

我刚刚发现微软似乎已经内置了所需的mysqlnd_azure扩展到 Azure 应用服务。下面的大部分步骤不再需要。

您应该首先按照步骤 7 测试扩展是否已加载。如果mysqlnd_azure扩展名在列表中,那么您可以继续执行步骤 8-10。不过,您仍然需要按照步骤 1. 为数据库配置 SSL 证书。

然后,按照本答案末尾参考文献中的示例代码链接确认是否正在使用数据库连接重定向。你应该看到文字mysqlnd_azure.enableRedirect: preferred,后跟以下格式的文本:[random text and numbers].[random text and numbers again].[your azure region].worker.database.windows.net.

如果文本仍然显示您使用的 MySQL 主机名,例如mydatabase.mysql.database.azure.com,则未使用连接重定向。再检查一遍。

这条线下方的原始答案。


  1. 将您的应用程序配置为在连接到数据库时使用 SSL。在 CodeIgniter 中,它是database.php文件输入/application/config/。确保您使用的所有 MySQL 驱动程序都启用了 SSL。从以下位置下载 SSL 证书https://www.digicert.com/CACerts/BaltimoreCyber​​TrustRoot.crt.pem https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem并将其存储在您的应用程序的目录中,例如/cert/BaltimoreCyberTrustRoot.crt.pem

     /*Snippet from database.php*/
     $db['production'] = array(
         'dsn'   => '',
         'hostname' => getenv("DB_HOST"),
         'username' => getenv("DB_USER"),
         'password' => getenv("DB_PWD"),
         'database' => getenv("DB_NAME"),
         'dbdriver' => 'mysqli',
         'dbprefix' => '',
         'pconnect' => FALSE,
         'db_debug' => FALSE,
         'cache_on' => FALSE,
         'cachedir' => '',
         'char_set' => 'utf8',
         'dbcollat' => 'utf8_general_ci',
         'swap_pre' => '',
         'encrypt' => [
             'ssl_key'    => NULL,
             'ssl_cert'   => NULL,
             'ssl_ca'     => '/home/site/wwwroot/cert/BaltimoreCyberTrustRoot.crt.pem',
             'ssl_capath' => NULL,
             'ssl_cipher' => NULL,
             'ssl_verify' => FALSE
         ],
         'compress' => FALSE,
         'stricton' => FALSE,
         'failover' => array(),
         'save_queries' => TRUE
     );
    
     /*Snippet for PHP (PDO)*/
     <?php
     define('CONN_HOST', getenv("DB_HOST"));
     define('CONN_DATABASE', getenv("DB_NAME"));
     define('CONN_USER', getenv("DB_USER"));
     define('CONN_PASSWORD', getenv("DB_PWD"));
     define('CONN_OPTION', array(
         PDO::MYSQL_ATTR_SSL_CA          =>     '/home/site/wwwroot/cert/BaltimoreCyberTrustRoot.crt.pem',
         PDO::MYSQL_ATTR_INIT_COMMAND    => "SET NAMES utf8"
     ));
    
  2. Install mysqlnd_azure通过点击此链接进行扩展https://azureossd.github.io/2019/01/29/azure-app-service-linux-adding-php-extensions/ https://azureossd.github.io/2019/01/29/azure-app-service-linux-adding-php-extensions/或者,如果您只想立即使用 .so 扩展名,请从以下位置下载:http://www.mediafire.com/file/g6mzeld0wnqedw0/mysqlnd_azure.so/file http://www.mediafire.com/file/g6mzeld0wnqedw0/mysqlnd_azure.so/file否则自己构建它https://github.com/microsoft/mysqlnd_azure https://github.com/microsoft/mysqlnd_azure

  3. Put mysqlnd_azure.so在您的应用程序的目录中。例如。/bin/mysqlnd_azure.so然后将代码部署到 Azure

  4. 通过 SSH 连接到您的应用服务,在其中创建一个目录/home/site called ini。创建一个具有任意名称的 .ini 文件,例如设置.ini

  5. 使用 vi 或 nano 编辑该 ini 文件并粘贴这些行

    extension=/home/site/wwwroot/bin/mysqlnd_azure.so
    mysqlnd_azure.enableRedirect = on
    
  6. 告诉您的应用程序加载mysqlnd_azure通过添加名为的应用程序设置来扩展PHP_INI_SCAN_DIR有价值/usr/local/etc/php/conf.d:/home/site/ini

  7. 保存应用程序设置后,Azure 将强制重新启动您的应用程序。之后您可以再次检查扩展是否已通过 SSH 加载并运行php -m查看所有加载的扩展。如果你看到mysqlnd_azure在列表中,您走在正确的道路上!如果没有,此命令应该说明为什么无法加载该扩展

  8. 在 Azure 门户上,导航到 Azure MySQL 数据库并设置服务器参数redirect_enabled to ON

  9. 在连接安全性下,启用强制 SSL 连接并选择 TLS 1.2

  10. 再次重新启动应用程序。

如果你使用sslmode=verify-ca or sslmode=verify-full,您需要在2020年10月26日切换到新的SSL证书。参考https://learn.microsoft.com/en-us/azure/mysql/concepts-certificate-rotation https://learn.microsoft.com/en-us/azure/mysql/concepts-certificate-rotation Update:Microsoft 已将根证书弃用的截止日期延长至 2021 年 2 月 15 日。

如果您有任何部署槽,请确保对每个槽执行步骤 4-7。

参考:

  • 用于确认连接重定向是否正常工作的示例代码https://learn.microsoft.com/en-us/azure/mysql/howto-redirection#confirm-redirection https://learn.microsoft.com/en-us/azure/mysql/howto-redirection#confirm-redirection
  • 应用服务 Linux - 更新 PHP 设置https://azureossd.github.io/2019/01/29/azure-app-service-linux-update-php-settings/ https://azureossd.github.io/2019/01/29/azure-app-service-linux-update-php-settings/
  • 在应用程序中配置 SSL 连接以安全地连接到 Azure Database for MySQLhttps://learn.microsoft.com/en-us/azure/mysql/howto-configure-ssl https://learn.microsoft.com/en-us/azure/mysql/howto-configure-ssl
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连接到 Azure Database for MySQL 时,Azure 应用服务上的 PHP 性能缓慢 的相关文章

  • Mysql 将 int 转换为 MAC

    我有一些数据可以转换 其中有 2 列 其中一列有 IP 它包含整数值 我在 mysql 查询中使用了以下函数 是否有一个函数可以用来转换我的 mac 列 其中包含整数和数据类型是bigint to MAC地址 SELECT INET NTO
  • PHP:读取所有传入 HTTP 请求的类 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • 如何在 PHP 的 HTML 页面中显示错误消息?

    我有以下登录表单 login php 其中要求输入用户名和密码
  • 执行 SET {Key} 超时,inst: 0,mgr: Inactive,queue: 2, qu=1, qs=1, qc=0, wr=1/1, in=0/0

    我正在尝试使用 StackExchange Redis 客户端将 90 KB pdf 文件保存到 Azure Redis 缓存中 我已将该文件转换为字节数组并尝试使用 stringSet 方法保存它并收到错误 Code byte bytes
  • 如何将表中不存在但原始SQL中存在的实体字段设置为别名?

    假设我们有一个这样的查询 SELECT CUSTOM EXPRESSION as virtualfield FROM users 用户的实体本身具有 虚拟字段 但映射注释没有 因为表没有该字段 假设它作为原始 SQL 执行 我们如何使用上面
  • 在哪里可以获得 PHP 5.3+ 的 runkit DLL 扩展?

    这是一个简单的问题 我在哪里可以获得 PHP 5 3 版本的 runkit 扩展 它的手册 http php net manual en book runkit php http php net manual en book runkit
  • Laravel Vue 组件只能传递数字?

    在我的 UserMenu vue 中我写道 export default props nameVal data return 并在blade php中
  • 在 foreach 中使用 QueryPath 的多个查找

    我正在使用 QueryPath 和 PHP 这发现 eventdate 没问题 但不会为 dtstart 返回任何内容 qp htmlqp url foreach qp gt find table schedule gt find tr a
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 是否可以用 PHP 编写电子邮件解析器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Facebook PHP-SDK 页面刷新后似乎丢失了 userID

    我似乎登录工作正常 我可以登录 接受应用程序 第一次 然后显示用户信息 例如姓名 图片 等 然而 当我刷新页面时 userid 又回到 0 我必须再次登录 我不确定问题是什么 我必须在每次页面加载时重新启动它还是什么 我不知道 我会发布一些
  • 如何在 Windows 上安装 Zend 框架

    安装 Zend Framework 就是这么简单 是的 对 好吧 我正在写一本初学者的书 有一件不太详细的事情是最重要的部分 安装该死的东西 浏览了几个小时的快速入门指南后 它只说 下载 Zend 添加包含目录 bla bla 然后就完成了
  • 使用 PHP 从 Mongo 解码 JSON

    我已经看过这个线程 PHP 解码嵌套 JSON https stackoverflow com questions 3555335 php decode nested json并没有设法用它来解决我的问题 我目前正在从 Mongo 获取 J
  • PHP 编码风格回归;在开关/外壳中

    我们正在尝试为我们的团队实施新的编码风格指南 当未找到 break 时 php codeniffer 会在 switch case 语句上打印警告 如下所示 switch foo case 1 return 1 case 2 return
  • CodeIgniter:My_Lang 中的 get_instance

    我发现这个有用的国际化代码 http pastebin com SyKmPYTX http pastebin com SyKmPYTX 一切正常 除了我无法在此类中使用 CI 函数 我想从 DB 设置 languages 和 special
  • PHP 接口有属性吗?

    PHP 中的接口有属性 还是只有方法 您可以在 DocBlock 中为接口声明属性 然后 IDE 将提示接口的这些属性 PhpStorm 会这样做 但这不会强制在实现类中实际实现这些字段 例如 property string passwor
  • php - 解析html页面

    div divbox div p para1 p p para2 p p para3 p table class table tr td td tr table p para4 p p para5 p 有人可以告诉我如何解析这个 html
  • PHP 中的 -> 和 :: 有什么区别?

    这个东西困扰我好久了 一直找不到 在 php 中使用 和 gt 之间的类有什么区别 让我举个例子 想象一个名为 MyClass 的类 该类中有一个函数 myFunction 使用有什么区别 MyClass myclass new MyCla
  • PHP更改小数点分隔符

    在某些情况下 PHP 会在操作后更改小数点分隔符 下面是一个示例 为什么小数点分隔符变成 这是一个多语言网站 在西班牙语版本中 区域设置设置为西班牙语 es ES 小数点分隔符为 这就是为什么正在改变 解决方案是强制 LC NUMERIC

随机推荐