如何在Ubuntu 20.04上使用MySQL设置远程数据库以优化网站性能

介绍

随着您的应用程序或网站的发展,可能会出现您已经超出了当前的服务器设置。如果您将 Web 服务器和数据库后端托管在同一台机器上,将这两个功能分开可能是一个好主意,这样每个功能都可以在自己的硬件上运行,并分享响应访问者请求的负载。

在本指南中,您将配置一个远程 MySQL 数据库服务器,您的 Web 应用程序可以连接到该服务器。WordPress 被用作示例,以便有一些内容可以使用,但该技术广泛适用于任何由 MySQL 支持的应用程序。

先决条件

在开始本教程之前,您需要:

  • 两台 Ubuntu 20.04 服务器。每台服务器应该有一个具有sudo权限和启用了UFW防火墙的非root用户,正如我们的使用Ubuntu 20.04进行初始服务器设置教程中所述。其中一台服务器将托管您的MySQL后端,并在本指南中被称为数据库服务器。另一台将远程连接到您的数据库服务器,并充当您的Web服务器;同样,在本指南中,它将被称为Web服务器
  • 在您的数据库服务器上:已安装MySQL。请按照在Ubuntu 20.04上安装MySQL的方法进行设置。
  • 在您的 Web 服务器上安装了 Nginx 和 PHP。我们的教程《在 Ubuntu 20.04 上安装 Linux、Nginx、MySQL、PHP(LEMP 栈)》将指导您完成整个过程,但请注意,您应该跳过该教程的第二步,该步骤涉及安装 MySQL,因为您将在数据库服务器上安装 MySQL。
    • 可选(但强烈推荐)在您的 Web 服务器上安装来自 Let’s Encrypt 的 TLS/SSL 证书。您需要购买一个域名,并为您的服务器设置 DNS 记录,但证书本身是免费的。我们的指南《如何在 Ubuntu 20.04 上使用 Let’s Encrypt 保护 Nginx》将向您展示如何获取这些证书。

步骤1 — 配置MySQL在数据库服务器上监听远程连接

将数据存储在单独的服务器上是在单机配置达到性能瓶颈后优雅扩展的好方法。它还提供了基本结构,以在稍后的时间负载均衡和扩展您的基础设施。按照先决条件教程安装MySQL后,您需要更改一些配置值以允许来自其他计算机的连接。

大多数MySQL服务器的配置更改可以在mysqld.cnf文件中进行,该文件默认存储在/etc/mysql/mysql.conf.d/目录中。以root权限在首选编辑器中打开您的数据库服务器上的此文件。此示例使用nano

  1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

此文件分为由方括号([])中的标签表示的部分。找到标记为mysqld的部分:

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
[mysqld]
. . .

在此部分中,查找名为bind-address的参数。这告诉数据库软件要监听哪个网络地址上的连接。

默认情况下,此设置为127.0.0.1,意味着MySQL配置为仅寻找本地连接。您需要更改此设置以引用可以到达您服务器的外部IP地址。

如果您的两台服务器都位于具有私有网络功能的数据中心,请使用数据库服务器的专用网络IP。否则,您可以使用其公共IP地址:

/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
. . .
bind-address = db_server_ip

因为您将通过互联网连接到数据库,建议您要求加密连接以保护数据安全。如果不加密MySQL连接,网络中的任何人都可以窃取在您的Web和数据库服务器之间的敏感信息。要加密MySQL连接,请在刚刚更新的bind-address行之后添加以下行:

/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
. . .
require_secure_transport = on
. . .

完成后保存并关闭文件。如果您使用nano,请按CTRL + XY,然后ENTER

要使SSL连接正常工作,您需要创建一些密钥和证书。 MySQL带有一个命令,可以自动设置这些。运行以下命令,它将创建所需的文件。它还通过指定mysql用户的UID使它们可被MySQL服务器读取:

  1. sudo mysql_ssl_rsa_setup --uid=mysql

为了强制MySQL更新其配置并读取新的SSL信息,请重启数据库:

  1. sudo systemctl restart mysql

确认服务器现在正在侦听外部接口,运行以下ss命令:

  1. sudo ss -plunt | grep mysqld
Output
tcp LISTEN 0 70 127.0.0.1:33060 0.0.0.0:* users:(("mysqld",pid=4053,fd=22)) tcp LISTEN 0 151 db_server_ip:3306 0.0.0.0:* users:(("mysqld",pid=4053,fd=24))

ss 打印关于服务器网络系统的统计信息。该输出显示一个名为 mysqld 的进程附加到端口为 3306db_server_ip 上,这是标准的 MySQL 端口,确认服务器正在监听适当的接口。

接下来,在防火墙上打开该端口以允许流量通过:

  1. sudo ufw allow mysql

这些是你需要对 MySQL 进行的所有配置更改。接下来,您将设置一个数据库和一些用户配置文件,其中一个用户配置文件将用于远程访问服务器。

步骤 2 —— 在数据库服务器上设置 WordPress 数据库和远程凭据

即使 MySQL 自身现在正在监听外部 IP 地址,但目前尚未配置启用远程的用户或数据库。创建一个用于 WordPress 的数据库,以及一对可以访问它的用户。

首先以 root MySQL 用户身份连接到 MySQL:

  1. sudo mysql

注意: 如果你已经启用了密码验证,就像在先决条件 MySQL 教程的第 3 步中描述的那样,你将需要使用以下命令来访问 MySQL shell:

  1. mysql -u root -p

运行此命令后,将要求您输入 MySQL root 密码,然后输入密码后,您将获得一个新的 mysql> 提示。

从 MySQL 提示符中,创建一个 WordPress 将使用的数据库。给这个数据库起一个容易识别的名称可能会有所帮助,以便您以后能够轻松识别它。在这里,它被命名为 wordpress

  1. CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

现在,您已经创建了您的数据库,接下来需要创建一对用户。创建一个仅限本地的用户以及一个与 Web 服务器 IP 地址相关联的远程用户。

首先,创建您的本地用户,local_db_user,并通过在声明中使用 localhost 使此帐户仅匹配本地连接尝试:

  1. CREATE USER 'local_db_user'@'localhost' IDENTIFIED BY 'password';

然后授予此帐户对 wordpress 数据库的完全访问权限:

  1. GRANT ALL PRIVILEGES ON wordpress.* TO 'local_db_user'@'localhost';

现在,这个用户可以对 WordPress 数据库执行任何操作,但此帐户无法远程使用,因为它只匹配来自本地机器的连接。考虑到这一点,创建一个配套的帐户,该帐户将仅匹配来自您的 Web 服务器的连接。为此,您需要您的 Web 服务器的 IP 地址。

请注意,您必须使用与您在 mysqld.cnf 文件中配置的网络相同的 IP 地址。这意味着如果您在 mysqld.cnf 文件中指定了一个私有网络 IP,则您将需要在以下两个命令中包含您的 Web 服务器的私有 IP。如果您配置 MySQL 使用公共互联网,则应该使用 Web 服务器的公共 IP 地址。

  1. CREATE USER 'remote_user'@'web_server_ip' IDENTIFIED BY 'password';

创建远程帐户后,赋予其与本地用户相同的权限:

  1. GRANT ALL PRIVILEGES ON wordpress.* TO 'remote_user'@'web_server_ip';

最后,刷新权限,以便MySQL知道要开始使用它们:

  1. FLUSH PRIVILEGES;

然后通过键入退出MySQL提示:

  1. exit

现在,您已经设置了一个新的数据库和一个启用了远程访问的用户,您可以继续测试是否能够从您的 Web 服务器连接到数据库。

步骤 3 — 测试远程和本地连接

在继续之前,最好验证您是否可以从本地机器(您的数据库服务器)和从您的 Web 服务器连接到数据库。

首先,通过尝试使用您的新帐户登录来测试来自数据库服务器的本地连接:

  1. mysql -u local_db_user -p

提示时,请输入为此帐户设置的密码。

如果您收到 MySQL 提示,则本地连接成功。您可以再次输入以下命令退出:

  1. exit

接下来,登录到您的Web 服务器以测试远程连接:

  1. ssh remote_user@web_server_ip

您需要在 Web 服务器上安装一些 MySQL 客户端工具,以便访问远程数据库。首先,如果您最近尚未这样做,请更新本地包缓存:

  1. sudo apt update

然后安装 MySQL 客户端实用程序:

  1. sudo apt install mysql-client

随后,使用以下语法连接到您的数据库服务器:

  1. mysql -u remote_user -h db_server_ip -p

再次确保您使用的是数据库服务器的正确IP地址。如果您已将MySQL配置为侦听私有网络,请输入数据库的私有网络IP。否则,请输入数据库服务器的公共IP地址。

您将被要求输入remote_user帐户的密码。输入密码后,如果一切正常,您将进入MySQL提示符。使用以下命令验证连接是否使用SSL:

  1. status

如果连接确实使用SSL,则SSL:行将指示此事,如下所示:

Output
-------------- mysql Ver 8.0.29-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu)) Connection id: 14 Current database: Current user: remote_user@web_server_ip SSL: Cipher in use is TLS_AES_256_GCM_SHA384 Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 8.0.29-0ubuntu0.20.04.2 (Ubuntu) Protocol version: 10 Connection: db_server_ip via TCP/IP Server characterset: utf8mb4 Db characterset: utf8mb4 Client characterset: utf8mb4 Conn. characterset: utf8mb4 TCP port: 3306 Binary data as: Hexadecimal Uptime: 1 hour 8 min 28 sec Threads: 2 Questions: 69 Slow queries: 0 Opens: 206 Flush tables: 3 Open tables: 125 Queries per second avg: 0.016 --------------

在验证了您可以远程连接后,退出提示符:

  1. exit

您已经验证了本地访问和从Web服务器的访问,但尚未验证其他连接是否将被拒绝。为了进行额外的检查,请尝试从第三台服务器执行相同的操作,而您并未在其中配置特定的用户帐户,以确保此其他服务器未被授予访问权限。

请注意,在运行以下命令尝试连接之前,您可能需要像之前一样安装MySQL客户端实用程序:

  1. mysql -u wordpressuser -h db_server_ip -p

此操作不应成功,并且应抛回类似于以下的错误:

Output
ERROR 1130 (HY000): Host '203.0.113.12' is not allowed to connect to this MySQL server

这是预期的,因为您尚未创建允许从此服务器连接的MySQL用户,并且也是期望的,因为您希望确保您的数据库服务器拒绝未经授权的用户访问您的MySQL服务器。

成功测试了远程连接后,您可以继续在Web服务器上安装WordPress。

第4步 — 为WordPress安装准备Web服务器

如果您已经按照先决条件教程进行了操作,那么应该已经安装了Nginx和PHP。WordPress及其许多插件都利用了许多额外的PHP扩展。在在Web服务器上安装WordPress之前,请通过安装其中一些用于WordPress的PHP扩展来准备您的服务器:

  1. sudo apt install php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip

注意:每个WordPress插件都有自己的一套要求。一些可能需要额外安装PHP扩展包。请查看您的插件文档以了解其PHP要求。如果可用,它们可以像前面的示例中那样使用apt进行安装。

安装扩展完成后,请重新启动PHP-FPM进程,以便正在运行的PHP处理器可以利用新安装的功能:

  1. sudo systemctl restart php7.4-fpm

接下来,对您的Nginx服务器块文件进行一些调整。根据先决条件教程,您应该在/etc/nginx/sites-available/目录中为您的站点配置了一个配置文件。它还应该配置为响应您服务器的域名或IP地址,并受到TLS/SSL证书的保护。/etc/nginx/sites-available/your_domain这里使用一个示例目录。请根据需要替换您的配置文件路径。

此外,在这个示例的 WordPress 安装中,/var/www/your_domain 将被用作根目录。再次强调,请根据您自己的配置使用指定的文档根目录。

注意:您可能正在使用 /etc/nginx/sites-available/default 默认配置,并将 /var/www/html 作为您的文档根目录。如果您只打算在此服务器上托管一个网站,那么这样做是可以的。如果不是,则最好将必要的配置拆分成逻辑块,每个站点一个文件。

使用您喜欢的编辑器打开站点的服务器块文件。本示例使用 nano

  1. sudo nano /etc/nginx/sites-available/your_domain

在此服务器块中,添加几个位置块。首先创建精确匹配位置块,用于请求 /favicon.ico/robots.txt,您不希望为这些请求记录日志。

您可以通过使用正则表达式位置来匹配任何静态文件请求,关闭这些请求的日志记录,并将它们标记为高度可缓存,因为这些通常是昂贵的资源。您可以调整此静态文件列表,以包含您的站点可能使用的任何其他文件扩展:

/etc/nginx/sites-available/your_domain
server {
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }
    . . .
}

在现有的 location / 块中,您可以调整 try_files 列表。首先,通过在第一行前加上井号(#)来注释默认设置。然后添加以下行:

/etc/nginx/sites-available/your_domain
server {
    . . .
    location / {
        #try_files $uri $uri/ =404;
        try_files $uri $uri/ /index.php$is_args$args;
    }
    . . .
}

通过此配置的新行,不再返回 404 错误作为默认选项,而是将控制权传递给带有请求参数的 index.php 文件。

总的来说,你文件的顶部应该类似于这样:

/etc/nginx/sites-available/your_domain
server {
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }

    location / {
       # try_files $uri $uri/ =404;
        try_files $uri $uri/ /index.php$is_args$args;
    }

  ...
}

完成后,保存并关闭文件。

通过输入以下命令检查语法错误来检查你的配置:

  1. sudo nginx -t

如果没有报告错误,请输入以下命令重新加载Nginx:

  1. sudo systemctl reload nginx

准备好你的Web服务器后,现在可以安装WordPress了。

第5步 – 在Web服务器上安装WordPress

为了展示新的支持远程访问的MySQL服务器的功能,您将通过安装和配置WordPress(流行的内容管理系统)来完成此过程。在您的Web服务器上。配置好服务器软件后,您可以下载WordPress。出于安全原因,建议始终直接从项目网站获取WordPress的最新版本。

首先,切换到一个可写的目录(建议使用临时目录,如/tmp):

  1. cd /tmp

这会将您的工作目录更改为临时文件夹。然后,输入以下命令以下载最新版本的WordPress作为压缩文件:

  1. curl -LO https://wordpress.org/latest.tar.gz

解压缩文件以创建WordPress目录结构:

  1. tar xzvf latest.tar.gz

你将很快将这些文件移动到你的文档根目录,但在此之前,复制示例配置文件到WordPress读取的文件名:

  1. cp /tmp/wordpress/wp-config-sample.php /tmp/wordpress/wp-config.php

将整个目录的内容复制到您的文档根目录中。使用-a标志来确保您的权限得到保留,并在源目录的末尾加上一个点,以指示应该复制目录中的所有内容(包括隐藏文件):

  1. sudo cp -a /tmp/wordpress/. /var/www/your_domain

将文件放置到位置后,将所有权分配给www-data用户和组。这是Nginx运行的用户和组,Nginx将需要能够读取和写入WordPress文件,以便为网站提供服务并执行自动更新:

  1. sudo chown -R www-data:www-data /var/www/your_domain

现在,您的WordPress文件已经位于服务器的文档根目录中,并具有正确的所有权。现在,您已经准备好配置WordPress了。

步骤6 — 设置WordPress配置文件

当您打开WordPress配置文件时,您将首先调整一些秘密密钥,以提供一些安全性保护您的安装。WordPress提供了一个安全的生成器来生成这些值,这样您就不必自己想出值。这些值仅在内部使用,因此在这里使用复杂而安全的值不会影响可用性。

要从WordPress秘密密钥生成器中获取安全值,请输入:

  1. curl -s https://api.wordpress.org/secret-key/1.1/salt/

您将收到类似以下输出的唯一值:

警告!重要的是每次都请求您自己的唯一值。不要复制此处显示的值!

Output
define('AUTH_KEY', 'L4|2Yh(giOtMLHg3#] DO NOT COPY THESE VALUES %G00o|te^5YG@)'); define('SECURE_AUTH_KEY', 'DCs-k+MwB90/-E(=!/ DO NOT COPY THESE VALUES +WBzDq:7U[#Wn9'); define('LOGGED_IN_KEY', '*0kP!|VS.K=;#fPMlO DO NOT COPY THESE VALUES +&[%8xF*,18c @'); define('NONCE_KEY', 'fmFPF?UJi&(j-{8=$- DO NOT COPY THESE VALUES CCZ?Q+_~1ZU~;G'); define('AUTH_SALT', '@qA7f}2utTEFNdnbEa DO NOT COPY THESE VALUES t}Vw+8=K%20s=a'); define('SECURE_AUTH_SALT', '%BW6s+d:7K?-`C%zw4 DO NOT COPY THESE VALUES 70U}PO1ejW+7|8'); define('LOGGED_IN_SALT', '-l>F:-dbcWof%4kKmj DO NOT COPY THESE VALUES 8Ypslin3~d|wLD'); define('NONCE_SALT', '4J(<`4&&F (WiK9K#] DO NOT COPY THESE VALUES ^ZikS`es#Fo:V6');

这些是配置行,您可以直接将其粘贴到配置文件中以设置安全密钥。复制您收到的输出。

打开WordPress配置文件:

  1. sudo nano /var/www/your_domain/wp-config.php

找到包含这些设置示例值的部分:

/var/www/your_domain/wp-config.php
. . .
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');
. . .

删除这些行,并粘贴您从命令行中复制的值:

/var/www/your_domain/wp-config.php
. . .
define('AUTH_KEY',         'VALUES COPIED FROM THE COMMAND LINE');
define('SECURE_AUTH_KEY',  'VALUES COPIED FROM THE COMMAND LINE');
define('LOGGED_IN_KEY',    'VALUES COPIED FROM THE COMMAND LINE');
define('NONCE_KEY',        'VALUES COPIED FROM THE COMMAND LINE');
define('AUTH_SALT',        'VALUES COPIED FROM THE COMMAND LINE');
define('SECURE_AUTH_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
define('LOGGED_IN_SALT',   'VALUES COPIED FROM THE COMMAND LINE');
define('NONCE_SALT',       'VALUES COPIED FROM THE COMMAND LINE');
. . .

接下来,在文件开头修改一些数据库连接设置。您需要调整MySQL中配置的数据库名称、数据库用户和相关密码。

输入远程数据库的连接信息。记住要使用之前在远程数据库测试中使用的相同IP地址和凭据:

/var/www/your_domain/wp-config.php
. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'remote_user');

/** MySQL database password */
define('DB_PASSWORD', 'remote_user_password');

/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .

最后,在define( 'DB_COLLATE', '' );行之后,添加这一突出显示的行,告诉WordPress使用SSL连接到您的MySQL数据库:

var/www/your_domain/wp-config.php
...
define( 'DB_COLLATE', '' );

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
...

保存并关闭文件。

配置设置完成后,WordPress已安装并且您可以运行其基于Web的设置例程。

第7步 – 通过Web界面设置WordPress

WordPress具有基于Web的设置流程。在您进行设置时,它将询问一些问题,并在您的数据库中安装所有所需的表格。

导航到与您的Web服务器关联的域名(或公共IP地址),并在其后加上/wp-admin:

http://your_domain.com/wp-admin

您将被提示选择要使用的语言:

接下来,您将来到主设置页面。

为您的WordPress站点选择一个名称并选择一个用户名。建议选择一个唯一的用户名,避免像“admin”这样的常见用户名,以确保安全。系统会自动生成一个强密码。请保存此密码或选择另一个强密码。

输入您的电子邮件地址,并选择是否要阻止搜索引擎索引您的站点:

提交您的信息后,您需要使用刚刚创建的帐户登录WordPress管理界面。然后,您将被带到一个仪表板,您可以在其中自定义您的新WordPress站点。

结论

通过遵循本教程,您已经设置了一个MySQL数据库,可以接受来自远程Wordpress安装的SSL保护连接。本指南中使用的命令和技术适用于任何用任何编程语言编写的Web应用程序,但具体的实施细节会有所不同。有关更多信息,请参阅您的应用程序或语言的数据库文档。

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-remote-database-to-optimize-site-performance-with-mysql-on-ubuntu-20-04