6

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由苏子晨 发表于云+社区专栏

介绍

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

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

准备

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

  • 两个Ubuntu 16.04服务器,启用了具有sudo权限的非root 用户,并启用了UFW防火墙。
  • 在其中一台服务器上,您需要安装LEMP(Linux,Nginx,MySQL,PHP)。我们将在本教程中安装MySQL。
  • (可选)(但强烈建议),您可以使用SSL证书保护LEMP Web服务器。您需要一个域名,但证书是免费的。如果你没有域名,建议您先去这里注册一个域名

第一步 - 在数据库服务器上安装MySQL

在我们触顶单机配置的性能上限时,将数据存储在单独的服务器上可以从容地解决这个问题。它还提供了负载平衡所需的基本结构,并在以后更多地扩展我们的基础设施。

首先,我们将在安装LEMP堆栈的服务器上安装MySQL。登录到此服务器,然后更新包缓存并安装MySQL服务器软件:

$ sudo apt-get update
$ sudo apt-get install mysql-server

在安装过程中,系统会要求您设置并确认MySQL的root密码。选择一个强密码并记下它,因为我们稍后会需要它。

MySQL应该立即安装并运行。让我们使用systemctl来检查:

$ systemctl status mysql
● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2017-05-23 14:54:04 UTC; 12s ago
 Main PID: 27179 (mysqld)
   CGroup: /system.slice/mysql.service
           └─27179 /usr/sbin/mysqld

(running)行意味着MySQL已安装并正在运行。现在我们将使安装更加安全。MySQL附带一个脚本,可引导您锁定系统:

$ mysql_secure_installation

这将询问您刚刚设置的MySQLroot密码。输入并按ENTER。现在我们将回答一系列是或否提示。让我们来看看:

首先,我们被问及验证密码插件,这是一个可以自动为MySQL用户强制执行某些密码强度规则的插件。启用此功能是您需要根据个人安全需求做出的决定。输入y并按ENTER启用它,或只是点击ENTER跳过它。如果启用,系统还会提示您从0-2中选择一个级别,以确定密码验证的严格程度。选择一个数字并点击ENTER继续。

接下来,系统会询问您是否要更改root密码。由于我们在安装MySQL时刚刚创建了密码,因此我们可以安全地跳过这个。点击ENTER继续,不更新密码。

其余提示可以回答。系统将询问您是否删除匿名MySQL用户,禁止远程root登录,删除测试数据库以及重新加载权限表以确保先前的更改正常生效。这些都是个好主意。输入y并按ENTER。

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

第二步 - 配置MySQL以侦听远程连接

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

在编辑器中以root权限打开mysqld配置文件:

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

此文件分为括号(和)中的单词表示的部分。找到标记为mysqld的部分:

mysqld.cnf
. . .
[mysqld]

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

目前,MySQL配置为仅查找本地连接。我们需要更改它以引用可以访问服务器的外部IP地址。

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

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

由于我们将通过互联网连接到数据库,因此我们将要求加密连接以确保我们的数据安全。如果您不加密MySQL连接,网络上的任何人都可能在您的Web和数据库服务器之间嗅探敏感信息。在刚刚更新的bind-address行之后添加以下行:

/etc/mysql/my.cnf
. . .
require_secure_transport = on

完成后保存并关闭文件。

要使SSL连接起作用,我们需要创建一些密钥和证书。MySQL附带一个命令,可以自动设置我们需要的所有内容:

$ sudo mysql_ssl_rsa_setup --uid=mysql

这将创建必要的文件并使它们可由MySQL服务器(--uid=mysql)读取。

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

$ sudo systemctl restart mysql

要确认服务器正在侦听外部接口,请用netstat检查:

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

netstat打印有关我们服务器网络系统的统计信息。此输出向我们显示名为mysqld的进程在端口3306(标准MySQL端口)上附加到db_server_ip

现在打开防火墙上的端口以允许流量通过:

$ sudo ufw allow mysql

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

第三步 - 设置WordPress数据库和远程凭据

即使MySQL本身正在侦听外部IP地址,但目前还没有配置启用远程的用户或数据库。让我们为WordPress和可以访问它的用户创建一个数据库。

首先使用MySQL root帐户连接到MySQL :

$ mysql -u root -p

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

现在我们可以创建WordPress将使用的数据库。我们将调用此wordpress,以便我们以后可以轻松识别它:

mysql> CREATE DATABASE wordpress;
注意:所有SQL语句必须以分号(;)结尾。如果在MySQL命令中按Enter键并且只看到带有 ->提示符的新行,则可能忘记了分号。只需在新行上键入它,然后再次按ENTER继续。

现在我们有了一个数据库,我们需要创建我们的用户。创建用户的一个方面是我们需要根据用户连接的位置定义两个不同的配置文件。我们将创建一个仅限本地的用户,以及与我们的Web服务器的IP地址绑定的远程用户。

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

mysql> CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'password';

让我们继续并授予此帐户对我们数据库的完全访问权限:

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

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

现在创建一个配对帐户,该帐户将匹配来自我们的Web服务器的连接。为此,您需要Web服务器的IP地址。我们可以将此帐户命名为任何内容,但为了获得更一致的体验,我们将使用与上面完全相同的用户名,仅修改主机部分。

请记住,您必须使用与您在mysqld.cnf文件中配置的网络相同的IP地址。这意味着如果您使用专用网络IP,则需要创建以下规则以使用Web服务器的专用IP。如果您将MySQL配置为使用公共网路,则应将其与Web服务器的公共IP地址进行匹配。

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

现在我们有了远程帐户,我们可以为它提供与本地用户相同的权限:

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

刷新权限以将其写入磁盘并开始使用它们:

mysql> FLUSH PRIVILEGES;

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

mysql> exit

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

第四步 - 测试远程和本地连接

在继续之前,最好验证您是否可以使用wordpressuser帐户从本地计算机和Web服务器连接到数据库。

首先,尝试使用我们的新帐户登录,从数据库计算机测试本地连接:

mysql -u wordpressuser -p

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

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

mysql> exit

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

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

$ sudo apt-get update
$ sudo apt-get install mysql-client

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

$ mysql -u wordpressuser -h db_server_ip -p

同样,您必须确保使用正确的数据库服务器IP地址。如果您将MySQL配置为在专用网络上侦听,请输入数据库的专用网络IP,否则请输入数据库服务器的公共IP地址。

系统会要求您输入wordpressuser帐户的密码,如果一切顺利,您将收到MySQL提示。我们可以使用以下命令验证连接是否正在使用SSL:

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using  EditLine wrapper

Connection id:      52
Current database:
Current user:       wordpressuser@203.0.113.111
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
--------------

SSL:行将指示是否正在使用SSL密码。您现在可以继续退出提示,因为您已经确认可以远程连接:

mysql> exit

对于其他检查,您可以尝试从第三台服务器执行相同的操作,以确保未授予其他服务器访问权限。您已验证本地访问和从Web服务器访问,但您尚未验证其他连接将被拒绝。

继续在未配置特定用户帐户的服务器上尝试相同的过程。您可能必须像上面那样安装客户端实用程序:

$ mysql -u wordpressuser -h db_server_ip -p

这应该不会成功完成。它应该抛出一个看起来像这样的错误:

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

这就是我们所期望的和我们想要的。

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

第五步 - 安装WordPress

为了演示我们新的具有远程功能的MySQL服务器的功能,我们将在我们的Web服务器上安装和配置WordPress(流行的博客平台)。这将要求我们下载并解压缩软件,配置我们的连接信息,然后运行WordPress的基于Web的安装。

在您的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文件中的配置。

警告! 每次请求唯一值非常重要。不要复制下面显示的值!
define('AUTH_KEY',         '1jl/vqfs<XhdXoAPz9 DO NOT COPY THESE VALUES c_j{iwqD^<+c9.k<J@4H');
define('SECURE_AUTH_KEY',  'E2N-h2]Dcvp+aS/p7X DO NOT COPY THESE VALUES {Ka(f;rv?Pxf})CgLi-3');
define('LOGGED_IN_KEY',    'W(50,{W^,OPB%PB<JF DO NOT COPY THESE VALUES 2;y&,2m%3]R6DUth[;88');
define('NONCE_KEY',        'll,4UC)7ua+8<!4VM+ DO NOT COPY THESE VALUES #`DXF+[$atzM7 o^-C7g');
define('AUTH_SALT',        'koMrurzOA+|L_lG}kf DO NOT COPY THESE VALUES  07VC*Lj*lD&?3w!BT#-');
define('SECURE_AUTH_SALT', 'p32*p,]z%LZ+pAu:VY DO NOT COPY THESE VALUES C-?y+K0DK_+F|0h{!_xY');
define('LOGGED_IN_SALT',   'i^/G2W7!-1H2OQ+t$3 DO NOT COPY THESE VALUES t6**bRVFSD[Hi])-qS`|');
define('NONCE_SALT',       'Q6]U:K?j4L%Z]}h^q7 DO NOT COPY THESE VALUES 1% ^qUswWgn+6&xqHN&%');

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

$ nano ~/wordpress/wp-config.php

找到包含这些设置的虚拟值的部分。它看起来像这样:

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地址:

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

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

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

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

最后,在文件中的任何位置粘贴以下行,告诉WordPress使用与MySQL数据库的SSL连接:

wp-config.php
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

保存并关闭文件。

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

我们使用-a标志来确保维护我们的权限:

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

现在我们所有的文件都已到位。剩下要做的就是修改文件所有权。我们将设置文档根目录中的所有文件,由我们的Web服务器用户www-data拥有:

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

现在应该安装WordPress并准备好运行其基于Web的安装例程。我们将在下一步中做到这一点。

第六步 - 通过Web界面设置Wordpress

WordPress有一个基于Web的安装程序,它会询问几个问题并在我们的数据库中安装它所需的表。我们现在开始吧。

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

http://example.com

您将看到WordPress安装程序的语言选择屏幕。选择适当的语言,然后单击进入主安装界面:

img主安装界面

提交信息后,您需要使用刚刚创建的帐户登录WordPress管理界面。然后,您将进入仪表板,您可以在其中自定义和操作您的站点。

结论

在本教程中,我们设置了一个MySQL数据库,以接受来自远程Wordpress安装的受SSL保护的连接。我们使用的命令和技术适用于以任何编程语言编写的任何Web应用程序,但具体的实现细节将有所不同。有关更多信息,请参阅您的应用程序或语言的数据库文档。更多MySQL的教程欢迎访问腾讯云+社区学习更多知识。


参考文献:《How To Set Up a Remote Database to Optimize Site Performance with MySQL on Ubuntu 16.04》

问答

AI开发的语言要求是什么?

相关阅读

如何在Ubuntu上搭建Minecraft服务器

如何在Ubuntu上搭建方舟:生存进化服务器

使用Patroni和HAProxy创建高度可用的PostgreSQL集群

此文已由作者授权腾讯云+社区发布,原文链接:https://cloud.tencent.com/dev...

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区


腾讯云开发者
21.9k 声望17.3k 粉丝