admin 管理员组

文章数量: 887021


2024年1月17日发(作者:网站怎么制作成二维码)

在Linux虚拟机中搭建Nginx服务器以及SSL、反向代理和负载均衡的实现

目录

一、

虚拟机下网络的网络配置 ........................................................................................ 2

1、

2、

3、

4、

二、

1、

2、

3、

4、

5、

6、

三、

1、

2、

3、

四、

1、

2、

Bridged模式 .............................................................................................................. 2

NAT 模式 ................................................................................................................... 3

host-only 模式:....................................................................................................... 4

作业环境网络拓扑图 ................................................................................................ 4

Nginx的安装与配置 .................................................................................................. 5

Nginx简介.................................................................................................................. 5

安装前的环境准备 .................................................................................................... 5

下载安装 .................................................................................................................... 6

控制Nginx服务 ......................................................................................................... 6

配置nginx .................................................................................................................. 7

负载测试 .................................................................................................................... 9

基于OpenSSL部署https网站 ................................................................................. 9

OpenSSL以及SSL/TLS协议简介: .......................................................................... 9

Linux下配置https ................................................................................................... 10

SSL/TSL协议分析 .................................................................................................... 12

用Nginx实现负载均衡和反向代理 ....................................................................... 15

反向代理的实现 ...................................................................................................... 15

负载均衡 .................................................................................................................. 18

一、 虚拟机下网络的网络配置

1、 Bridged模式

在桥接模式下,VMware虚拟机里的系统就像是局域网中的一台独立的主机,它可以访问同一个网段内任何一台机器,即可以相互ping通。

在桥接模式下,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。同时,由于这个虚拟系统是局域网中的一个独立的主机系统,就可以手工配置它的IP,DNS服务器,网关等信息,以实现通过局域网的网关或通过交换机访问外网。

图1

本地物理网卡和虚拟网卡通过虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位。

Vmware默认给虚拟系统提供了一个虚拟网卡(linux下默认为eth0设备),虚拟系统通过该网卡与外部通信。图中虚拟交换机由vmware提供,其默认设备名为 VMnet0。如图1所示。

2、 NAT 模式

NAT 即 Network Address Translation 缩写,即网络地址转换,由 NAT服务完成,在vmware里默认为VMnet8虚拟交换机,它将虚拟系统的IP地址转换成宿主机的IP地址,从而借用宿主机访问其他主机。使用NAT模式,也可以让虚拟系统通过宿主机器所在的网络来访问公网。

在这种模式下,虚拟系统是不能被LAN内其他PC访问的(宿主机可以,稍后讲),只能虚拟机以宿主机的名义访问LAN内的计算机。默认情况下NAT模式的虚拟系统的TCP/IP配置信息由VMnet8(NAT)虚拟网络的DHCP服务器提供,因此采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。

图2

VMware Network Adepter VMnet8虚拟网卡的作用就是为主机和虚拟机的通信提供一个接口,即使主机关闭该网卡,虚拟机仍然可以连接到Internet,但是主机和虚拟机之间就不能互访了,还有访问局域网内的其他计算机,也是通过NAT服务实现。如图2所示

3、 host-only 模式:

在Host-Only模式下,虚拟系统所在的虚拟网络是一个全封闭的网络,它唯一能够访问的就是宿主机。其实Host-Only网络和NAT网络很相似,不同的地方就是Host-Only网络没有NAT服务,所以虚拟网络不能连接到Internet,即虚拟系统无法上网。在host-only模式中,所有(Vmware创建的多个虚拟系统)的虚拟系统是可以相互通信的,当然在NAT模式下也可以,但虚拟系统和真实的网络是被隔离开的,主机和虚拟机之间的通信是通过VMware

Network Adepter VMnet1虚拟网卡来实现的。如图3所示。

图3

4、 作业环境网络拓扑图

如图4,nginx做服务器的前端,提供反向代理和负载均衡;两台apache服务器(linux

debian发行版自带,可直接使用)做后端的web服务器,提供具体的web服务;从宿主主机的浏览器来进行访问实验。整个网络使用虚拟机提供的NAT模式。

宿主主机操作系统为window7,服务器均为 Linux debian 3.13.7,虚拟机软件为VMware Workstation 10.0.1。

图4

二、 nginx的安装与配置

1、 Nginx简介

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP 代理服务器。Nginx是由 Igor Sysoev为俄罗斯访问量第二的 站点开发的。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。由于其较高的性能,现在的市场占有率已达到第三。

特点:

 支持高并发连接,对静态页面处理速度快

 内存消耗少,轻量级

 成本低廉,开源

 可扩展性强,有丰富的模块

2、 安装前的环境准备

 由于nginx是由C编写的,所以要安装gcc 编译器,不过一般发行版都已安装

 由于nginx会使用正则表达式语法库,所以要安装PCER。

 由于nginx要用到gzip压缩算法,所以要安装zlib库

 本次实验需要实现SSL,所以安装openssl

3、 下载安装

在debian下可以使用其强大的包管理工具apt-get install nginx从其软件库实现一步安装,但是无法自定义配置模块,所以在这里我们进行手动安装。

I. 从官网下载最新的稳定版,目前为1.6.0,并解压。

II. 配置,可以选择安装路径,选上自己需要的可选模块,配置安装后无法更改。

III. 编译安装

4、 控制Nginx服务

在nginx安装目录的 sbin下为我们提供了可执行的nginx控制文件,在这里我们要制作一个init脚本并将其添加为系统文件,使其能随着系统自己启动。

I. 制作init脚本。进入nginx的官方wiki——/InitScripts,找到自己发行版的脚本,然后编辑/etc/init.d/nginx 然后插入所选的脚本,注意在脚本中的DAENOM变量一定要替换为自己nginx控制文件的路径。其他可以默认或根据情况修改。

DAEMON=/usr/local/nginx-1.6.0/sbin/nginx

II.

III.

因为新建的脚本只有读写权限,所以要为其添加可执行权限

将制作好的init脚本添加为系统级别初始化脚本

5、 配置nginx

由于nginx为我们提供了比较详尽的配置实例,所以我们只需要在其基础上修改添加就行了,编辑nginx配置文件(位于/usr/local/nginx/conf/)。其体系结构如图5。

图5

在这里先介绍一下nginx的三大基本模块,具体配置见图6。

 核心模块——基本特征和指令,例如进程管理和安装

 事件模块——用于网络配置

 配置模块——提供包含机制

在图6中前5行为核心模块,包括使用的用户和用户组、worker进程数和优先级、对多核CPU的使用等。events为事件模块,包括进程最大连接等。配置模块用于include其他配置文件,用于减少主配置文件的复杂度。

图6

在本次实验中,其实我们更关心的是http模块。在这里先简介一下http模块的结构。在图5中我们可以看到http模块可以分为三个区段——http,server,location。其中一个http可以包含多个server,一个server又可以包含多个location 。并且具有继承的关系。

 http用于定义一些适用于全局server的指令和插入相关模块区段。

 server用于声明一个站点,并且在此区段中使用自己的配置。

 location用于找到网站的一个特定的位置,可根据设定正则表达式来与请求的url相匹配从而决定怎样响应请求。

其具体配置见图7,其中http区段说明了要包含的mime 类型和默认的类型,连接超时时间和是否使用gzip压缩算法等,这些都会继承到server中。而server包含了站点的主机名和监听的端口号等。location则定义了请求的url会返回那个页面。

图7

6、 负载测试

注:虚拟环境不反映生产环境中的能力

三、 基于OpenSSL部署https网站

互联网的通信安全,建立在SSL/TLS协议之上。不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。

 窃听风险(eavesdropping):第三方可以获知通信内容。

 篡改风险(tampering):第三方可以修改通信内容。

 冒充风险(pretending):第三方可以冒充他人身份参与通信。

SSL/TLS协议是为了解决这三大风险而设计的,希望达到:

 所有信息都是加密传播,第三方无法窃听。

 具有校验机制,一旦被篡改,通信双方会立刻发现。

 配备身份证书,防止身份被冒充。

1、 OpenSSL以及SSL/TLS协议简介:

 OpenSSL

OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。

作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

 SSL/TSL

互联网是开放环境,通信双方都是未知身份,这为协议的设计带来了很大的难度。而且,协议还必须能够经受所有匪夷所思的攻击,这使得SSL/TLS协议变得异常复杂。互联网加密通信协议的历史,几乎与互联网一样长。

1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。

1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。

1996年,SSL 3.0版问世,得到大规模应用。

1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。

2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年TLS 1.2的修订版。

2014年发现心脏滴血漏洞,波及整个互联网。

目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。但是,主流浏览器都已经实现了TLS

1.2的支持。

TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。

2、 Linux下配置https

Linux下安装openssl组件

sudo apt-get openssl

使用openssl生成密钥

使用openssl生成证书请求

第2个命令是生成证书请求,会提示输入省份、城市、域名信息等,重要的是,email一定要是你的域名后缀的。这样就有一个csr文件了,提交给ssl提供商的时候就是这个csr文件

拷贝不需要密码的密钥文件

签发证书

第三步拷贝密钥文件,服务器重启是不需要再重新输入密码当然我这里并没有向证书提供商申请,而是在第4步自己签发了证书。

将证书和密钥的路径配好开启443https端口

浏览器访问站点

重启服务器之后就能访问https站点

自行颁发的SSL证书能够实现加密传输功能,但浏览器并不信任,会出现以下提示:

要获取受浏览器信任的证书,则需要到证书提供商处申请。证书授证中心,又叫做CA机构,为每个使用公开密钥的用户发放一个数字证书。浏览器在默认情况下内置了一些CA机构的证书,使得这些机构颁发的证书受到信任。

信任证书之后就可以直接访问加密之后的网站了

3、 SSL/TSL协议分析

SSL/TLS协议的基本握手过程是这样的:

 客户端向服务器端索要并验证公钥

 双方协商生成"对话密钥

 双方采用"对话密钥"进行加密通信

SSL/TSL握手过程通过Wreshark抓包如图所示:

 客户端发出请求(ClientHello)

在这一步,客户端主要向服务器提供以下信息。

(1)支持的协议版本,比如TLS 1.0版。

(2)一个客户端生成的随机数,稍后用于生成"对话密钥"。

(3) 支持的加密方法,比如RSA公钥加密。

(4) Cipher Specs字段是一个枚举类型,说明了客户端所支持算法,每个Cipher Spec指定了一个加密组合,从上图以看出,SSL与TLS的很显著的区别就是,TLS支持了更多更先进更安全的加密组合。

 服务器回应(SeverHello)

向客户端传送SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。

Random是服务端产生的随机数,根据一个随机种子生成,这里的随机种子是gmt_unix_time,根据这个时间,使用伪随机数函数(PRF)生成一个32字节的random_bytes

Session ID是一组任意字节数的序列,由server选出,用于识别连接是活动状态还是可恢复状态。Cipher Suite指定了服务端选定的加密组合,这里选出的加密组合是

TLS_RSA_WITH_3DES_EDE_CBC_SHA

Compress Method表明了使用的压缩算法这里为空

服务端返回了证书,证书使用x.509格式,供客户端验证其身份

 客户端回应

客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。

 服务器的最后回应

服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息:

(1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。

(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。

 HTTPS与HTTP对比

左侧为使用SSL加密协议后的传输数据,右侧为普通HTTP协议传输的数据,通过对比可以看出加密后的效果。

四、 用nginx实现负载均衡和反向代理

1、 反向代理的实现

首先先简单介绍一些反向代理与一般代理(即正向代理)的区别

(1).正向代理的概念

正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

结论就是,正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才

能使用正向代理。

(2).反向代理的概念

例用户访问 /readme,但上并不存在readme页面,他是偷偷从另外一台服务器上取回来,然后作为自己的内容返回用户,但用户并不知情。这里所提到的 这个域名对应的服务器就设置了反向代理功能。

结论就是,反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

(3).两者区别

 从用途上来讲

正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。

 从安全性来讲:

正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。

网络环境:前端 nginx 192.168.59.132

后端 apache web server 192.168.59.133

宿主主机/浏览器 192.168.59.1

I. 配置IP和域名映射

由于主机上没有DNS功能,所以要想通过域名访问服务器,要配置hosts文件(一个在本机上完成域名和IP地址映射文件),win7的位置在c:WindowsSystem32driversetchosts,debian位于/etc/hosts,在此文件中添加一行,即要访问的服务器的IP地址和域名。由于我的宿主主机为win7,所以在c:WindowsSystem32driversetchosts中添加:

然后用ipconfig /flushdns刷新dns缓存,并用ipconfig /displaydns查看,发现配置成功。

II. 正向代理的实现

在配置文件中站点的location区段中加入代理指令proxy_pass,填入被代理的服务器的IP地址。

重启服务器,在宿主主机的浏览器根据域名访问代理服务器,发现可以访问到后端web服务器,正向代理成功。

使用wireshark抓包发现被代理的服务器无法知道是谁在访问自己。

III. 反向代理的实现

在location区段中添加proxy_set_header指令,此指令会将远端客户的IP地址封装到X-Real-IP变量中,然后传给后端的web服务器。

在后端服务器apache的配置文件(/etc/apache2/conf/)中的LogFormat记录格式中远端主机%h改为%{X-Real-IP}i,这这样后端服务器便可接受用户的IP地址而不是代理服务器的了。

改为

重启服务器,再次访问并抓包,发现后端服务器可以通过X-Real-IP字段知道是主机192.168.59.1在访问自己了。

2、 负载均衡

负载均衡用来在多个计算机、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。使用带有负载均衡的多个服务组件,取代单一的组件,可以通过冗余提高可靠性。

目前用分布式集群服务器代替单一大型服务器已是趋势,而负载均衡能使这种集群式服务器的优势得以充分发挥,nginx作为一台轻量级的服务器能很好的完成负载均衡的工作。

Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方调度算法。

 轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。

 ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。

 fair。这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。

 url_hash。此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。

在这里我们实现了前两种算法。

网络环境:前端 nginx 192.168.59.132

后端 apache web server_1 192.168.59.133

apache web server _2 192.168.59.134

I.

宿主主机/浏览器 192.168.59.1

轮询式的实现

在配置文件中站点server区段前加入负载均衡upstream区段,并填入后端服务器的IP地址和权值,在这里将第二台的权值设为第一台的2倍。

同时修改server中的location区段,将其代理指令的值改为负载均衡区段的名字webs。

重启服务,在宿主主机的浏览器中连续访问15次,为了区分访问到的服务器,将两台后端的服务的页面修改的略有不同,如图8,左边的代表访问到了第一台后端服务器,右边代表访问到了第二台。

图8

根据统计,发现15次中有5次访问到第一台,10次访问到第二台,即符合取值比1:2

通过查看web server_1的日志文件,发现确实有5次访问。(第一条日期不是今天的)

通过查看web server_2的日志文件,发现确实有10次访问。

此外,nginx的负载均衡还可以配置备用服务器,当其他的服务器无法工作时,备用服务器就会出来“救场”,使服务的可用性大大增强,下面我们来配置这个功能。

在upstream区段中加入backup服务器,在这里配置的是nginx本机的8081端口,并在站点之外再配置一个监听本地8081端口的server区段。将两个后端服务器停止。

此时在通过宿主主机的浏览器访问,发现访问的页面不是apache的了,而是备用服务器的页面

II.

ip_hash式的实现

由于轮询式的负载均衡用户访问不在同一个服务器上,所以在同步session上有很大的问题。而ip_hash则是通过ip的hash值给用户分配一个固定的服务器,所以很好解决了这个问题。而实现ip_hash也十分简单,只要在原来的upstream区段上加上ip_hash指令便可以了,但是要注意,此时的backup服务器就无法使用了(因为已经绑定到固定的服务器了),所以要注释掉。

重启服务器,并开启两个后端,不管怎么刷新都是访问的第一个网页

注意:在实验测试时,更改配置后,如果访问时仍是原来的页面,可能需要清除浏览器的缓存后再刷新页面才能显示新的页面。

五、 分工和参考文献

组员分工:阿克伟

 虚拟机下网络的网络配置

 基于OpenSSL部署https网站

陈于堃

 Nginx的安装与配置

 用Nginx实现负载均衡和反向代理

参考文献

1. 学习Nginx HTTP Server (中文版),清华大学出版社,(法)clement Nedelcu 著

2. /相关文档

3. /art/201004/ nginx专题相关文章


本文标签: 服务器 访问 代理 证书 客户端