- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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.
最佳答案
我已经解决了这个问题,结果 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
,则未使用连接重定向。再检查一遍。
此行下方的原始答案。
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/home/site
中创建一个目录叫 ini
.创建一个任何名称的 .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
php -m
查看所有加载的扩展。如果您看到 mysqlnd_azure
在列表中,您走在正确的道路上!如果没有,此命令应该说明为什么它无法加载该扩展redirect_enabled
打开sslmode=verify-ca
或
sslmode=verify-full
,需要在2020年10月26日切换到新的SSL证书。引用
https://docs.microsoft.com/en-us/azure/mysql/concepts-certificate-rotation
更新: Microsoft 已将根证书弃用的截止日期延长至 2021 年 2 月 15 日。
关于连接到 Azure Database for MySQL 时,Azure App Service 上的 PHP 性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63970567/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!