gpt4 book ai didi

连接到 Azure Database for MySQL 时,Azure App Service 上的 PHP 性能下降

转载 作者:行者123 更新时间:2023-12-03 21:10:43 30 4
gpt4 key购买 nike

我在 Linux Azure 应用服务(计划 P1v2)上托管在 CodeIgniter 3 框架上编写的 PHP 7.2 网站。数据库是 MySQL 5.7,在 Azure Database for MySQL(通用,2vCores,5GB 存储)上运行,禁用 SSL。
当我浏览我的网站时,它实际上需要大约 8-9 秒的时间来加载浏览器将停留在白色页面并在加载完成后立即显示所有内容的地方。 (大部分网站内容是从数据库中提取的)
我一直在监控应用服务和 MySQL 数据库,平均 %CPU 从未达到其分配资源的 50%,因此规范似乎不是问题。
我的外包开发团队有他们自己的测试环境(不在 Azure 上),他们说它几乎立即加载到他们的环境中,所以他们指责 Azure。
然后我注意到 Azure 顾问告诉我关于这个数据库的两件事,其中影响很大

Improve MySQL connection latencyOur internal telemetry indicates that your application connecting to MySQL server may not be managing connections efficiently. This may result in higher application latency. To improve connection latency, we recommend that you enable connection redirection. This can be done by enabling the connection redirection feature of the PHP driver.


Improve MySQL connection managementOur internal telemetry indicates that your application connecting to MySQL server may not be managing connections efficiently. This may result in unnecessary resource consumption and overall higher application latency. To improve connection management, we recommend that you reduce the number of short-lived connections and eliminate unnecessary idle connections. This can be done by configuring a server side connection-pooler, such as ProxySQL.


我现在正在努力启用连接重定向以减少延迟,但仍然没有成功,因为我不熟悉 CodeIgniter,所以我需要等待开发人员修复它。
我的问题是:这个性能问题的原因是什么?这两个建议真的是这个问题的原因吗?
应用服务和数据库都在同一个区域。它们是否像某种 LAN 连接那样在本地进行通信?我希望来自 App Service 的连接不会通过 Internet 然后返回到 Azure DB,从而导致性能下降。
谢谢。

最佳答案

我已经解决了这个问题,结果 Azure 顾问是对的!我已启用连接重定向,现在我的网站在 3 秒内完成加载。这是我所做的。
TL;DR 将您的应用程序配置为在连接到数据库时使用 SSL 并放置 mysqlnd_azure在部署的应用程序中创建扩展文件,设置 Azure Web 应用程序的应用程序设置以读取使其加载扩展程序的 ini 文件。然后设置 Azure MySQL DB 服务器参数 redirect_enabled打开并启用使用 TLS 1.2 强制 SSL。重新启动应用程序。
注意:确保设置 Enforce 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 ,则未使用连接重定向。再检查一遍。
此行下方的原始答案。

  • 将您的应用程序配置为在连接到数据库时使用 SSL。在 CodeIgniter 中,它是 database.php文件在 /application/config/ .确保您使用的所有 MySQL 驱动程序都启用了 SSL。从 https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem 下载 SSL 证书并将其存储在您的应用程序目录中,例如/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"
    ));
  • 安装 mysqlnd_azure通过点击此链接进行扩展 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 下载它否则从 https://github.com/microsoft/mysqlnd_azure 自己构建它
  • mysqlnd_azure.so在您的应用程序目录中。例如。 /bin/mysqlnd_azure.so然后将代码部署到 Azure
  • SSH 到您的应用服务,在 /home/site 中创建一个目录叫 ini .创建一个任何名称的 .ini 文件,例如设置文件
  • 使用 vi 或 nano 编辑该 ini 文件并粘贴这些行
    extension=/home/site/wwwroot/bin/mysqlnd_azure.so
    mysqlnd_azure.enableRedirect = on
  • 告诉您的应用加载 mysqlnd_azure通过添加名为 PHP_INI_SCAN_DIR 的应用程序设置来扩展带值 /usr/local/etc/php/conf.d:/home/site/ini
  • 保存应用设置后,Azure 将强制重启你的应用。之后,您可以再次检查扩展是否已被 SSH 加载并运行 php -m查看所有加载的扩展。如果您看到 mysqlnd_azure在列表中,您走在正确的道路上!如果没有,此命令应该说明为什么它无法加载该扩展
  • 在 Azure 门户上,导航到 Azure MySQL DB 并设置服务器参数 redirect_enabled打开
  • 在连接安全下,启用强制 SSL 连接并选择 TLS 1.2
  • 再次重新启动应用程序。

  • 如果您使用 sslmode=verify-casslmode=verify-full ,需要在2020年10月26日切换到新的SSL证书。引用 https://docs.microsoft.com/en-us/azure/mysql/concepts-certificate-rotation 更新: Microsoft 已将根证书弃用的截止日期延长至 2021 年 2 月 15 日。
    如果您有任何部署槽,请确保为每个槽执行步骤 4-7。
    引用:
  • 用于确认连接重定向是否有效的示例代码 https://docs.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/
  • 在应用程序中配置 SSL 连接以安全地连接到 Azure Database for MySQL https://docs.microsoft.com/en-us/azure/mysql/howto-configure-ssl
  • 关于连接到 Azure Database for MySQL 时,Azure App Service 上的 PHP 性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63970567/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com