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

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

介绍

随着您的应用程序或网站的增长,您可能会发现已经超出了当前的设置。如果您目前将 Web 服务器和数据库后端托管在同一台 VPS 上,一个好主意是将这两个功能分开,以便每个功能可以在自己的机器上运行和增长。

在本指南中,我们将讨论如何配置一个远程数据库服务器,以便您的 Web 服务器可以连接到动态内容。我们将以 WordPress 作为示例,这样我们就有了一些可以操作的内容。我们将在我们的演示中使用 Ubuntu 12.04 VPS 实例,配置 Nginx 在我们的 Web 服务器上,然后将其连接到远程机器上的 MySQL 数据库。

在数据库服务器上安装 MySQL

首先,我们将配置一个 VPS 实例作为 MySQL 服务器。将我们的数据存储在一个单独的计算机上是一个很好的方式,当您在单机配置上达到极限时,可以优雅地扩展。它还提供了在以后更多地扩展和负载平衡您的设置所需的基本结构。

首先,我们需要在我们的数据库服务器上安装一些基本软件包。这些基本上是为传统的 LEMP 堆栈设置数据库所需的大部分相同的步骤,但我们不需要所有的组件(一些将在其他服务器上)。

首先更新软件包缓存并安装 MySQL 服务器:

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

在安装过程中,您将被要求选择并确认 MySQL 的 root 密码。

安装完成后,您需要运行数据库安装命令,这将生成适当的目录结构来管理您的组件:

sudo mysql_install_db

之后,我们应该通过运行一个脚本来加强一些安全性,该脚本将询问我们是否禁用一些不安全的默认设置:

sudo mysql_secure_installation

您将需要输入您在上述步骤中设置的 MySQL 管理员密码。之后,它会询问您是否要更改该密码。如果您对当前的密码感到满意,请输入“N”表示不更改。

对于所有其他问题,您应该只需按 ENTER 键选择默认选项,这将删除一些测试数据库并锁定访问权限。

配置 MySQL 允许远程访问

现在您的数据库已经运行起来了,我们需要更改一些值以允许其他计算机连接。

使用 root 权限在编辑器中打开 MySQL 的主配置文件:

sudo nano /etc/mysql/my.cnf

该文件被分成由方括号([ 和 ])中的单词表示的部分。找到标记为 mysqld 的部分:

[mysqld]

在这个部分(在这个标记和下一个部分标记之间的区域内),您需要找到一个名为 bind-address 的参数。这基本上告诉数据库软件要监听哪个网络地址上的连接。

当前,MySQL 配置为仅寻找来自自己计算机的连接。我们需要更改它以引用您的服务器可以访问的 外部 IP 地址。

如果您在具有私有网络功能的数据中心托管此服务,请使用您服务器的私有网络 IP。否则,您可以在此处使用公共 IP 地址:

bind-address        = your_database_IP

完成后保存并关闭文件。

为了强制 MySQL 读取我们刚刚实施的新更改,我们可以重新启动数据库:

sudo service mysql restart

设置远程 WordPress 凭据和数据库

现在我们已经配置了 MySQL 监听外部地址,我们需要创建一个数据库并建立一个远程用户。尽管 MySQL 本身现在正在监听其他机器可以连接的 IP 地址,但目前还没有任何数据库可以访问。

这也是一个机会,让我们根据用户连接的位置建立不同的权限。我们可以创建两个“用户”,实际上可以是相同的用户名,但与不同的主机相关联。

我所说的是,我们可以创建一个用户,该用户绑定到数据库服务器本身,并授予它非常广泛的权限。然后我们可以使用相同的用户名,但与我们的 Web 服务器相关联,并且只给予它 WordPress 需要的最低权限。

这将允许我们在登录到我们的数据库服务器时进行重要工作,同时只为我们的 Web 服务器提供其完成工作所需的最低权限。这是一个良好的安全策略,可以在 Web 服务器受到损害的情况下部分保护数据库服务器。

首先使用您配置的 root 帐户和管理密码连接到 MySQL:

mysql -u root -p

您将被要求输入您的 MySQL root 密码,然后将获得一个 MySQL 提示符。

让我们开始创建 WordPress 将使用的数据库。我们将简单地称之为 wordpress,以便以后可以轻松识别它:

CREATE DATABASE wordpress;

现在我们有了一个数据库,我们需要创建我们的本地用户,如果需要进行更多的数据库操作。我们将称此用户为 wordpressuser,并且通过在声明中使用 localhost 仅匹配从数据库服务器本身发起的连接:

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

让我们授予这个帐户对我们的数据库的完全访问权限:

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

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

让我们创建一个伴随帐户,它将仅匹配来自我们的 Web 服务器的连接。为此,您将需要您的 Web 服务器的 IP 地址。我们可以为此帐户命名任何名称,但为了更一致的体验,我们将使用与上面完全相同的用户名,只是修改了主机部分。

请记住,您必须使用与您在 my.cnf 文件中配置的相同网络的 IP 地址。这意味着如果您使用私有网络 IP,您将希望创建以下规则以使用您的 Web 服务器的私有 IP。如果您配置 MySQL 使用公共互联网,您应该使用 Web 服务器的公共 IP 地址。

CREATE USER 'wordpressuser'@'web_server_IP' IDENTIFIED BY 'password';

现在我们有了远程帐户,我们可以为其提供 WordPress 在正常情况下操作所需的可用权限子集。这些是 selectdeleteinsertupdate

虽然这是最终目标,但实际上我们目前无法实施这一点。这是因为在某些操作期间,您将不得不暂时调整权限以允许更多的访问。其中之一实际上是初始安装。最简单的方法是在目前授予所有权限,然后在安装完成后我们将限制它们。

供参考,我们将使用的命令来锁定帐户(不要担心,当您需要时我们将再次提供给您这个命令)是:

GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'web_server_ip';

但现在,我们将暂时授予所有权限,这使其在目前实际上与本地帐户相同:

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

完成后,刷新权限以将它们写入磁盘并开始使用它们:

FLUSH PRIVILEGES;

现在,您可以通过键入以下命令退出 MySQL 提示符:

exit

测试远程和本地连接

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

首先,通过尝试使用我们的新账户从数据库服务器登录来测试数据库机器上的连接:

mysql -u wordpressuser -p

在提示时输入设置的密码。

如果你看到了 MySQL 提示符,那么本地连接就成功了。你可以通过输入以下命令退出:

exit

登录到你的 Web 服务器上测试远程连接。

在你的 Web 服务器上,你需要安装一些 MySQL 客户端工具以便访问远程数据库。更新本地软件包缓存,然后安装客户端工具:

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

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

mysql -u wordpressuser -h database_server_IP -p

再次确保你使用的是数据库服务器的正确 IP 地址。如果你配置了 MySQL 监听私有网络,请输入数据库的私有网络 IP,否则输入数据库服务器的公共 IP 地址。

你应该被要求输入 wordpressuser 账户的密码,如果一切顺利,你应该看到一个 MySQL 提示符。

如果这一步成功,那么你可以退出提示符,因为你已经验证了你可以远程连接。

作为额外的检查,你可以尝试从第三台服务器上做同样的事情,以确保其他服务器没有被授予访问权限。你已经验证了本地访问和来自 Web 服务器的访问,但你还没有验证其他连接会被拒绝。

尝试在你没有为其配置特定用户账户的服务器上执行同样的步骤。你可能需要像上面那样安装客户端工具:

mysql -u wordpressuser -h database_server_IP -p

这应该不会成功。它应该返回一个类似于以下的错误:

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

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

设置 Web 服务器

现在我们已经验证了我们的 Web 服务器可以访问 WordPress 数据库,我们需要通过配置 Nginx、PHP 和必要的组件来将其真正变成一个 Web 服务器。

由于你在上面运行了测试之前更新了软件包索引,我们不需要再次执行这个步骤。让我们安装我们需要的所有软件包:

sudo apt-get install nginx php5-fpm php5-mysql

当所有软件安装完成后,你可以开始配置软件。

配置 PHP

让我们从 PHP 开始,因为这很简单。

打开 php-fpm 的 PHP 配置文件,它将处理我们的动态内容。我们只需要修改这个文件中的一个值:

sudo nano /etc/php5/fpm/php.ini

搜索 cgi.fix_pathinfo 参数。它可能会被注释掉,并设置为 “1”。我们需要取消注释并将其设置为 “0”:

cgi.fix_pathinfo=0

这是一个安全措施。通过设置这个选项,我们告诉 PHP 如果找不到精确匹配的文件,不要尝试猜测用户试图访问的文件。如果我们不设置这个,恶意用户可以利用这个机会让我们的服务器执行我们不希望执行的代码。

完成后保存并关闭文件。

接下来,我们需要打开另一个文件来修改我们的 PHP 处理器和 Web 服务器之间的通信方式:

sudo nano /etc/php5/fpm/pool.d/www.conf

查找 listen 指令,它应该设置为 127.0.0.1:9000。我们将使用一个 Unix 域套接字而不是端口:

listen = /var/run/php5-fpm.sock

完成后保存并关闭文件。

现在我们有了我们的值,重新启动我们的 PHP 处理器:

sudo service php5-fpm restart

配置 Nginx

现在我们准备配置 Nginx。我们可以通过将默认虚拟主机文件复制到一个新文件来开始工作。我们将根据我们网站的域名命名这个文件。我将使用占位符 “example.com”:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

现在,打开刚刚复制的文件:

sudo nano /etc/nginx/sites-available/example.com

在文件中,我们将修改我们的服务器块(包含在 server 大括号内的部分)。首先取消注释监听端口 80 的指令。我们还将更改根目录,并默认使用 Nginx 提供 PHP 索引文件:

server {
    listen 80;
    root /var/www/example.com;
    index index.php index.hmtl index.htm;

接下来,我们将修改 server_name 指令以使用我们的域名,确保我们的 try_files 被正确设置(如果找不到文件,则将请求传递给 PHP),并且我们的错误页面被配置:

server {
    listen 80;
    root /var/www/example.com;
    index index.php index.hmtl index.htm;
    server_name example.com;
    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/www;
    }

最后,我们需要通过使用一个位置块来设置实际的 PHP 处理,该位置块将匹配我们所有的 PHP 请求。如果找不到精确匹配,我们将立即返回 404。我们还将使用我们为 PHP 配置的套接字:

server {
    listen 80;
    root /var/www/example.com;
    index index.php index.hmtl index.htm;
    server_name example.com;
    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/www;
    }
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

这是我们服务器块配置的结尾。保存并关闭文件。

现在,我们将这个文件链接到我们的 “enabled” 目录,并删除默认服务器块文件的链接:

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

重新启动 Nginx 以使这些更改生效:

sudo service nginx restart

安装 WordPress

现在我们已经设置好了带有 PHP 处理的 Web 服务器,并且有了数据库服务器,我们需要安装一个应用程序来利用这一点并连接到我们的数据库。正如你现在所知,我们将在本教程中使用 WordPress 来演示这个功能。

首先,将最新的 WordPress 压缩包下载到你的主目录:

cd ~
wget http://wordpress.org/latest.tar.gz

解压文件,这将在你的主目录中创建一个名为 “wordpress” 的目录:

tar xzvf latest.tar.gz

WordPress 包含一个示例配置文件,但默认情况下不会被使用。我们将重命名此文件,以便它能够被正确读取,然后我们可以在文本编辑器中打开它进行修改:

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

在其中,我们需要输入我们远程数据库的正确值。记得使用你在之前远程数据库测试中使用的相同 IP 地址。

/** WordPress 数据库的名称 */
define('DB_NAME', 'wordpress');

/** MySQL 数据库用户名 */
define('DB_USER', 'wordpressuser');

/** MySQL 数据库密码 */
define('DB_PASSWORD', 'password');

/** MySQL 主机名 */
define('DB_HOST', 'database_server_ip');

完成后关闭文件。实际上,这是整个配置中唯一明确将我们的 Web 服务器和数据库服务器连接起来的部分。

接下来,我们需要创建我们在 Nginx 服务器块配置中设置的目录结构。如果你还记得,我在演示中使用的是 “example.com”,但你应该使用你在 Nginx 配置中指定的任何内容:

sudo mkdir -p /var/www/example.com

然后,我们将复制在我们的 ~/wordpress 目录中找到的文件和目录到我们刚刚创建的新文档根目录:

sudo cp -r ~/wordpress/* /var/www/example.com

现在所有的文件都已经就位。唯一剩下的事情就是稍微修改我们的权限和文件所有权。我们应该首先进入服务器的文档根目录:

cd /var/www/example.com

我们将把这个目录中的所有文件交给我们的 Web 服务器用户,即 www-data

sudo chown -R www-data:www-data *

然而,我们仍然希望能够以我们的普通非 root 用户身份编辑这些文件,因此我们可以将我们的常规非 root 帐户添加到 Web 服务器组。然后,我们可以给该组权限在这个目录中修改文件:

sudo usermod -a -G www-data your_user
sudo chmod -R g+rw /var/www/example.com

通过 Web 界面设置网站

现在,你只需要通过 Web 界面完成安装。

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

http://example.com

你应该看到 WordPress 安装屏幕,在这里你需要填写相关信息:

!WordPress 管理设置

完成配置后,你需要使用刚刚创建的帐户登录到应用程序中:

!WordPress 管理登录

你将被带到管理仪表板,从这里你可以开始配置你的网站:

!WordPress 管理仪表板

限制远程数据库权限

当你完成配置 WordPress 后,你应该返回并撤销一些远程数据库用户的权限。

大多数数据库权限在日常操作中都是不需要的,只有在更新或插件安装时才需要启用。记住这一点,以防在执行这些步骤后进行管理操作时出现错误。

某些插件可能还需要额外的权限。调查每个插件以查看它需要什么,并考虑选择需要最少额外访问权限的插件。

登录到你的数据库服务器。然后,使用 MySQL root 帐户登录到 MySQL:

mysql -u root -p

输入密码以获得访问权限。

你可以通过输入以下命令查看远程用户的当前权限:

show grants for 'wordpressuser'@'web_server_IP';
+---------------------------------------------------------------------------------------------------------------------------+
| Grants for wordpressuser@xx.xxx.xxx.xxx                                                                                   |
+---------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpressuser'@'xx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD '*5FD2B7524254B7F81B32873B1EA6D681503A5CA9' |
| GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpressuser'@'xx.xxx.xxx.xxx'                                                 |
+---------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

“usage” 权限实际上意味着没有真正的权限,因此我们不必担心。第二个权限行是我们最初设置的,允许在 wordpress 数据库上拥有所有权限。

应用比当前权限更严格的新权限的过程实际上是两个步骤。

首先,我们需要撤销所有当前权限。通过输入以下命令来执行此操作:

REVOKE ALL PRIVILEGES on wordpress.* FROM 'wordpressuser'@'web_server_IP';

如果现在我们再次请求当前授权,我们将看到第二行已经消失:

show grants for 'wordpressuser'@'web_server_IP';
+---------------------------------------------------------------------------------------------------------------------------+
| Grants for wordpressuser@10.128.213.175                                                                                   |
+---------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpressuser'@'xx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD '*5FD2B7524254B7F81B32873B1EA6D681503A5CA9' |
+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

现在,我们可以将我们希望重新添加到帐户的权限。我们需要 UPDATEINSERTSELECTDELETE 权限以进行日常使用:

GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'web_server_ip';

如果我们再次检查,我们可以看到我们的细粒度权限现在已经设置好了。

为了告诉 MySQL 重新读取权限表以实施我们的更改,我们可以输入:

FLUSH PRIVILEGES;

之后,再次退出 MySQL:

exit

结论

如果你一直在跟着做,现在你应该已经对如何让远程数据库与你的应用程序通信有了很好的理解。虽然我们讨论了一些特定于 WordPress 的步骤,但一般的思路,特别是与 MySQL 配置和用户权限相关的部分,在大多数远程 MySQL 情况下都是适用的。

猜你喜欢

转载自blog.csdn.net/rubys007/article/details/143496582