介绍
如果您在同一台计算机上托管 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 。
- 可选(但强烈推荐),来自Let's 的 TLS/SSL 证书安装在您的网络服务器上**. 您需要购买一个域名, 并为您的服务器设置 [DNS记录] (https://www.digitalocean.com/docs/networking/dns/), 但证书本身是免费的 。 我们的指南
如何用Ubuntu 20.04加密方式保护Nginx
(https://andsky.com/tech/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04)将教你如何获得这些证书。 (英语)
步骤 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网站的名称,并选择一个用户名. 建议选择一些独特的东西,并避免安全目的的常见用户名admin
。 自动生成一个强大的密码。 保存这个密码或选择一个替代的强密码。
输入您的电子邮件地址,然后选择是否希望阻止搜索引擎索引您的网站:
一旦您提交了您的信息,您将需要使用您刚刚创建的帐户登录WordPress管理界面,然后您将被带到一个仪表板,您可以定制您的新的WordPress网站。
结论
通过遵循本教程,您已经设置了一个MySQL数据库,以接受远程Wordpress安装的SSL保护连接。本指南中使用的命令和技术适用于任何编写在任何编程语言的Web应用程序,但具体的实施细节将有所不同。