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

介绍

随着应用程序或网站的增长,您可能已经超过了当前的服务器设置,如果您在同一台机器上托管 Web 服务器和数据库后端,则可以将这两个功能分开,以便每个功能都可以在自己的硬件上运行,并共享响应访问者的请求的负担。

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

前提条件

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

步骤 1 – 在数据库服务器上安装 MySQL

将我们的数据存储在一个单独的服务器上是一个很好的方法,当我们达到单机配置的性能上限时,可以优雅地扩展。

要开始,我们将安装MySQL在我们没有安装LEMP堆栈的服务器上。登录这个服务器,然后更新您的包缓存并安装MySQL服务器软件:

1sudo apt-get update
2sudo apt-get install mysql-server

您将被要求在安装过程中为 MySQL 设置并确认一个 root 密码. 选择一个强大的密码并注意到它,因为我们以后会需要它。

MySQL 应该现在安装并运行,让我们使用systemctl来检查:

1systemctl status mysql
1[secondary_label Output]
2 mysql.service - MySQL Community Server
3   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
4   Active: active (running) since Tue 2017-05-23 14:54:04 UTC; 12s ago
5 Main PID: 27179 (mysqld)
6   CGroup: /system.slice/mysql.service
7           └─27179 /usr/sbin/mysqld

活跃:活跃(运行)字段意味着MySQL已安装并运行,现在我们将使安装更安全一些。

1mysql_secure_installation

这会问你我们刚刚设置的MySQL root密码。输入它并按ENTER。现在我们将回答一系列是的或没有提示。

首先,我们被问及 验证密码插件,该插件可以为您的MySQL用户自动执行某些密码强度规则。启用此项是您需要根据您的个人安全需求做出决定。键入yENTER来启用它,或者只需点击ENTER来跳过它。

接下来,您将被问到是否想要更改 root密码. 因为我们刚刚在安装MySQL时创建了密码,我们可以安全地跳过这个。

您将被问及删除匿名MySQL用户、禁用远程 root登录、删除test数据库、重新加载特权表,以确保以前的更改生效。

在所有提示响应后,脚本将退出. 现在我们的MySQL安装是合理的安全。 在下一步,我们将配置MySQL以允许从远程连接访问。

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

现在您已启动和运行数据库,我们需要更改一些配置值,以允许来自其他计算机的连接。

在您的编辑器中打开具有 root 权限的 mysqld 配置文件:

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

这个文件被划分成部分,用字符串中的单词([和 ])表示。 查找标记为 `mysqld'的部分:

1[label mysqld.cnf]
2. . .
3[mysqld]

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

目前,MySQL已配置为只搜索本地连接,我们需要更改以引用您的服务器可以访问的 external IP 地址。

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

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

由于我们将通过互联网连接到数据库,我们将需要加密连接来保护我们的数据。如果您不加密您的MySQL连接,网络上的任何人都可以在您的Web和数据库服务器之间扫描敏感信息。

1[label /etc/mysql/my.cnf]
2. . .
3require_secure_transport = on

保存并关闭文件,当你完成。

要使SSL连接工作,我们需要创建一些密钥和证书。MySQL配有一个命令,自动设置我们需要的一切:

1sudo mysql_ssl_rsa_setup --uid=mysql

这将创建必要的文件,并使它们能够被MySQL服务器(--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

接下来,我们将设置用户和数据库,我们需要远程访问服务器。

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

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

开始使用MySQL root帐户连接到MySQL:

1mysql -u root -p

您将被要求提供您的MySQL root密码,然后您将收到新的mysql>提示。

现在我们可以创建WordPress将使用的数据库,我们只会称之为WordPress,以便我们稍后可以轻松识别它:

1CREATE DATABASE wordpress;

<$>[注] **注:**所有 SQL 语句都必须以半图(;)结束。如果您在 MySQL 命令中按ENTER,并且只看到带有->提示的新行,您可能忘记了半图。

现在我们有一个数据库,我们需要创建我们的用户。创建我们的用户的一个转折点是,我们需要根据用户连接的位置来定义两个不同的配置文件。

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

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

让我们继续,并允许这个帐户完全访问我们的数据库:

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

这个用户现在可以在WordPress的数据库上执行任何操作,但这个帐户不能远程使用,因为它只匹配来自本地机器的连接。

现在创建一个伴侣帐户,将完全匹配我们的网页服务器的连接. 为此,您需要您的网页服务器的IP地址. 我们可以将这个帐户命名为任何东西,但为了获得更一致的体验,我们将使用相同的用户名,如上所述,只修改了主机部分。

请记住,您必须使用使用您在mysqld.cnf文件中配置的相同网络的IP地址,这意味着如果您使用了私人网络IP,您将想要创建下面的规则来使用您的Web服务器的私人IP。

1CREATE USER 'wordpressuser'@'web-server_ip' IDENTIFIED BY 'password';

现在我们有我们的远程帐户,我们可以赋予它与本地用户相同的特权:

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

扫描权限,将其写入磁盘并开始使用它们:

1FLUSH PRIVILEGES;

然后输出 MySQL 提示,键入:

1exit

现在我们已经设置了一个新的数据库和远程启用用户,让我们测试数据库和连接。

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

在我们继续之前,最好检查您是否可以使用 wordpressuser帐户连接到您的数据库,无论是从本地机器还是从您的 Web 服务器。

首先,通过尝试使用我们的新帐户登录,测试您的数据库机器的本地连接:

1mysql -u wordpressuser -p

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

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

1exit

登录您的 Web 服务器以测试远程连接。

在您的 Web 服务器上,您需要安装一些 MySQL 客户端工具才能访问远程数据库. 更新本地包缓存,然后安装客户端工具:

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

现在,我们可以使用以下语法连接到我们的数据库服务器:

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

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

您将被要求为您的 wordpressuser帐户提供密码,如果一切顺利,您将收到MySQL提示,我们可以通过以下命令验证连接是否使用SSL:

1[environment second]
2status
 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--------------

SSL: 行将显示是否使用 SSL 加密器. 您现在可以继续并退出提示,因为您已经验证可以远程连接:

1[environment second]
2exit

为了进行额外的检查,您可以尝试从第三方服务器做同样的事情,以确保该其他服务器是 not 授予的访问. 您已经验证了本地访问和访问来自 Web 服务器,但您没有验证其他连接将被拒绝。

继续在服务器上尝试相同的程序,您没有配置特定的用户帐户,您可能需要像上面一样安装客户端工具:

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

这是我们期望的,也是我们想要的。

我们已经成功测试了我们的远程连接,现在可以继续我们的WordPress安装。

第5步:安装WordPress

为了展示我们新的远程可用MySQL服务器的功能,我们将在我们的Web服务器上安装和配置WordPress - 流行的博客平台 - 这将要求我们下载和提取软件,配置我们的连接信息,然后运行WordPress的基于Web的安装。

在您的网页服务器上,下载最新版本的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',         '1jl/vqfs<XhdXoAPz9 DO NOT COPY THESE VALUES c_j{iwqD^<+c9.k<J@4H');
 4define('SECURE_AUTH_KEY',  'E2N-h2]Dcvp+aS/p7X DO NOT COPY THESE VALUES {Ka(f;rv?Pxf})CgLi-3');
 5define('LOGGED_IN_KEY',    'W(50,{W^,OPB%PB<JF DO NOT COPY THESE VALUES 2;y&,2m%3]R6DUth[;88');
 6define('NONCE_KEY',        'll,4UC)7ua+8<!4VM+ DO NOT COPY THESE VALUES #`DXF+[$atzM7 o^-C7g');
 7define('AUTH_SALT',        'koMrurzOA+|L_lG}kf DO NOT COPY THESE VALUES 07VC*Lj*lD&?3w!BT#-');
 8define('SECURE_AUTH_SALT', 'p32*p,]z%LZ+pAu:VY DO NOT COPY THESE VALUES C-?y+K0DK_+F|0h{!_xY');
 9define('LOGGED_IN_SALT',   'i^/G2W7!-1H2OQ+t$3 DO NOT COPY THESE VALUES t6**bRVFSD[Hi])-qS`|');
10define('NONCE_SALT',       'Q6]U:K?j4L%Z]}h^q7 DO NOT COPY THESE VALUES 1% ^qUswWgn+6&xqHN&%');

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

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

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

 1[label 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 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', 'wordpressuser');
 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 wp-config.php]
2[environment second]
3define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

保存并关闭文件。

接下来,我们需要将在我们的~/wordpress目录中找到的文件和目录复制到 Nginx 的文档根。

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

现在我们所有的文件都在位置上. 剩下的唯一事情是修改文件所有权. 我们将设置文档根中的所有文件由我们的Web服务器用户拥有,‘www-data’:

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

WordPress现在应该安装,并准备通过其基于Web的设置流程运行,我们将在下一步中做到这一点。

步骤6 - 通过Web界面设置Wordpress

WordPress有一个基于Web的设置流程,它会问几个问题,并在我们的数据库中安装所需的表。

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

1http://example.com

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

WordPress install screen

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

结论

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

Published At
Categories with 技术
comments powered by Disqus