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

介绍

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

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

前提条件

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

  • ** 2个** Ubuntu 20.04 服务器。 每一个用户都应该有一个具有sudo权限并启用了UFW防火墙的非root用户,这在我们[使用Ubuntu 20.04的初始服务器设置 (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-20-04) 教程中有所描述. 其中一个服务器将托管您的 MySQL 后端, 并在整个指南中被称为 ** 数据库服务器 ** 。 另一个将远程连接到您的数据库服务器并充当您的网络服务器;同样,在本指南过程中,它将被称为web服务器
  • ** 在您的数据库服务器上 **: MySQL已安装. 跟着[如何在 Ubuntu 20.04 上安装 MySQL (https://andsky.com/tech/tutorials/how-to-install-mysql-on-ubuntu-20-04) 设置此功能.
  • ** 在您的网络服务器上: ** Nginx和PHP已安装. 我们的教程 [如何安装 Linux, Nginx, MySQL, PHP (LEMP stack) 在 Ubuntu 20.04 (https://andsky.com/tech/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-20-04) 中引导您完成这一过程, 但请注意您应该 skip 本教程 步骤2, 重点是安装 MySQL, 您将在您的数据库服务器上安装 MySQL 。

步骤 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

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

1sudo ss -plunt | grep mysqld
1[secondary_label Output]
2tcp LISTEN 0 70 127.0.0.1:33060 0.0.0.0:*      users:(("mysqld",pid=4053,fd=22))                                              
3tcp LISTEN 0 151 db_server_ip:3306 0.0.0.0:*      users:(("mysqld",pid=4053,fd=24))

此输出显示,一个名为mysqld的流程附加到db_server_ip的端口3306,这是标准的MySQL端口,确认服务器正在听取相应的界面。

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

1sudo ufw allow mysql

这些都是你需要对MySQL进行的配置更改,接下来,你会设置一个数据库和一些用户配置文件,其中一个你会用来远程访问服务器。

步骤 2 — 在数据库服务器上设置 WordPress 数据库和远程凭证

尽管MySQL本身现在正在听取外部IP地址,但目前没有远程启用的用户或数据库配置。

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

1sudo mysql

<$>[注] 注: 如果您已启用密码身份验证,如在 [先决条件的MySQL教程的步骤 3]中所述(https://andsky.com/tech/tutorials/how-to-install-mysql-on-ubuntu-20-04),则需要使用以下命令访问MySQL壳:

1mysql -u root -p

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

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

1CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

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

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

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

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

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

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

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

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

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

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

1FLUSH PRIVILEGES;

然后输出 MySQL 提示,键入:

1exit

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

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

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

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

1mysql -u local_db_user -p

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

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

1exit

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

1[environment local]
2ssh remote_user@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 remote_user -h db_server_ip -p

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

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

1[environment second]
2status

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

 1[secondary_label Output]
 2[environment second]
 3--------------
 4mysql Ver 8.0.29-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))
 5
 6Connection id:          14
 7Current database:
 8Current user:           remote_user@web_server_ip
 9SSL:                    Cipher in use is TLS_AES_256_GCM_SHA384
10Current pager:          stdout
11Using outfile:          ''
12Using delimiter:        ;
13Server version:         8.0.29-0ubuntu0.20.04.2 (Ubuntu)
14Protocol version:       10
15Connection:             db_server_ip via TCP/IP
16Server characterset:    utf8mb4
17Db characterset:    utf8mb4
18Client characterset:    utf8mb4
19Conn. characterset:    utf8mb4
20TCP port:               3306
21Binary data as:         Hexadecimal
22Uptime:                 1 hour 8 min 28 sec
23
24Threads: 2 Questions: 69 Slow queries: 0 Opens: 206 Flush tables: 3 Open tables: 125 Queries per second avg: 0.016
25--------------

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

1[environment second]
2exit

您已从 Web 服务器验证了本地访问和访问,但尚未验证其他连接将被拒绝. 对于额外的检查,请尝试从第三方服务器中执行相同的操作,以便确保该其他服务器没有获得访问权限。

请注意,在运行以下命令以尝试连接之前,您可能需要像以前一样安装 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安装的Web服务器

如果你遵循了先决条件的教程,你应该有 Nginx 和 PHP 都安装了 WordPress 和其中的许多插件,利用许多额外的 PHP 扩展程序. 在在您的 Web 服务器上安装 Wordpress 之前,请通过安装一些这些 PHP 扩展程序来准备您的服务器,以便与 Wordpress 使用:

1[environment second]
2sudo apt install php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip

<$>[注] **注:**每个WordPress插件都有自己的要求。有些可能需要安装额外的PHP扩展包。检查您的插件文档以了解其PHP要求。

当您完成安装扩展时,请重新启动 PHP-FPM 流程,以便运行的 PHP 处理器能够利用新安装的功能:

1[environment second]
2sudo systemctl restart php7.4-fpm

接下来,对您的 Nginx 服务器的封锁文件进行一些调整。基于先决条件的教程,您应该在 /etc/nginx/sites-available/ 目录中为您的网站配置文件。 它也应该配置以响应您的服务器的域名或 IP 地址,并受到 TLS/SSL 证书的保护。 /etc/nginx/sites-available/your_domain 这里使用示例目录。

此外, /var/www/your_domain 将作为本例 WordPress 安装的根目录使用。

<$>[注意] 注意: 您可能正在使用 /etc/nginx/sites-available/default 默认配置与 /var/www/html 作为您的文档根。 如果您只想在这个服务器上托管一个网站,这很好。

使用您喜爱的编辑器打开网站的服务器封锁文件. 此示例使用nano:

1[environment second]
2sudo nano /etc/nginx/sites-available/your_domain

在此服务器块中,添加几个位置块,开始创建对应的位置块,用于对 /favicon.ico’ 和 /robots.txt 请求,这两者都不需要登录请求。

您将使用常规表达式位置来匹配任何静态文件的请求,关闭这些请求的日志,并将其标记为高度可缓存,因为这些通常是昂贵的资源。

 1[label /etc/nginx/sites-available/your_domain]
 2[environment second]
 3server {
 4    server_name your_domain www.your_domain;
 5    root /var/www/your_domain;
 6
 7    index index.html index.htm index.php;
 8
 9    location = /favicon.ico { log_not_found off; access_log off; }
10    location = /robots.txt { log_not_found off; access_log off; allow all; }
11    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
12        expires max;
13        log_not_found off;
14    }
15    . . .
16}

在现有的位置/区块中,您可以调整try_files列表. 首先,通过用英镑符号(#)前置第一行来评论默认设置。

 1[label /etc/nginx/sites-available/your_domain]
 2[environment second]
 3server {
 4    . . .
 5    location / {
 6        #try_files $uri $uri/ =404;
 7        try_files $uri $uri/ /index.php$is_args$args;
 8    }
 9    . . .
10}

有了这个新行在您的配置中,而不是作为默认选项返回 404 错误,控制将转移到与请求参数的 index.php 文件。

总的来说,你的文件的顶部应该是这样的:

 1[label /etc/nginx/sites-available/your_domain]
 2[environment second]
 3server {
 4    server_name your_domain www.your_domain;
 5    root /var/www/your_domain;
 6
 7    index index.html index.htm index.php;
 8
 9    location = /favicon.ico { log_not_found off; access_log off; }
10    location = /robots.txt { log_not_found off; access_log off; allow all; }
11    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
12        expires max;
13        log_not_found off;
14    }
15
16    location / {
17       # try_files $uri $uri/ =404;
18        try_files $uri $uri/ /index.php$is_args$args;
19    }
20
21  ...
22}

完成后,保存并关闭文件。

通过键入检查您的配置语法错误:

1[environment second]
2sudo nginx -t

如果没有报告错误,请通过键入重新加载 Nginx:

1[environment second]
2sudo systemctl reload nginx

准备您的Web服务器后,您现在已经准备好安装Wordpress。

第5步:在Web服务器上安装WordPress

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

首先,更改到可编写的目录(建议使用像 `/tmp 这样的临时目录):

1[environment second]
2cd /tmp

这将您的工作目录变为临时文件夹,然后输入以下命令以下载最新版本的WordPress作为压缩文件:

1[environment second]
2curl -LO https://wordpress.org/latest.tar.gz

提取压缩文件来创建WordPress目录结构:

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

您会暂时将这些文件移动到文档根中,但在您这样做之前,请将样本配置文件复制到WordPress读取的文件名:

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

将整个目录的内容复制到文档根中. -a 标志将确保您的权限得到维持,并在源目录的末尾有一个点,表示目录中的所有内容都应该被复制(包括隐藏的文件):

1[environment second]
2sudo cp -a /tmp/wordpress/. /var/www/your_domain

有了您的文件,将所有权分配给 www-data用户和组. 这是 Nginx 运行的用户和组, Nginx 将需要能够阅读和写 WordPress 文件,以便为网站提供服务并执行自动更新:

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

您的WordPress文件现在位于服务器的文档根中,并且拥有正确的所有权。

步骤 6 – 设置 WordPress 配置文件

当您打开 Wordpress 配置文件时,您将开始调整一些秘密密密钥,以便为您的安装提供一些安全性。WordPress 为这些值提供一个安全的生成器,因此您不必自行制定值。

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

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

您将收到类似于以下输出的独特值:

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

 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');

这些是配置行,您可以直接粘贴到配置文件中,以设置安全密钥。

打开WordPress配置文件:

1[environment second]
2sudo nano /var/www/your_domain/wp-config.php

查找包含这些设置示例值的部分:

 1[label /var/www/your_domain/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 /var/www/your_domain/wp-config.php]
 2[environment second]
 3. . .
 4define('AUTH_KEY',         'VALUES COPIED FROM THE COMMAND LINE');
 5define('SECURE_AUTH_KEY',  'VALUES COPIED FROM THE COMMAND LINE');
 6define('LOGGED_IN_KEY',    'VALUES COPIED FROM THE COMMAND LINE');
 7define('NONCE_KEY',        'VALUES COPIED FROM THE COMMAND LINE');
 8define('AUTH_SALT',        'VALUES COPIED FROM THE COMMAND LINE');
 9define('SECURE_AUTH_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
10define('LOGGED_IN_SALT',   'VALUES COPIED FROM THE COMMAND LINE');
11define('NONCE_SALT',       'VALUES COPIED FROM THE COMMAND LINE');
12. . .

接下来,您需要调整数据库名称、数据库用户和 MySQL 内配置的相关密码。

输入远程数据库的连接信息. 请记住使用您之前在远程数据库测试中使用的相同 IP 地址和凭证:

 1[label /var/www/your_domain/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', 'remote_user');
 9
10/** MySQL database password */
11define('DB_PASSWORD', 'remote_user_password');
12
13/** MySQL hostname */
14define('DB_HOST', 'db_server_ip');
15. . .

最后,按照定义(DB_COLLATE,`))的行,添加这个突出的一行,告诉WordPress使用您的MySQL数据库的SSL连接:

1[label var/www/your_domain/wp-config.php]
2[environment second]
3...
4define( 'DB_COLLATE', '' );
5
6define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
7...

保存并关闭文件。

随着配置的设置,WordPress已安装,您已经准备好运行其基于Web的设置流程。

第7步:通过Web界面设置Wordpress

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

导航到与您的 Web 服务器相关的域名(或公共 IP 地址)以及追踪 /wp-admin:

1http://your_domain.com/wp-admin

您将被要求选择您想要使用的语言:

WordPress language selection

接下来,您将进入主设置页面。

选择您的WordPress网站的名称,并选择一个用户名. 建议选择一些独特的东西,并避免安全目的的常见用户名admin。 自动生成一个强大的密码。 保存这个密码或选择一个替代的强密码。

输入您的电子邮件地址,然后选择是否希望阻止搜索引擎索引您的网站:

WordPress install screen

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

结论

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

Published At
Categories with 技术
comments powered by Disqus