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

0 股票
0
0
0
0

介绍

随着您的应用程序或网站不断发展壮大,当前的服务器配置可能已经无法满足需求。如果您将 Web 服务器和数据库托管在同一台机器上,那么最好将这两个功能分离,使它们各自运行在独立的硬件上,从而分担响应访客请求的负载。.

本指南将介绍如何配置远程 MySQL 数据库服务器,以便您的 Web 应用程序可以连接到该服务器。我们将以 WordPress 为例进行演示,但此方法广泛适用于任何受 MySQL 支持的应用程序。.

先决条件
  • 两台 Ubuntu 18.04 服务器。如“Ubuntu 18.04 服务器初始设置”教程中所述,每台服务器都应有一个具有 sudo 权限的非 root 用户,并且启用 UFW 防火墙。其中一台服务器将托管您的 MySQL 后端,在本指南中我们将其称为数据库服务器。另一台服务器将远程连接到您的数据库服务器,并充当您的 Web 服务器。同样,在本指南中我们将其称为 Web 服务器。.
  • 您的 Web 服务器上已安装 Nginx 和 PHP。我们的教程将指导您如何在 Ubuntu 18.04 上安装 Linux、Nginx、MySQL 和 PHP(LEMP 架构),但请注意,您应该跳过本教程的第二步(该步骤主要介绍 MySQL 的安装),因为您将在数据库服务器上安装 MySQL。
  • MySQL 已安装在您的数据库服务器上。请按照我们的 Ubuntu 18.04 MySQL 安装指南进行设置。.
  • (强烈建议)您可以在 Web 服务器上安装 Let's Encrypt 的 TLS/SSL 证书。您需要购买域名并设置服务器的 DNS 记录,但证书本身是免费的。我们的指南《如何在 Ubuntu 18.04 上使用 Let's Encrypt 保护 Nginx》将向您展示如何获取这些证书。.

步骤 1 – 配置 MySQL 监听远程连接

当单机配置达到性能极限时,将数据存储在单独的服务器上是实现平滑扩展的有效方法。它还能为后续的负载均衡和基础架构扩展提供必要的架构基础。按照预备教程安装 MySQL 后,您需要修改一些配置值以允许其他计算机连接。.

大多数 MySQL 服务器配置更改都可以在 mysqld.cnf 文件中进行,该文件默认存储在 /etc/mysql/mysql.conf.d/ 目录中。在数据库服务器上,使用 root 权限通过您喜欢的编辑器打开此文件。这里我们将使用 nano 编辑器:

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

该文件分为多个部分,各部分用方括号 ([ 和 ]) 标记。找到名为 mysqld 的部分:

. . .
[mysqld]
. . .

在本节中,查找名为 bind-address 的参数。该参数告诉数据库软件要监听哪个网络地址以接收连接。.

默认情况下,此值设置为 127.0.0.1,这意味着 MySQL 配置为仅查找本地连接。您需要将其更改为指向可访问服务器的外部 IP 地址。.

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

[mysqld]
. . .
bind-address = db_server_ip

由于您将通过互联网连接到数据库,因此建议您使用加密连接来保护数据安全。如果您不对 MySQL 连接进行加密,网络上的任何人都可以拦截您的 Web 服务器和数据库服务器之间的敏感信息。要加密 MySQL 连接,请在您更新的 bind-address 行之后添加以下行:

[mysqld]
. . .
require_secure_transport = on
. . .

完成后,保存并关闭文件。如果您使用的是 nano 编辑器,请按 CTRL+X,Y,然后按 ENTER 键。.

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

sudo mysql_ssl_rsa_setup --uid=mysql

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

sudo systemctl restart mysql

要验证服务器现在是否正在监听外部接口,请运行以下 netstat 命令:

sudo netstat -plunt | grep mysqld
Output
tcp 0 0 db_server_ip:3306 0.0.0.0:* LISTEN 27328/mysqld

netstat 命令会打印服务器网络系统的统计信息。此输出显示名为 mysqld 的进程已连接到 db_server_ip 的 3306 端口(MySQL 的标准端口),并确认服务器正在监听正确的接口。.

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

sudo ufw allow mysql

以上就是您需要在 MySQL 中进行的所有配置更改。接下来,我们将介绍如何设置数据库和一些用户配置文件,其中一个配置文件将用于远程访问服务器。.

步骤 2 – 设置 WordPress 数据库和远程凭据

尽管 MySQL 当前正在监听外部 IP 地址,但尚未配置任何远程用户或数据库。让我们创建一个 WordPress 数据库,并添加几个可以访问该数据库的用户。.

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

sudo mysql

在 MySQL 命令提示符下,创建一个 WordPress 将使用的数据库。给这个数据库起一个容易识别的名称,以便日后轻松识别,会很有帮助。这里我们将其命名为 WordPress:

CREATE DATABASE wordpress;

数据库创建完成后,下一步是创建一对用户。我们将创建一个仅限本地访问的用户,以及一个与 Web 服务器 IP 地址关联的远程用户。.

首先,创建本地用户 wpuser,并将此帐户仅用于本地连接尝试,在声明中使用 localhost:

CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password';

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

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

该用户现在可以对 WordPress 数据库执行任何操作,但此帐户无法远程使用,因为它仅匹配来自本地计算机的连接。因此,请创建一个辅助帐户,该帐户仅匹配来自您的 Web 服务器的连接。为此,您需要 Web 服务器的 IP 地址。.

请注意,您必须使用与 mysqld.cnf 文件中配置的网络相同的 IP 地址。这意味着,如果您在 mysqld.cnf 文件中指定了私有网络 IP 地址,则必须在以下两条命令中输入 Web 服务器的私有 IP 地址。如果您将 MySQL 配置为使用公共互联网,则必须将其与 Web 服务器的公共 IP 地址匹配。.

CREATE USER 'remotewpuser'@'web_server_ip' IDENTIFIED BY 'password';

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

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

最后,清除权限,以便 MySQL 可以开始使用这些权限:

FLUSH PRIVILEGES;

然后输入以下命令退出 MySQL 命令:

exit

现在您已经设置了一个新的数据库和一个活跃的远程用户,您可以测试是否可以从您的 Web 服务器连接到该数据库。.

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

在继续操作之前,最好检查一下您是否可以从本地计算机(数据库服务器)和 Web 服务器连接到数据库。.

首先,请尝试登录您的新帐户,测试数据库服务器的本地连接:

mysql -u wpuser -p

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

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

exit

然后登录到您的 Web 服务器以测试远程连接:

ssh sammy@web_server_ip

要访问远程数据库,您需要在 Web 服务器上安装一些 MySQL 客户端工具。首先,如果您最近没有更新过本地软件包缓存,请先更新:

sudo apt update

然后安装 MySQL 客户端工具:

sudo apt install mysql-client

之后,使用以下命令连接到数据库服务器:

mysql -u remotewpuser -h db_server_ip -p

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

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

status

如果连接实际使用的是 SSL,则 SSL: 行会指示这一点,如下所示:

Output
--------------
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper
Connection id: 52
Current database:
Current user: [email protected]
SSL: Cipher in use is DHE-RSA-AES256-SHA
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.18-0ubuntu0.16.04.1 (Ubuntu)
Protocol version: 10
Connection: 203.0.113.111 via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 3 hours 43 min 40 sec
Threads: 1 Questions: 1858 Slow queries: 0 Opens: 276 Flush tables: 1 Open tables: 184 Queries per second avg: 0.138
--------------

确认可以远程连接后,即可退出命令:

exit

至此,您已验证了本地访问和来自 Web 服务器的访问,但尚未验证其他连接是否被拒绝。为了进一步验证,请从第三台未配置特定用户帐户的服务器上执行相同的操作,以确保该服务器未被授予访问权限。.

请注意,您可能需要像上面那样安装 MySQL 客户端应用程序,然后才能运行以下命令尝试连接:

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 服务器。.

远程连接测试成功后,即可在您的网络服务器上安装 WordPress。.

第四步 – 安装 WordPress

为了演示您的新 MySQL 服务器的远程控制功能,我们将引导您完成在 Web 服务器上安装和配置 WordPress(这款流行的内容管理系统)的步骤。为此,您需要下载并解压软件,配置连接信息,然后通过 WordPress 的 Web 安装程序运行它。.

在您的网络服务器上,将最新版本的 WordPress 下载到根目录:

cd ~
curl -O https://wordpress.org/latest.tar.gz

解压缩文件,这将在您的根目录中创建一个名为 wordpress 的目录:

tar xzvf latest.tar.gz

WordPress 包含一个示例配置文件,我们将以此为起点。复制此文件,并从文件名中删除“sample-”,以便 WordPress 可以加载它:

cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php

打开文件后,首先需要设置一些密钥以提高安装安全性。WordPress 提供了一个安全的密钥生成器,因此您无需自行创建安全密钥。这些密钥仅供内部使用,所以设置复杂且安全的密钥不会影响用户体验。.

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

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

这将在输出中打印出一些键值。您可以立即将这些键值添加到 wp-config.php 文件中:

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');

将收到的输出复制到剪贴板,然后在文本编辑器中打开配置文件:

nano ~/wordpress/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');
. . .

删除这些行,然后粘贴您从命令行复制的值。.

接下来,输入远程数据库的连接信息。这些配置行位于文件顶部,就在您粘贴密钥的上方。请记住使用与之前远程数据库测试中使用的相同的 IP 地址:

. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'remotewpuser');
/** MySQL database password */
define('DB_PASSWORD', 'password');
/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .

最后,在文件的任意位置添加以下代码行,告诉 WordPress 使用 SSL 连接到我们的 MySQL 数据库:

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

保存并关闭文件。.

接下来,将 ~/wordpress 目录中的文件和目录复制到 Nginx 文档根目录。请注意,此命令包含 -a 标志,以确保所有现有权限都被转移:

sudo cp -a ~/wordpress/* /var/www/html

之后,您只需更改文件所有权。将文档根目录中所有文件的所有权更改为 www-data,即 Ubuntu 的默认 Web 服务器用户:

sudo chown -R www-data:www-data /var/www/html

至此,WordPress 已安装完毕,您可以按照基于 Web 的设置程序进行操作。.

步骤 5 – 通过 Web 界面设置 WordPress

WordPress 的安装过程基于网页。安装过程中,它会询问一些问题,并在您的数据库中安装所需的所有表。本文将引导您完成 WordPress 的基本安装步骤,您可以以此为起点,构建使用远程数据库的自定义网站。.

请访问与您的 Web 服务器关联的域名(或公共 IP 地址):

http://example.com

您会看到 WordPress 安装程序的语言选择页面。选择相应的语言,然后点击主安装页面:

提交信息后,您需要使用创建的帐户登录 WordPress 管理界面。登录后,您将进入控制面板,在那里您可以自定义您的新 WordPress 网站。.

结果

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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

您可能也喜欢