生产环境构建指南:Web应用——部署

时间:2021-01-17 12:46:09

提供:ZStack云计算

系列教程

本教程为生产环境构建指南:Web应用系列六篇中的第二篇。

内容简介

在今天的教程中,我们将探讨如何部署示例PHP应用、WordPress以及专有DNS:

用户可通过域名经由HTTPS访问我们的应用,而此域名则指向负载均衡器。负载均衡器将充当应用服务器的反向代理,而应用服务器则接入数据库服务器。经过简单的服务器配置,专有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服务器:ns1与ns2。如果大家已经了解设置中全部服务器的专有IP地址,则可直接将其添加到DNS当中; 如果还不清楚,可在创建服务器的过程中再添加对应的DNS记录。

接下来着手设置数据库服务器。

设置数据库服务器

由于我们需要对应用服务器进行负载均衡,因此需要将其从应用服务器中独立出来。将数据库服务器与应用服务器中解耦出来是一种常见的应用规模扩展操作,具体方式可参阅PHP应用横向扩展:实例概述

以上教程中已经涵盖了全部必要步骤,不过大家也可以参阅如何设置一套远程MySQL数据库以了解如何设置一套远程解耦MySQL数据库服务器。

安装MySQL

在数据库服务器db1中安装MySQL Server:

- sudo apt-get update

- sudo apt-get -y install mysql-server

在提示符中输入要使用的MySQL root密码。现在运行:

- 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 root密码。

为应用创建数据库:

- 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分配全部appdatabase控制权限:

- 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,其属于PHP应用且通过Apache或者Nginx等Web服务器起效。由于我们需要对应用服务器进行负载均衡,因此应当设置两台相同的服务器。

这部分工作属于应用服务器设置中的必要步骤,大家可以参阅如何设置一套远程数据库中的“设置Web服务器”章节。

安装Apache与PHP

接下来在app1与app2上安装Apache与PHP:

- sudo apt-get update

- sudo apt-get -y install apache2 php5-mysql php5 libapache2-mod-php5 php5-mcrypt

配置Apache

我们将在负载均衡服务器上使用HAProxy以处理SSL终端,因此我们不允许用户直接访问应用服务器。在这里,我们将把Apache与每台服务器的专有网络地址相绑定。

在两台应用服务器上分别打开Apache端口配置文件。在默认情况下,其应为ports.conf文件:

- sudo vi /etc/apache2/ports.conf

找到Listen 80一行,向其中添加自己的专有IP地址:

Apache ports.conf — Listen on private interface

Listen private_IP:80

保存并退出。这部分内容将配置Apache只监听该专有网络接口,意味着其无法通过公共IP地址或者主机名称接受访问。

重启Apache以应用变更:

- sudo service apache2 restart

Apache现在只接受应用服务器专有网络地址的访问。在后文中,我们将配置负载均衡器以由此发送用户请求。

下载并配置应用

在本示例中,我们使用WordPress作为实际应用。如果大家使用其它PHP应用,则可下载并执行相关配置,并直接跳过此章节。

在第一台应用服务器app1中下载WordPress压缩包:

- cd ~

- wget http://wordpress.org/latest.tar.gz

进行解压缩:

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

大家还需要更新其中的key与salt,因此可以在必要时取消其中的cookies。但本示例将忽略这方面内容,旨在确保其在各应用服务器上皆保持一致。

保存并退出。

WordPress现在已经配置完成,但其文件必须被复制到正确位置以供Web服务器软件使用。

将应用文件复制至Document Root处

现在,我们已经完成了应用配置,接下来需要将其复制至Apache的document root当中,以供网站访问者查看。

在本示例中,我们将使用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的document root当中。在使用WordPress的情况下,利用Web界面上传文件并安装插件以将这些文件保存在特定服务器上。如果这些文件未能被复制到全部应用服务器上,则部分用户可能会查看到存在图片缺失及插件错误的页面。如果大家选择的PHP应用并非WordPress,且未将任何数据(例如上传文件或者下载插件)保存至应用服务器,则可手动完成应用文件复制。在这种情况下,请使用rsync将应用文件从app1复制至app2。

GlusterFS可用于创建一套必要文件副本分卷,大家可参阅如何利用HAProxy充当WordPress应用服务器上的负载均衡器一文中的“同步Web应用文件”章节。

当复制工作完成后,两台应用服务器也都应配置就绪。下面设置负载均衡器。

设置负载均衡服务器

我们的负载均衡服务器将运行HAProxy,并作为应用服务器的反向代理负载均衡器。用户将通过https://www.example.com这一URL经由该负载均衡器访问我们的应用。

这部分内容属于负载均衡器服务器设置中的必要步骤,大家可参阅以下教程了解细节信息:

复制SSL证书

在lb1负载均衡服务器上执行以下步骤。

首先在容纳SSL证书的目录当中将现有证书、任意中间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所能允许的最大并发连接数量,进而影响到服务质量并预防Web服务器由于接收过多请求而发生崩溃。大家需要立足于实际环境进行考量。在配置中的全局部分添加以下行(并使用合理数值):

haproxy.cfg — maxconn

maxconn 2048

另外,添加以下行以配置所生成临时DHE key的最大数量:

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

如此一来,我们就能够在域名后添加/stats以查看HAProxy状态页面了。

先别急着关闭此配置文件!下面我们还需要添加代理配置。

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已经可以启动,但下面我们需要启动其日志记录功能。

启动HAProxy日志记录

打开rsyslog配置文件:

- sudo vi /etc/rsyslog.conf

而后找到以下行,取消其注释以启用UDP系统日志接收机制。修改后内容如下:

/etc/rsyslog.conf

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

现在重启rsyslog以应用新配置:

sudo service rsyslog restart

HAProxy日志记录功能已经启动!日志文件将在HAProxy启动后被保存为/var/log/haproxy.log。

重启HAProxy

重启HAProxy以应用变更:

- sudo service haproxy restart

我们的负载均衡器现在已经设置完成。

接下来,我们需要运行应用的安装脚本。

安装WordPress

在使用之前,我们必须首先运行WordPress安装脚本以准备其所使用的数据库。

在浏览器中打开以下站点:

https://www.example.com/wp-admin/install.php

这里将显示WordPress安装界面。填写表单并点击Install WordPress按钮。

WordPress安装完成后,该应用即可随时运行。

总结

作为应用的组成部分,服务器现在已经设置完成,而我们的应用也可交付使用。大家可以通过管理员用户身份查看日志,而普通用户也可通过对应域名经由HTTPS实现站点访问。

请对应用进行测试以确保其运行效果完全符合预期。

在后续教程当中,我们将了解如何为生产应用设置建立恢复规划:生产环境构建指南:Web应用——恢复规划

本文来源自DigitalOcean Community。英文原文:Building for Production: Web Applications — Deploying By Mitchell Anicas

翻译:diradw