介绍
随着您的应用程序或网站的增长,您可能会发现您已经超出了当前的设置。 如果您当前在同一个VPS上托管您的Web服务器和数据库后端,一个好主意可能是分离这两个功能,使每个功能可以在自己的机器上运行和增长。
在本指南中,我们将讨论如何配置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”表示否。
对于所有其他问题,您应该按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服务器受损的情况下部分屏蔽数据库服务器。
首先使用您配置的根帐户和管理密码连接到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的数据库执行任何操作,但此帐户不能远程使用,因为它只匹配来自本地计算机的连接。
让我们创建一个与我们的网络服务器专用的连接匹配的随播帐户。 为此,您需要您的网络服务器的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服务器与数据库分离,可以使用更严格的设置。 它取决于您的Web应用程序,因此查找应用程序所需的最低数据库权限。
刷新权限以将其写入磁盘并开始使用它们:
FLUSH PRIVILEGES;
现在,您可以通过键入以下命令退出MySQL提示:
exit
测试远程和本地连接
我们继续之前,最好验证您可以使用来自本地计算机,并从Web服务器连接到数据库wordpressuser
帐户。
首先,尝试使用我们的新帐户登录,从数据库计算机测试连接:
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的提示。
如果这是成功的,那么您可以继续并退出提示,因为您现在已经验证您可以远程连接。
对于一个额外的检查,你可以尝试从第三台服务器做同样的事情,以确保这个其他的服务器不授予访问权限。 您已验证本地访问和访问网络服务器,但您尚未验证其他连接将被拒绝。
来吧,试试你没有配置特定的用户帐户的服务器上相同的步骤。 您可能需要像上面那样安装客户端实用程序:
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配置文件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域套接字:
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 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服务器块配置中设置的目录结构。 如果你记得,我使用“example.com”作为我的演示,但你应该使用你在Nginx配置中指定的任何内容:
sudo mkdir -p /var/www/example.com
然后,我们将复制在我们找到的文件和目录~/wordpress
目录,我们刚刚创建的新文档根目录:
sudo cp -r ~/wordpress/* /var/www/example.com
现在我们所有的文件都到位。 唯一剩下要做的是修改我们的权限和文件所有权一点。 我们应该开始进入我们服务器的文档根目录:
cd /var/www/example.com
我们将提供所有文件的这个目录到我们的网站服务器的用户,这就是所谓的www-data
:
sudo chown -R www-data:www-data *
我们仍然希望能够编辑这些文件作为我们正常的非root用户,所以我们可以将我们的常规非root帐户添加到Web服务器上的Web服务器组。 然后我们可以授予该组修改此目录中的文件的权限:
sudo usermod -a -G www-data your_user sudo chmod -R g+rw /var/www/example.com
通过Web界面设置站点
现在,您只需要通过Web界面完成安装。
导航到与您的网络服务器相关联的域名(或公共IP地址):
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)
“使用”权限实际上意味着没有真正的特权,所以我们不必担心。 第二特权是,我们最初设定,允许所有特权一个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;
之后,再次退出MySQL:
exit
结论
如果你正在跟进,你现在应该很好地了解如何获得一个远程数据库与你的应用程序交谈。 虽然我们讨论了一些WordPress特定的步骤,但一般的想法,特别是那些与MySQL配置和用户权限相关的,适用于大多数远程MySQL情况。