提供:ZStack云计算

内容介绍

随着应用或网站规模的不断提升,现有设置可能已经无法满足需求。如果大家将现有Web服务器及数据库托管在同一VPS当中,那么我们不妨将二者进行拆分以解决资源需求难题。

今天,我们将探讨如何配置一套远程数据库服务器,用于向Web服务器交付动态内容。在这里我们使用WordPress作为示例,并将在Web服务器上配置Nginx以接入远程设备上的MySQL数据库。在示例中,我们将使用Ubuntu 12.04 VPS实例。

在数据库服务器上安装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”保留现有密码。

对于其它问题,一路回车按下去保留默认即可。

配置MySQL以允许远程访问

现在数据库已经开始运行,接下来变更对应值以接受来自其它计算机的访问。

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

sudo nano /etc/mysql/my.cnf

此文件分为数个部分,找到其中mysqld标签部分:

[mysqld]

在这里(即此标签与下一标签之间),大家需要找到一个名为bind-address的参数。其基本作用是告知数据库软件监听哪个网络地址以实现接入。

现在,MySQL的配置为只监听来自本计算机的连接。我们需要变更以通过引用外部IP地址的方式实现服务器接入。

如果大家将此实例托管在提供私有网络功能的数据中心内,则可使用服务器的私有网络IP。除此之外的其它情况,大家可以使用公共IP地址:

bind-address        = your_database_IP

完成后保存并退出。

重启数据库以应用变更:

sudo service mysql restart

设置远程WordPress证书与数据库

现在我们的MySQL已经能够监听外部地址,接下来创建数据库并建立一个远程用户。尽管MySQL本身已经能够监听其它接入设备的IP地址,但其中仍然没有可供访问的数据库。

我们还可以设置不同权限,从而对接入用户进行控制。我们可以创建两个“user”并分配同样的用户名,但将二者各自指向不同的主机。

在这里,我们可以创建一个与数据库服务器本身相绑定的用户,并为其提供非常广泛的权限。在此之后,我们仍然使用同样的用户名但与Web服务器关联,且只提供基本的WordPress必要权限。

如此一来,重要任务都将登录至数据库服务器进行处理,而Web服务器则只利用最低权限来完成日常任务。这是一种良好的安全策略,能够在Web服务器遭遇入侵时保证数据库服务器安全。

首先使用root账户接入MySQLMySQL并输入配置完成的管理密码:

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地址。在这里,我们仍然使用同样的用户名,但会对其中的主机部分进行修改。

请注意,大家使用的IP地址必须与my.cnf文件内的配置保持一致。这意味着如果大家使用私有网络IP,则需要创建以下规则以使用Web服务器的私有网络IP。如果大家在配置中要求MySQL使用公共互联网,则应当匹配Web服务器的公共IP地址。

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

现在我们已经拥有了自己的远程账户,接下来为其提供WordPress运行所必要的几项权限,即select、delete、insert与update。

但这只是最终目标,我们暂时还无法实现,这是因为在特定操作当中,大家可能需要临时调整权限以允许更多访问。在初始安装时,最简便的办法是首先分配所有权限,而后再根据需要逐渐限制。

这里我们首先对账户进行锁定:

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

但出于安装需求,我们暂时为其提供全部权限,从而更为高效地进行本地账户验证:

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

接下来WordPress配置完成后,我们会回来继续处理这部分工作。如果大家已经完成了WordPress的安装,只是希望通过本教程了解如何将Web服务器从数据库服务器中拆分出来的话,则可立即使用各项限制规则。

刷新权限以将其写入磁盘并加以使用:

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

这时我们需要输入wordpressuser账户密码,如果一切顺利,则可看到MySQL提示符。

成功之后,即可退出提示符。

作为额外的检查,大家也可以在第三台服务器上尝试接入,确保其它服务器无法成功访问。

接下来在尚未配置特定用户账户的服务器上重复以上流程:

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服务器

接下来的任务是对Nginx、PHP及其它必要组件进行配置。

由于此前已经完成了软件包更新,因此安装全部需要的软件包:

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

安装完成后,开始进行软件配置。

配置PHP

首先从最简单的PHP入手。打开负责处理动态内容的PHP配置文件php-fpm,而后修改相应值:

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 domain socket:

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

保存并退出。

接下来重启PHP处理程序:

sudo service php5-fpm restart
配置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 block(位于server大括号之内)。首先是取消监听端口80这条命令的注释。另外,我们还需要变更root目录并使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请求相匹配的location block以设置实际PHP处理流程。如果找不到匹配选项,则立即返回404。我们还将使用为PHP配置的socket:

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;
}
}

到这里,server block配置完成。保存并退出。

下面将其链接至“enabled”目录并移除与默认server block文件的链接:

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

在主目录中下载最新WordPress tarball:

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

/** 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', 'database_server_ip');

保存并退出。这只是完整配置中的一部分,负责将Web服务器与数据库服务器加以对接。

下面创建Nginx server block配置中所使用的目录结构。大家应该还记得,当时我们使用了“example.com”作为占位符:

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用户对这些文件进行编辑,因此可以将Web服务器上的普通非root账户添加到Web服务器群组中。而后在以下目录内对该群组的权限进行修改:

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

通过Web界面设置站点

下面的任务是通过该Web界面完成安装工作。

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

http://example.com

这里大家应该看到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)

现在我们需要为该账户恢复部分必要权限,即UPDATE、INSERT、SELECT与DELETE:

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

再次检查,就会看到权限设置已经生效。

要告知MySQL对权限设置进行重新读取,可使用以下命令:

FLUSH PRIVILEGES;

完成后退出:

exit

总结

通过今天的教程,大家应该已经了解了如何建立远程数据库并与我们的应用相对接。虽然其中包含部分WordPress特定步骤,但总体来讲其仍然能够指导各位掌握MySQL配置、用户权限以及其它大多数在远程MySQL条件下可以借鉴的方法。

本文来源自DigitalOcean Community。英文原文:How To Set Up a Remote Database to Optimize Site Performance with MySQL By Justin Ellingwood

翻译:diradw

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐