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

介绍

如果您在同一台计算机上托管 Web 服务器和数据库后端,可能是一个好主意,将这两个功能分开,以便每个功能都可以在自己的硬件上运行,并共享响应访问者的请求的负担。

在本指南中,我们将讨论如何配置您的Web应用程序可以连接的远程MySQL数据库服务器,我们将使用WordPress作为一个例子,以便有工作,但该技术广泛适用于任何由MySQL支持的应用程序。

前提条件

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

  • 两个Ubuntu 18.04服务器。 每个用户都应该有一个具有sudo权限的非root用户,并启用了UFW防火墙,这在我们与Ubuntu 18.04的初始服务器设置教程中有所描述. 其中一台服务器将托管您的 MySQL 后端, 在本指南中我们将称之为 ** 数据库服务器 ** 。 另一个将远程连接到您的数据库服务器,并充当您的网络服务器;同样,在本指南过程中,我们将称之为web服务器
  • Nginx 和 PHP 安装在您的网络服务器上 **. 我们的教程 [如何安装 Linux, Nginx, MySQL, PHP (LEMP stack) 在 Ubuntu 18. 04 (https://andsky.com/tech/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-ubuntu-18-04) 中引导您完成此进程, 但请注意您应该跳过此教程的第 2 步, 该步侧重于安装 MySQL, 您将在您的数据库服务器上安装 MySQL 。
  • MySQL 安装在您的数据库服务器上**. 跟着[如何在Ubuntu 18.04上安装 MySQL (https://andsky.com/tech/tutorials/how-to-install-mysql-on-ubuntu-18-04)来设置此功能.
  • 可选( 但强烈推荐), 来自 Let's 的 TLS/ SSL 证书安装在您的网络服务器上 ** 。 您需要购买一个域名, 并为您的服务器设置 [DNS记录] (https://www.digitalocean.com/docs/networking/dns/), 但证书本身是免费的 。 我们的指南如何用Ubuntu 18.04加密方式保护Nginx(https://andsky.com/tech/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04)将教你如何获得这些证书。 (英语)

步骤 1 — 配置MySQL以倾听远程连接

将数据存储在一个单独的服务器上是一个很好的方法,在击中一台机器配置的性能上限后,可以优雅地扩展。 它还提供了必要的基础结构,以便在以后进一步扩展您的基础设施。

大多数MySQL服务器的配置更改都可以在mysqld.cnf文件中进行,该文件默认情况下存储在/etc/mysql/mysql.conf.d/目录中。

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

这个文件被划分成部分,标记为方块([])。 查找标记为 `mysqld 的部分:

1[label /etc/mysql/mysql.conf.d/mysqld.cnf]
2. . .
3[mysqld]
4. . .

在本节中,寻找一个称为bind-address的参数,这会告诉数据库软件哪个网络地址要听取连接。

默认情况下,此设置为127.0.0.1,这意味着MySQL配置为只搜索本地连接,您需要更改此设置以引用可访问您的服务器的外部 IP 地址。

如果您的两个服务器都位于具有私有网络功能的数据中心,请使用数据库服务器的私有网络 IP。

1[label /etc/mysql/mysql.conf.d/mysqld.cnf]
2[mysqld]
3. . .
4bind-address = db_server_ip

由于您将通过互联网连接到您的数据库,因此建议您需要加密连接以保持数据安全. 如果您没有加密您的MySQL连接,网络上的任何人都可以在您的Web和数据库服务器之间(https://en.wikipedia.org/wiki/Sniffing_attack)扫描敏感信息。

1[label /etc/mysql/mysql.conf.d/mysqld.cnf]
2[mysqld]
3. . .
4require_secure_transport = on
5. . .

如果您正在使用nano,请按CTRL+X,Y,然后按ENTER

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

1sudo mysql_ssl_rsa_setup --uid=mysql

要强迫MySQL更新其配置并阅读新的SSL信息,请重新启动数据库:

1sudo systemctl restart mysql

要确认服务器现在在外部接口上收听,请运行以下命令netstat:

1sudo netstat -plunt | grep mysqld
1[secondary_label Output]
2tcp 0 0 db_server_ip:3306 0.0.0.0:*               LISTEN 27328/mysqld

netstat打印了有关您的服务器网络系统的统计数据,该输出向我们展示了一个名为mysqld的流程附加到db_server_ip的端口3306,这是标准的MySQL端口,确认服务器正在听取相应的界面。

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

1sudo ufw allow mysql

这些都是你需要对MySQL进行的配置更改,接下来,我们将讨论如何设置数据库和一些用户配置文件,其中之一将用于远程访问服务器。

步骤 2 — 设置一个WordPress数据库和远程凭证

尽管MySQL本身现在正在听取外部IP地址,但目前没有远程启用的用户或数据库配置,让我们为WordPress创建一个数据库,以及一对可以访问的用户。

首先,您将以 root MySQL 用户的身份连接到 MySQL:

1sudo mysql

<$>[注] 注: 如果您已启用密码身份验证,如在 先决条件MySQL教程的步骤 3中所述,则需要使用以下命令访问MySQL壳:

1mysql -u root -p

运行此命令后,您将被要求提供您的MySQL root密码,输入后,您将收到新的mysql>提示。

从MySQL提示,创建一个WordPress将使用的数据库. 给这个数据库一个可识别的名称可能是有帮助的,这样你可以很容易地识别它以后。

1CREATE DATABASE wordpress;

现在你已经创建了数据库,接下来你需要创建一对用户,我们将创建一个仅局部的用户,以及一个与网络服务器的IP地址相关的远程用户。

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

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

然后给这个帐户完全访问WordPress数据库:

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

这个用户现在可以在WordPress的数据库上进行任何操作,但这个帐户不能远程使用,因为它只匹配来自本地机器的连接。 考虑到这一点,创建一个伴侣帐户,将仅匹配来自您的Web服务器的连接。

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

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

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

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

最后,清除特权,以便MySQL知道如何开始使用它们:

1FLUSH PRIVILEGES;

然后输出 MySQL 提示,键入:

1exit

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

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

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

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

1mysql -u wpuser -p

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

如果您收到 MySQL 提示,则本地连接成功,您可以通过键入再次退出:

1exit

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

1[environment local]
2ssh sammy@web_server_ip

您需要在您的 Web 服务器上安装一些 MySQL 客户端工具,以便访问远程数据库。

1[environment second]
2sudo apt update

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

1[environment second]
2sudo apt install mysql-client

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

1[environment second]
2mysql -u remotewpuser -h db_server_ip -p

再次,您必须确保您正在使用数据库服务器的正确 IP 地址. 如果您已配置 MySQL 来在私有网络上收听,请输入数据库的私有网络 IP。

您将被要求为您的 remotewpuser帐户提供密码。输入后,如果一切按预期工作,您将看到MySQL提示。

1[environment second]
2status

如果连接确实使用SSL,则SSL:行将表示这一点,如下所示:

 1[secondary_label Output]
 2[environment second]
 3--------------
 4mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper
 5
 6Connection id:		52
 7Current database:
 8Current user:		[email protected]
 9SSL:			Cipher in use is DHE-RSA-AES256-SHA
10Current pager:		stdout
11Using outfile:		''
12Using delimiter:	;
13Server version:		5.7.18-0ubuntu0.16.04.1 (Ubuntu)
14Protocol version:	10
15Connection:		203.0.113.111 via TCP/IP
16Server characterset:	latin1
17Db characterset:	latin1
18Client characterset:	utf8
19Conn. characterset:	utf8
20TCP port:		3306
21Uptime:			3 hours 43 min 40 sec
22
23Threads: 1 Questions: 1858 Slow queries: 0 Opens: 276 Flush tables: 1 Open tables: 184 Queries per second avg: 0.138
24--------------

验证您可以远程连接后,继续并退出提示:

1[environment second]
2exit

通过此,您已经验证了来自 Web 服务器的本地访问和访问,但尚未验证其他连接将被拒绝. 对于额外的检查,请尝试从第三方服务器中做同样的事情,为此您已 not 配置特定的用户帐户,以确保该其他服务器是 not 授予访问。

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

1[environment third]
2mysql -u wordpressuser -h db_server_ip -p

这不应该成功完成,并且应该抛弃一个类似于此的错误:

1[secondary_label Output]
2[environment third]
3ERROR 1130 (HY000): Host '203.0.113.12' is not allowed to connect to this MySQL server

这是预期的,因为你没有创建一个允许从这个服务器连接的MySQL用户,而且也希望,因为你想确保你的数据库服务器会阻止未经授权的用户访问你的MySQL服务器。

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

第4步:安装WordPress

为了展示您新的远程可用MySQL服务器的功能,我们将通过在您的Web服务器上安装和配置WordPress(流行的内容管理系统)。

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

1[environment second]
2cd ~
3curl -O https://wordpress.org/latest.tar.gz

提取文件,在您的主目录中将创建一个名为wordpress的目录:

1[environment second]
2tar xzvf latest.tar.gz

WordPress 包含一个样本配置文件,我们将使用作为起点. 创建此文件的副本,从文件名中删除样本,以便由 WordPress 加载:

1[environment second]
2cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php

当你打开文件时,你的第一个业务命令将是调整一些秘密密密钥,以便为你的安装提供更多的安全性。WordPress为这些值提供一个安全的生成器,所以你不必自己尝试提出好的价值观。

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

1[environment second]
2curl -s https://api.wordpress.org/secret-key/1.1/salt/

这将打印一些键到你的输出. 你会添加这些到你的 wp-config.php 文件暂时:

<$>[警告] 警告! 重要的是每次请求自己的独特值。

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

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

1[environment second]
2nano ~/wordpress/wp-config.php

查找包含这些设置的 dummy 值的部分,它将看起来像这样:

 1[label /wordpress/wp-config.php]
 2[environment second]
 3. . .
 4define('AUTH_KEY',         'put your unique phrase here');
 5define('SECURE_AUTH_KEY',  'put your unique phrase here');
 6define('LOGGED_IN_KEY',    'put your unique phrase here');
 7define('NONCE_KEY',        'put your unique phrase here');
 8define('AUTH_SALT',        'put your unique phrase here');
 9define('SECURE_AUTH_SALT', 'put your unique phrase here');
10define('LOGGED_IN_SALT',   'put your unique phrase here');
11define('NONCE_SALT',       'put your unique phrase here');
12. . .

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

接下来,输入您的远程数据库的连接信息。这些配置行位于文件的顶部,就在您粘贴密钥的地方。

 1[label /wordpress/wp-config.php]
 2[environment second]
 3. . .
 4/** The name of the database for WordPress */
 5define('DB_NAME', 'wordpress');
 6
 7/** MySQL database username */
 8define('DB_USER', 'remotewpuser');
 9
10/** MySQL database password */
11define('DB_PASSWORD', 'password');
12
13/** MySQL hostname */
14define('DB_HOST', 'db_server_ip');
15. . .

最后,在文件中的任何地方,添加以下行,告诉WordPress将SSL连接到我们的MySQL数据库:

1[label /wordpress/wp-config.php]
2[environment second]
3define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

保存并关闭文件。

接下来,将您在您的~/wordpress目录中找到的文件和目录复制到 Nginx 的文档根. 请注意,此命令包括-a旗,以确保所有现有权限都被传输:

1[environment second]
2sudo cp -a ~/wordpress/* /var/www/html

在此之后,唯一剩下的事情是修改文件所有权. 将文档根中的所有文件的所有权更改为 www-data,Ubuntu的默认网页服务器用户:

1[environment second]
2sudo chown -R www-data:www-data /var/www/html

有了它,WordPress已安装,您已经准备好运行其基于Web的设置流程。

步骤5:通过Web界面设置Wordpress

WordPress有一个基于Web的设置过程. 当您通过它时,它会问几个问题并在您的数据库中安装所有所需的表格. 在这里,我们将讨论设置WordPress的最初步骤,您可以将其用作创建使用远程数据库后端的自定义网站的起点。

导航到与您的 Web 服务器相关的域名(或公共 IP 地址):

1http://example.com

您将看到WordPress安装程序的语言选择屏幕,选择适当的语言,然后点击主安装屏幕:

WordPress install screen

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

结论

通过遵循本教程,您已经设置了一个MySQL数据库,以接受远程Wordpress安装的SSL保护连接。本指南中使用的命令和技术适用于任何编写在任何编程语言的Web应用程序,但具体的实施细节将有所不同。

Published At
Categories with 技术
comments powered by Disqus