建设生产:Web应用程序 - 部署

在这部分“建设生产:Web应用程序”系列(2 6),我们将部署我们的例子中的PHP应用程序,WordPress和私人DNS。您的用户将通过一个域名,例如,通过HTTPS访问应用程序“https://www.example.com”,指向负载平衡器。负载平衡器将充当反向代理向应用服务器,将连接到数据库服务器。

介绍

在教程的这一部分,我们将部署我们的示例PHP应用程序,WordPress和私有DNS: DNS +应用图 您的用户将通过一个域名,如“访问通过HTTPS应用程序https://www.example.com ”,即指向负载平衡器。负载均衡器将充当应用程序服务器的反向代理,这将连接到数据库服务器。私有DNS将使我们能够使用名称来引用我们的服务器的私有网络地址,从而简化我们的服务器配置过程。 我们将在六个服务器上按照以下顺序设置我们刚刚讨论的组件:
  • 专用DNS(ns1和ns2)
  • 数据库服务器(db1)
  • 应用程序服务器(app1和app2)
  • 负载平衡器(lb1)
让我们开始使用DNS设置。

专用DNS服务器

使用地址名称有助于识别您正在使用的服务器,并且对于维护较大的服务器设置变得至关重要,因为您可以通过简单地更新DNS记录(在单个位置)来替换服务器,而不是更新无数个配置文件IP地址。在我们的设置中,我们将设置DNS,以便我们可以通过名称而不是IP地址引用我们的服务器的专用网络地址。 我们将通过“nyc3.example.com”子域下的主机名来引用每个服务器的专用网络地址。例如,数据库服务器的专用网络地址将是“db1.nyc3.example.com”,它解析为其私有IP地址。注意,示例子域几乎完全是任意的,并且通常基于逻辑组织目的来选择;在我们的例子中,我们的“nyc3”表示服务器在NYC3数据中心,“example.com”是我们的应用程序的域名。 按照本教程进行设置,并为您的设置中的每个服务器添加DNS记录: 在完成DNS教程后,您应该有两个的BIND服务器:NS1NS2。如果您已经知道设置中所有服务器的私有IP地址,请立即将它们添加到您的DNS;否则,在创建服务器时添加相应的DNS记录。 现在我们准备好设置我们的数据库服务器。

设置数据库服务器

因为我们希望负载平衡我们的应用程序服务器,即运行Apache和PHP的应用程序服务器,我们需要通过在单独的服务器上设置将应用程序服务器与数据库解耦。从解耦应用程序的数据库是水平扩展多种类型的应用程序,如本博客文章解释前的一个重要步骤: 水平扩展PHP应用程序:实用概述 。 本节涵盖了所有必要的步骤来设置我们的数据库服务器,但您可以了解更多关于设置远程,解耦MySQL数据库服务器在本教程PHP应用程序: 如何设置远程MySQL数据库

安装MySQL

在数据库服务器上,DB1,安装MySQL服务器:
sudo apt-get update
sudo apt-get -y install mysql-server
在提示符处输入所需的MySQL根密码。 现在运行:
sudo mysql_install_db
sudo mysql_secure_installation
您必须输入您在上述步骤中设置的MySQL管理员密码。然后,它会询问您是否要更改该密码。如果您对当前密码感到满意,请输入“N”表示否。使用默认值回答其余的问题。

配置MySQL在专用网络接口上监听

打开MySQL配置文件:
sudo vi /etc/mysql/my.cnf
找到bind-address的设置,并将其更改为你的数据库服务器的私网地址地址:
/etc/mysql/my.cnf
bind-address            = db1.nyc3.example.com
保存并退出。 重新启动MySQL:
sudo service mysql restart

设置数据库和数据库用户

现在我们需要创建应用程序服务器将用来连接的数据库和数据库用户。 进入MySQL控制台:
mysql -u root -p
在提示符处输入MySQL根密码。 在MySQL提示符下,为应用程序创建数据库:
CREATE DATABASE app;
MySQL将其用户与他们应该连接的服务器相关联。在我们的示例中,我们有两个应用程序服务器将要连接,因此我们应为每个应用程序创建一个用户。创建一个数据库用户,在我们的例子“APPUSER”,可以从每个应用程序服务器的私网地址连接到(APP1 APP2和)。您应该为每个用户使用相同的密码:
CREATE USER 'appuser'@'app1.nyc3.example.com' IDENTIFIED BY 'password';
CREATE USER 'appuser'@'app2.nyc3.example.com' IDENTIFIED BY 'password';
我们将在以后配置最终数据库用户的权限,但让我们给悬停在应用数据库APPUSER完全控制:
GRANT ALL PRIVILEGES ON app.* TO 'appuser'@'app1.nyc3.example.com';
GRANT ALL PRIVILEGES ON app.* TO 'appuser'@'app2.nyc3.example.com';
FLUSH PRIVILEGES;
这些宽松的权限确保应用程序的安装程序将能够在数据库中安装应用程序。如果您有两个以上的应用程序服务器,则应立即创建所有必需的数据库用户。 现在退出MySQL提示:
exit
数据库服务器设置完成。让我们设置应用程序服务器。

设置应用程序服务器

应用程序服务器将运行我们的应用程序的代码,这将连接到数据库服务器。我们的示例应用程序是WordPress,它是通过Web服务器(如Apache或Nginx)提供的PHP应用程序。因为我们希望负载平衡应用程序服务器,我们将设置两个相同的服务器。 本节涵盖了所有必要的步骤来设置我们的应用服务器,但主题中详细介绍在下面的教程,从设置Web服务器部分开始: 如何建立一个远程数据库

安装Apache和PHP

在这两个应用程序服务器APP1APP2,安装Apache和PHP:
sudo apt-get update
sudo apt-get -y install apache2 php5-mysql php5 libapache2-mod-php5 php5-mcrypt

配置Apache

我们将在负载均衡器服务器上使用HAProxy来处理SSL终止,因此我们不希望我们的用户直接访问应用程序服务器。因此,我们将Apache绑定到每个服务器的私有网络地址。 在每个应用程序服务器,APP1APP2,打开你的Apache端口配置文件。 默认情况下,这是ports.conf文件:
sudo vi /etc/apache2/ports.conf
查找这行Listen 80 ,并添加专用IP地址给它,像这样(在你的服务器的实际IP地址代替):
Apache ports.conf - 在私人接口上侦听
Listen private_IP:80
保存并退出。这将Apache配置为仅侦听专用网络接口,这意味着它不能由公共IP地址或主机名访问。 重新启动Apache以使更改生效:
sudo service apache2 restart
现在只能通过应用程序服务器的专用网络地址访问Apache。我们将配置负载均衡器,稍后再发送用户请求。

下载并配置应用程序

在我们的示例中,我们使用WordPress作为我们的应用程序。如果使用不同的PHP应用程序,请下载它并执行任何相关配置(例如数据库连接信息),然后跳到下一节。 在第一个应用服务器,APP1,下载WordPress的档案:
cd ~
wget http://wordpress.org/latest.tar.gz
提取WordPress存档:
tar xvf latest.tar.gz
更改到提取的目录:
cd wordpress
WordPress的需要一个目录的上传,将要创建wp-content/uploads 。让我们现在做:
mkdir wp-content/uploads
我们将使用示例WordPress配置文件作为模板。将其复制到正确的位置:
cp wp-config-sample.php wp-config.php
现在打开配置文件进行编辑:
vi wp-config.php
通过更改以下行中突出显示的信息来配置WordPress数据库连接:
wp-config.php
/** The name of the database for WordPress */
define('DB_NAME', 'app');

/** MySQL database username */
define('DB_USER', 'appuser');

/** MySQL database password */
define('DB_PASSWORD', 'password');

/** MySQL hostname */
define('DB_HOST', 'db1.nyc3.example..com');
因为我们将在负载均衡器服务器上使用TLS / SSL加密,所以我们必须添加以下行,以便WordPress知道它位于使用SSL的反向代理之后:
define('FORCE_SSL_ADMIN', true);
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
       $_SERVER['HTTPS']='on';
您还需要更新密钥和Salt,以便您可以在需要时使Cookie无效。我们不会在这里覆盖,但确保它们在所有应用程序服务器上是相同的。 保存并退出。 WordPress现在已配置,但其文件必须复制到我们的Web服务器软件提供的适当位置。

将应用程序文件复制到文档根目录

现在我们已经配置了我们的应用程序,我们需要将它复制到Apache的文档根目录,它可以提供给我们网站的访问者。 Apache的DocumentRoot文件的默认位置是/var/www/html ,因此,我们将使用在我们的例子。 首先,删除默认index.html文件:
sudo rm /var/www/html/index.html
然后使用rsync WordPress的文件复制到/var/www/html ,使www-data所有者(即Apache作为运行用户):
sudo rsync -avP ~/wordpress/ /var/www/html
sudo chgrp -R www-data /var/www/html/*
我们的第一个应用程序服务器,app1,准备好了。我们将设置其他应用程序服务器。

将应用程序文件复制到其他服务器

为了使应用程序的文件在各种应用程序服务器之间保持一致,应该设置Web服务器文档根目录的文件复制。在WordPress的情况下,使用Web界面上传文件和安装插件会将文件存储在处理请求的特定服务器上。如果这些文件未复制到所有应用程序服务器,您的部分用户将被投放缺少图片和插件损坏的网页。如果您的PHP应用程序不是WordPress,并且不在应用程序服务器上存储其任何数据(例如上传的文件或下载的插件),您只需手动复制应用程序文件一次。如果是这样的情况下,使用rsync到您的应用程序文件从APP1复制到APP2。 GlusterFS可以用来创建必需的文件复制卷,它是体现在本教程的同步Web应用程序文件部分: 如何使用HAProxy的作为为WordPress应用服务器负载平衡器 。 按照APP1APP2之间的指令(跳过编辑Hosts文件区域,作为我们的DNS注意到这一照顾),并设置复制。 复制设置正确后,应正确配置两个应用程序服务器。让我们现在设置我们的负载均衡器。

设置负载平衡器服务器

我们的负载均衡器服务器将运行HAProxy,它将作为我们的应用服务器的逆向代理负载均衡器。您的用户将通过负载均衡服务器通过URL来访问你的应用程序,如https://www.example.com 。 本节包括设置负载均衡器服务器的所有必要步骤,但主题将在以下教程中详细介绍:

复制SSL证书

执行负载均衡服务器上执行这些步骤,LB1。 在包含您的SSL证书(从第1部分的先决条件之一)的目录,结合您的证书,任何中间CA证书和证书的主要成一个单一的.pem的文件。 例如(我们的证书是在/root/certs
cd /root/certs
cat www.example.com.crt CAintermediate.ca-bundle www.example.com.key > www.example.com.pem
然后复制PEM文件,以/etc/ssl/private
sudo cp www.example.com.pem /etc/ssl/private/
此文件将由HAProxy用于SSL终止。

安装HAProxy

在负载均衡服务器,LB1,安装HAProxy的:
sudo add-apt-repository ppa:vbernat/haproxy-1.5
sudo apt-get update
sudo apt-get -y install haproxy
现在让我们配置HAProxy。

HAProxy配置

我们需要使用一些合理的设置,SSL终止以及适当的前端和后端来配置HAProxy,以使其与我们的应用程序服务器配合使用。 打开HAProxy配置文件进行编辑:
sudo vi /etc/haproxy/haproxy.cfg

HAProxy配置:常规设置

你想做的第一件事是将maxconn设置为一个合理的数。此设置会影响HAProxy将允许的并发连接数,这可能会影响QoS并阻止Web服务器尝试提供太多请求而导致崩溃。你需要玩弄它,找到什么适合你的环境。将以下行(具有您认为合理的值)添加到配置的全局部分:
haproxy.cfg - maxconn
   maxconn 2048
添加此行,以配置生成的临时DHE密钥的最大大小:
haproxy.cfg - tune.ssl.default-dh-param
   tune.ssl.default-dh-param 2048
接下来,在默认值部分中,在显示mode的行下添加以下行:http:
haproxy.cfg
   option forwardfor
   option http-server-close
如果要启用HAProxy统计信息页面,请在默认值部分中添加以下行(使用安全值替换用户和密码):
haproxy.cfg
   stats enable
   stats uri /stats
   stats realm Haproxy\ Statistics
   stats auth user:password
这将允许您将您的域名上/统计看HAProxy的统计页面(如“ https://www.example.com/stats” )。 不要关闭配置文件!我们将在下面添加代理配置。

HAProxy配置:代理

我们要添加的第一件事是前端来处理传入的HTTP连接。在文件末尾,我们添加一个名为www-http的前端:
frontend www-http
   bind www.example.com:80
   reqadd X-Forwarded-Proto:\ http
   default_backend app-backend
此前端的目的是接受HTTP连接,以便它们可以重定向到HTTPS。 现在添加一个前端来处理传入的HTTPS连接。确保指定适当的pem证书:
frontend www-https
   bind www.example.com:443 ssl crt /etc/ssl/private/www.example.com.pem
   reqadd X-Forwarded-Proto:\ https
   default_backend app-backend
完成前端配置后,通过添加以下行继续添加后端:
backend app-backend
   redirect scheme https if !{ ssl_fc }
   server app1 app1.nyc3.example.com:80 check
   server app2 app2.nyc3.example.com:80 check
此后端指定要向其发送负载平衡流量的应用程序服务器。此外, redirect scheme https行告诉它的HTTP连接重定向到HTTPS。 现在保存并退出haproxy.cfg。 HAProxy现在可以启动,但让我们首先启用日志记录。

启用HAProxy日志记录

打开rsyslog配置文件:
sudo vi /etc/rsyslog.conf
然后找到以下行并取消注释它们以启用UDP syslog接收。完成后,它应该类似于以下内容:
/etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1
现在重新启动rsyslog以启用新配置:
sudo service rsyslog restart
HAProxy日志记录现在已启用!日志文件将在被创建/var/log/haproxy.log一旦HAProxy的开始。

重新启动HAProxy

重新启动HAProxy以使更改生效:
sudo service haproxy restart
我们的负载平衡器现在设置。 现在我们需要运行应用程序的安装脚本。

安装WordPress

我们必须运行WordPress安装脚本,该脚本准备数据库以供其使用,然后我们才能使用它。 在网络浏览器中打开您的网站:
https://www.example.com/wp-admin/install.php
这将显示WordPress安装屏幕。填写表格,然后点击安装WordPress按钮。 WordPress安装后,应用程序已准备好使用。

结论

组成应用程序的服务器现在已设置,您的应用程序已准备好使用。您可以以管理员用户身份登录,您的用户可以通过适当的域名通过HTTPS访问该网站。 一定要测试你的应用程序,并确保它的工作原理,继续前。 继续下一个教程开始工作对您的生产应用程序安装的恢复计划: 建立生产:Web应用程序-恢复计划