介绍
随着您的应用程序或网站的增长,您可能已经超过了当前的设置,如果您目前在同一 VPS 上托管您的 Web 服务器和数据库后端,那么可以将这两个功能分开,以便每个功能都能在自己的机器上运行和发展。
在本指南中,我们将讨论如何配置您的 Web 服务器可以连接到动态内容的远程数据库服务器. 我们将使用 WordPress 作为一个例子,以便我们有东西可以工作。我们将在我们的 Web 服务器上配置 Nginx,然后连接到远程机器上的 MySQL 数据库。
在数据库服务器上安装MySQL
要开始,我们将配置一个VPS实例作为MySQL服务器. 将我们的数据存储在一个单独的计算机上是一个很好的方法,当你在一台机器配置上达到天花板时,可以优雅地扩展。
要开始,我们需要在我们的数据库服务器上安装一些基本包. 这些基本上是您在为传统的 LEMP 堆栈设置数据库时所采取的相同步骤,但我们不需要所有组件(有些在其他服务器上)。
首先,更新您的包缓存并安装MySQL服务器:
1sudo apt-get update
2sudo apt-get install mysql-server
您将被要求在安装过程中选择并确认 MySQL 的根密码。
完成后,您需要运行数据库安装命令,该命令将生成适当的目录结构来管理您的组件。
1sudo mysql_install_db
之后,我们应该通过运行一个脚本来加紧一些安全性,这将要求我们禁用一些不安全的默认功能:
1sudo mysql_secure_installation
您将需要输入您在上面的步骤中设置的MySQL管理员密码。之后,它会询问您是否想要更改该密码。
对于所有额外的问题,您只需点击 Enter 即可选择默认选项,这些选项将删除一些测试数据库并锁定访问权限。
配置 MySQL 以允许远程访问
现在您已启动和运行数据库,我们需要更改一些值以允许来自其他计算机的连接。
在您的编辑器中打开 MySQL 的主要配置文件与 root 特权:
1sudo nano /etc/mysql/my.cnf
这个文件被划分成部分,用字符串中的单词([和 ])表示。 查找标记为 `mysqld'的部分:
1[mysqld]
在此部分(在此标签和下一个部分标记之间的区域)中,您需要找到一个称为bind-address
的参数,这基本上告诉数据库软件在哪个网络地址上聆听连接。
目前,MySQL已配置为仅从自己的计算机搜索连接,我们需要更改,以引用您的服务器可以访问的外部IP地址。
如果您在拥有私有网络功能的数据中心托管此信息,请使用服务器的 私有网络 IP。
1bind-address = your_database_IP
保存并关闭文件,当你完成。
要强迫MySQL读取我们刚刚实施的新更改,我们可以重新启动数据库:
1sudo service mysql restart
设置远程 WordPress 凭证和数据库
现在我们已经配置了MySQL在外部地址上聆听,我们需要创建一个数据库并建立一个远程用户,尽管MySQL本身现在正在聆听其他机器可以连接的IP地址,但目前没有任何数据库可以访问。
这也是我们建立不同的特权的机会,取决于用户从哪里连接,我们可以创建两个用户
,实际上可以是相同的用户名,但与不同的主机相关联。
我的意思是,我们可以创建一个与数据库服务器本身相关联的用户,并给予它非常广泛的权限,然后我们可以使用相同的用户名,但与我们的Web服务器相关联,并给它只有WordPress所需的权限。
这将允许我们在登录到我们的数据库服务器时进行重量级的工作,同时只为我们的Web服务器提供最低限度的权限,以完成其工作。
首先,使用您配置的 root 帐户和管理密码连接到 MySQL:
1mysql -u root -p
您将被要求提供您的MySQL根密码,然后您将收到MySQL提示。
要开始,让我们创建WordPress将使用的数据库,我们只会称之为WordPress,以便我们稍后可以轻松识别它:
1CREATE DATABASE wordpress;
现在我们有一个数据库,我们需要创建我们的本地用户,如果有必要,我们将把这个用户称为wordpressuser
,并在声明中使用localhost
来仅匹配来自数据库服务器本身的连接尝试:
1CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'password';
让我们继续,并允许这个帐户完全访问我们的数据库:
1GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost';
这个用户现在可以在WordPress的数据库上执行任何操作,但这个帐户不能远程使用,因为它只匹配来自本地机器的连接。
让我们创建一个伴侣帐户,将完全匹配我们的网页服务器的连接. 为此,您需要您的网页服务器的IP地址. 我们可以将这个帐户命名为任何东西,但为了获得更一致的体验,我们将使用相同的用户名,就像我们在上面所做的,只有主机部分被修改。
请记住,您必须使用使用您在 my.cnf 文件中配置的相同网络的 IP 地址,这意味着如果您使用了私有网络 IP,您将想要创建下面的规则来使用您的 Web 服务器的私有 IP。
1CREATE USER 'wordpressuser'@'web_server_IP' IDENTIFIED BY 'password';
现在我们有我们的远程帐户,我们可以给它提供WordPress在正常情况下运作所需的可用权限子集,这些是选择
,删除
,插入
和更新
。
虽然这是最终的目标,但我们目前实际上无法实现这一点,这是因为在某些操作中,您将不得不暂时调整权限以允许更多访问。其中一个实际上是初始安装。
作为参考,我们将使用的命令来锁定帐户(不要担心,当你需要时,我们会再次给你这个命令):
1GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'web_server_ip';
但目前,我们将暂时授予所有特权,这使得它实际上与本地账户相同:
1GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'web_server_ip';
如果您实际上没有安装WordPress,并且正在使用本指南,只是为了了解如何将您的Web服务器从您的数据库中分离出来,您现在可能能够使用更具限制性的设置。
扫描权限,将其写入磁盘并开始使用它们:
1FLUSH PRIVILEGES;
现在,您可以通过键入退出MySQL提示:
1exit
测试远程和本地连接
在我们继续之前,最好确保您可以通过使用wordpressuser
帐户连接到您的数据库,无论是从本地机器还是从您的Web服务器。
首先,通过尝试使用我们的新帐户登录来测试您的数据库机器的连接:
1mysql -u wordpressuser -p
在提示时输入您为此帐户设置的密码。
如果您收到 MySQL 提示,则本地连接成功,您可以通过键入再次退出:
1exit
登录您的 Web 服务器来测试远程连接。
在您的 Web 服务器上,您需要安装一些 MySQL 客户端工具才能访问远程数据库. 更新本地包缓存,然后安装客户端工具:
1sudo apt-get update
2sudo apt-get install mysql-client
现在,我们可以使用以下语法连接到我们的数据库服务器:
1mysql -u wordpressuser -h database_server_IP -p
再次,您必须确保您正在使用正确的数据库服务器的 IP 地址. 如果您已配置 MySQL 来在私有网络上收听,请输入数据库的私有网络 IP,否则输入数据库服务器的公共 IP 地址。
你应该被要求为你的wordpressuser
帐户的密码,如果一切顺利,你应该得到一个MySQL提示。
如果这是成功的,那么你可以继续前进并离开提示,因为你现在已经验证了你可以远程连接。
为了进行额外的检查,您可以尝试从第三方服务器做同样的事情,以确保该其他服务器是 not 授予的访问. 您已经验证了本地访问和访问来自 Web 服务器,但您没有验证其他连接将被拒绝。
继续在服务器上尝试相同的程序,您没有配置特定的用户帐户,您可能需要像上面一样安装客户端工具:
1mysql -u wordpressuser -h database_server_IP -p
这不应该成功完成,它应该抛弃一个看起来像这样的错误:
1ERROR 1130 (HY000): Host '11.111.111.111' is not allowed to connect to this MySQL server
这是我们期望的,也是我们想要的。
设置 Web 服务器
现在我们已经验证了我们的 Web 服务器可以访问 WordPress 数据库,我们需要通过配置 Nginx、PHP 和所需的组件来实现这个 Web 服务器。
由于您更新了您的包索引以运行上述测试,我们不需要再这样做。
1sudo apt-get install nginx php5-fpm php5-mysql
一旦安装完毕,您就可以开始配置软件。
配置 PHP
让我们从PHP开始,因为这很容易。
打开php-fpm
的PHP配置文件,它将处理我们的动态内容,我们只需要修改一个值:
1sudo nano /etc/php5/fpm/php.ini
搜索 cgi.fix_pathinfo
参数. 它可能会用;
字符评论并设置为1
。 我们需要通过不评论行并将其设置为0
来扭转这两个条件:
1cgi.fix_pathinfo=0
这是一个安全措施. 通过设置此选项,我们告诉PHP不要试图猜测用户试图访问的文件,如果没有找到准确的匹配。
保存并关闭文件,当你完成。
接下来,我们需要打开另一个文件来修改我们的PHP处理器和Web服务器的通信方式:
1sudo nano /etc/php5/fpm/pool.d/www.conf
寻找倾听
指令,该指令应该设置为127.0.0.1:9000
。
1listen = /var/run/php5-fpm.sock
保存并关闭文件,当你完成。
现在我们有我们的价值观,重新启动我们的PHP处理器:
1sudo service php5-fpm restart
配置 Nginx
现在我们已经准备好配置 Nginx 了,我们可以开始将默认的虚拟主机文件复制到我们可以使用的新文件中。
1sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
现在,打开我们刚刚复制的文件:
1sudo nano /etc/nginx/sites-available/example.com
内部,我们将修改我们的服务器块(包含在服务器
支架内的部分)。 首先,不要评论指令以倾听端口80:我们还将更改根目录,并使Nginx默认地服务PHP索引文件:
1server {
2 listen 80;
3 root /var/www/example.com;
4 index index.php index.hmtl index.htm;
接下来,我们将修改server_name
指令以使用我们的域名,确保我们的try_files
设置正确(如果没有找到文件,将请求传输到PHP),并配置我们的错误页面:
1server {
2 listen 80;
3 root /var/www/example.com;
4 index index.php index.hmtl index.htm;
5 server_name example.com;
6 location / {
7 try_files $uri $uri/ /index.php?q=$uri&$args;
8 }
9 error_page 404 /404.html;
10 error_page 500 502 503 504 /50x.html;
11 location = /50x.html {
12 root /usr/share/nginx/www;
13 }
最后,我们需要通过使用一个位置块来设置实际的PHP处理,这将匹配我们所有的PHP请求,如果没有找到准确的匹配,我们将立即返回404。
1server {
2 listen 80;
3 root /var/www/example.com;
4 index index.php index.hmtl index.htm;
5 server_name example.com;
6 location / {
7 try_files $uri $uri/ /index.php?q=$uri&$args;
8 }
9 error_page 404 /404.html;
10 error_page 500 502 503 504 /50x.html;
11 location = /50x.html {
12 root /usr/share/nginx/www;
13 }
14 location ~ \.php$ {
15 try_files $uri =404;
16 fastcgi_pass unix:/var/run/php5-fpm.sock;
17 fastcgi_index index.php;
18 include fastcgi_params;
19 }
20}
这是我们服务器封锁配置的结束. 保存和关闭文件。
现在,我们将此链接到我们的启用
目录,并删除默认服务器封锁文件的链接:
1sudo rm /etc/nginx/sites-enabled/default
2sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
重新启动 Nginx 以使这些更改发生:
1sudo service nginx restart
安装WordPress
现在我们有我们的Web服务器设置PHP处理,我们有一个数据库服务器,我们需要安装一个应用程序来利用这一点,并连接到我们的数据库。
下载最新的WordPress tarball到您的家庭目录:
1cd ~
2wget http://wordpress.org/latest.tar.gz
提取文件,在您的主目录中将创建一个名为wordpress
的目录:
1tar xzvf latest.tar.gz
WordPress 包含一个样本配置文件,但它没有在盒子外的位置. 我们将更名这个文件,以便它会被正确阅读,然后我们可以在我们的文本编辑器中打开它来进行我们的更改:
1cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php
2nano ~/wordpress/wp-config.php
内部,我们需要输入我们远程数据库的正确值. 请记住使用您之前在远程数据库测试中使用的相同 IP 地址。
1/** The name of the database for WordPress */
2define('DB_NAME', 'wordpress');
3
4/** MySQL database username */
5define('DB_USER', 'wordpressuser');
6
7/** MySQL database password */
8define('DB_PASSWORD', 'password');
9
10/** MySQL hostname */
11define('DB_HOST', 'database_server_ip');
完成后关闭文件,这是整个配置的唯一部分,明确链接到我们的Web服务器和数据库服务器。
接下来,我们需要创建我们在 Nginx 服务器块配置中设置的目录结构. 如果你记得,我正在使用example.com
来演示,但你应该使用你在 Nginx 配置中指定的任何东西:
1sudo mkdir -p /var/www/example.com
然后,我们会将在我们的~/wordpress
目录中找到的文件和目录复制到我们刚刚创建的新文档根:
1sudo cp -r ~/wordpress/* /var/www/example.com
现在我们所有的文件都已经到位了,唯一需要做的就是稍微修改我们的权限和文件所有权,我们应该先进入我们的服务器的文件根:
1cd /var/www/example.com
我们将把本目录中的所有文件交给我们的网页服务器用户,称之为www-data
:
1sudo chown -R www-data:www-data *
我们仍然希望能够编辑这些文件作为我们的正常,非根用户,所以我们可以在我们的网页服务器上添加我们的常规,非根帐户到网页服务器组。
1sudo usermod -a -G www-data your_user
2sudo chmod -R g+rw /var/www/example.com
通过 Web 界面设置网站
现在,你需要做的只是通过Web界面完成安装。
导航到与您的 Web 服务器相关的域名(或公共 IP 地址):
1http://example.com
您应该看到WordPress安装屏幕,您需要填写相关信息:
一旦设置了配置,您需要使用您刚刚创建的帐户登录应用程序:
您将被带到管理仪表板,在那里您可以开始配置您的网站:
限制远程数据库权限
当您完成配置您的WordPress时,您应该返回并撤销您的远程数据库用户的一些特权。
大多数数据库权限不需要用于日常操作,只需要在更新期间或插件安装时启用。
研究每个插件,看看它需要什么,并考虑选择需要最少额外访问的插件。
登录您的数据库服务器,然后使用 MySQL 根帐户登录 MySQL:
1mysql -u root -p
输入您的密码以获取访问提示。
您可以通过键入以下方式查看远程用户的当前权限:
1show grants for 'wordpressuser'@'web_server_IP';
1+---------------------------------------------------------------------------------------------------------------------------+
2| Grants for wordpressuser@xx.xxx.xxx.xxx |
3+---------------------------------------------------------------------------------------------------------------------------+
4| GRANT USAGE ON *.* TO 'wordpressuser'@'xx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD '*5FD2B7524254B7F81B32873B1EA6D681503A5CA9' |
5| GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpressuser'@'xx.xxx.xxx.xxx' |
6+---------------------------------------------------------------------------------------------------------------------------+
72 rows in set (0.00 sec)
使用
许可实际上意味着没有真正的特权,所以我们不必担心这一点,第二条特权线是我们最初设置的,允许在WordPress
数据库上的所有特权。
应用比现有特权更具限制性的新特权的程序实际上是两个步骤。
首先,我们需要撤销所有当前的特权. 通过键入这样的东西来做到这一点:
1REVOKE ALL PRIVILEGES on wordpress.* FROM 'wordpressuser'@'web_server_IP';
如果我们现在要求现有补贴,我们会看到第二行已经消失了:
1show grants for 'wordpressuser'@'web_server_IP';
1+---------------------------------------------------------------------------------------------------------------------------+
2| Grants for [email protected] |
3+---------------------------------------------------------------------------------------------------------------------------+
4| GRANT USAGE ON *.* TO 'wordpressuser'@'xx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD '*5FD2B7524254B7F81B32873B1EA6D681503A5CA9' |
5+---------------------------------------------------------------------------------------------------------------------------+
61 row in set (0.00 sec)
现在,我们可以将我们想要的权限添加到帐户中,我们需要更新
,插入
,选择
和删除
权限用于日常使用:
1GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'web_server_ip';
如果我们再次检查,我们可以看到我们的颗粒特权现在已经设置。
要告诉 MySQL 重新阅读权限表以实现我们的更改,我们可以键入:
1FLUSH PRIVILEGES;
接下来,再度从 MySQL 退出:
1exit
结论
如果你一直在跟进,你现在应该有一个很好的了解如何获得远程数据库与你的应用程序交谈. 虽然我们已经通过一些WordPress特定的步骤,一般的想法,特别是与MySQL配置和用户权限相关的想法,适用于大多数远程MySQL情况。