介绍
随着您的应用程序或网站的增长, 您可能已经超出了当前的服务器设置. 如果您在同一台计算机上托管 web 服务器和数据库后端, 最好将这两个功能分开, 以便每个功能可以在自己的硬件上运行, 并分担响应访问者请求的负载.
在本教程中, 我们将讨论如何配置 Web 应用程序可以连接的远程 MySQL 数据库服务器. 我们将使用 WordPress 作为示例, 以便我们可以使用, 但该技术广泛适用于任何 MySQL 支持的应用程序.
准备
在开始本教程之前, 您将需要:
两个 Ubuntu 16.04 服务器, 启用了具有 sudo 权限的非 root 用户, 并启用了 UFW 防火墙.
在其中一台服务器上, 您需要安装 LEMP(Linux,Nginx,MySQL,PHP) https://cloud.tencent.com/developer/article/1158585 . 我们将在本教程中安装 MySQL.
(可选)(但强烈建议), 您可以使用 SSL 证书保护 LEMP Web 服务器. 您需要一个域名, 但证书是免费的. 如果你没有域名, 建议您先去这里注册一个域名 https://dnspod.cloud.tencent.com/ .
第一步 - 在数据库服务器上安装 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 安装程序的语言选择屏幕. 选择适当的语言, 然后单击进入主安装界面:
主安装界面
提交信息后, 您需要使用刚刚创建的帐户登录 WordPress 管理界面. 然后, 您将进入仪表板, 您可以在其中自定义和操作您的站点.
结论
在本教程中, 我们设置了一个 MySQL 数据库, 以接受来自远程 Wordpress 安装的受 SSL 保护的连接. 我们使用的命令和技术适用于以任何编程语言编写的任何 Web 应用程序, 但具体的实现细节将有所不同. 有关更多信息, 请参阅您的应用程序或语言的数据库文档. 更多 MySQL 的教程 https://cloud.tencent.com/developer/column/1417/tag-2084 欢迎访问腾讯云 + 社区 https://cloud.tencent.com/developer 学习更多知识.
参考文献:How To Set Up a Remote Database to Optimize Site Performance with MySQL on Ubuntu 16.04
问答
AI 开发的语言要求是什么? https://cloud.tencent.com/developer/ask/60047?fromSource=waitui
来源: https://juejin.im/post/5b73c81ff265da283d645a3a