2020-03-28 Nginx反向代理与动静分离集群架构应用实践(二)

1. Nginx负载均衡集群介绍

1.1 搭建负载均衡服务的需求

负载均衡集群提供了一种廉价、有效、透明的方法扩展网络设备和服务器的负载、带宽和吞吐量,同时加强了网络数据处理能力,提高了网络的灵活性和可用性。
搭建负载均衡服务的需求如下:
1)把单台计算机无法承受的大规模并发访问或数据流量分担到多台节点设备上分别进行处理,减少用户等待响应的时间,提升用户体验;
2)单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后将结束汇总,返回给用户,系统处理能力得到大幅度提高。
3)7×24小时的服务保证,任意一个或多个有限后面节点设备宕机,不会影响业务。
在负载均衡集群中,同组集群所有计算机节点都应该提供相同服务。集群负载均衡器会截获所有对该服务的入站请求。然后将这些请求尽可能平均地分配在所有集群节点上。

1.2 Nginx负载均衡集群介绍

1.2.1 反向代理与负载均衡概念简介

严格来说,Nginx仅仅是作为Nginx Proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果,所以称之为Nginx负载均衡。那么,反向代理和负载均衡有什么区别呢?
普通负载均衡软件,如大名鼎鼎的LVS,其实现的功能只是对请求数据包的转发(也可能会改写数据包)、传递,其中DR模式明显的特征是:从负载均衡下面的节点服务器来看,接收到的请求还是来自访问负载均衡器的客户端的真实用户,而反向代理就不一样了,反向代理接收访问用户的请求后,会代理用户重新向代理下的节点服务器发起请求,最后把数据返回给客户端用户,在节点服务器看来,访问节点服务器的客户端用户就是反向代理服务器了,而非真实的网站访问用户。
一言以弊之,LVS等的负载均衡是转发用户请求的数据包,而Nginx反向代理是接收用户的请求然后重新发起请求去请求其后面的节点。

1.2.2 实现Nginx负载均衡的组件说明

实现Nginx负载均衡的组件主要有两个,见下表。

Nginx负载均衡的组件模块

2. 快速实践Nginx负载均衡的环境准备

下图是快速实践Nginx负载均衡的逻辑架构图。

快速实践Nginx负载均衡的逻辑架构图

在上图中,所有用户的请求统一发到Nginx负载均衡器,然后由负载均衡器根据调度算法来请求Web01和Web02。

2.1 软硬件准备

(1)硬件准备
准备4台VM虚拟机,两台做负载均衡,两台做RS,如下表所示。

Nginx负载均衡实验环境准备

(2)软件准备
系统:CentOS7.6 x84_64。
软件:nginx-1.16.0.tar.gz(http://nginx.org/download/nginx-1.16.0.tar.gz

2.2 安装Nginx软件

下面将在以上4台服务器上安装Nginx。
1)安装依赖软件包命令集合:

yum install pcre pcre-devel openssl openssl-devel -y
rpm -qa openssl openssl-devel pcre pcre-devel

2)安装Nginx软件包命令集合:

#1. 下载nginx
mkdir -p /server/tools
cd /server/tools
wget http://nginx.org/download/nginx-1.16.0.tar.gz
ls -l nginx-1.16.0.tar.gz
#2. 解压安装Nginx
useradd -u 1111 -s /sbin/nologin nginx -M
tar xf nginx-1.16.0.tar.gz
cd nginx-1.16.0
./configure  --user=nginx --group=nginx --prefix=/application/nginx-1.16.0/ --with-http_stub_status_module  --with-http_ssl_module --with-pcre
make 
make install
ln -s /application/nginx-1.16.0/ /application/nginx
#3. 设置环境变量
echo 'PATH="/application/nginx/sbin:$PATH"' >> /etc/bashrc
. /etc/bashrc
echo $PATH

2.3 配置用于测试的Web服务

这里将在上面表中给出的两台Nginx Web服务器节点上进行操作:配置并查看Web服务器的配置结果。注意:如果原来已经有了配置,建议做个备份,这里主要讲解Nginx负载均衡,因为Web节点的配置越简单越好。以下要在Nginx Web01和Web02同时进行配置,这里以Web01为例进行演示。
1)配置文件如下:

[root@web01 ~]# cd /application/nginx/conf/
[root@web01 conf]# cp nginx.conf{,.ori}
[root@web01 conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    server {
    listen      80;
    server_name     bbs.etiantian.org;
    location / {
            root html/bbs;
            index index.html index.htm;
    }
    access_log logs/access_bbs.log main;
    }
    server {
        listen  80;
        server_name www.etiantian.org;
        location / {
            root    html/www;
            index   index.html index.htm;
        }
        access_log  logs/access_www.log main;
    }
}

提示:这里故意将WWW虚拟主机放在下面,便于用后面的参数配置测试结果。
2)配置完成后,建立站点目录、创建测试数据:

[root@web01 conf]# mkdir /application/nginx/html/{www,bbs}
[root@web01 conf]# echo "www7" >/application/nginx/html/www/index.html
---这里的7代表服务器IP
[root@web01 conf]# cat /application/nginx/html/www/index.html
www7
[root@web01 conf]# echo "bbs7" >/application/nginx/html/bbs/index.html
---这里的7代表服务器IP
[root@web01 conf]# cat /application/nginx/html/bbs/index.html
bbs7

3)检查Nginx语法,并启动Nginx服务:

[root@web01 conf]# nginx -t
nginx: the configuration file /application/nginx-1.16.0//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.16.0//conf/nginx.conf test is successful
[root@web01 conf]# nginx
[root@web01 conf]# netstat -lntup|grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7708/nginx: master

以上命令需要在Web01和Web02上操作。
4)在Web01配置解析Web01的IP和主机名后,用curl命令简单测试Web01:

[root@web01 conf]# tail -1 /etc/hosts
192.168.9.7 www.etiantian.org bbs.etiantian.org blog.etiantian.org etiantian.org
[root@web01 conf]# curl www.etiantian.org
www7
[root@web01 conf]# curl bbs.etiantian.org
bbs7

配置解析Web02的IP和主机名后,用curl命令简单测试Web02:

[root@web02 conf]# tail -1 /etc/hosts
192.168.9.9 www.etiantian.org bbs.etiantian.org blog.etiantian.org etiantian.org
[root@web02 conf]# curl www.etiantian.org
www9
[root@web02 conf]# curl bbs.etiantian.org
bbs9

提示
1)不同Web测试节点返回的结果是不同的,这是为了方便测试演示。
2)通过上面的配置就实现了两台Web服务器基于域名的虚拟主机配置。

2.4 实现一个简单的负载均衡

这里将在Nginx lb01服务器节点操作(lb02和lb01相同,后文配置负载均衡器高可用时会用到bl02),其准备信息见下表。

第一台Nginx负载均衡器准备信息

下面进行一个简单的Nginx负载均衡配置,代理www.etiantian.org服务,节点为Web01和Web02.nginx.conf配置文件内容如下:

[root@lb01 conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream www_pools {    ---这里是定义Web服务器池,包含了7、9两个Web节点
        server 192.168.9.7:80  weight=1;
        server 192.168.9.9:80  weight=1;
    }

    server {    ---这里是定义代理的负载均衡域名虚拟主机
        listen       80;
        server_name  www.etiantian.org;
        location / {
            proxy_pass http://www_pools;    ---访问www.etiantian.org,请求发送给www_pools里面的节点
        }
   }
}

检查语法并启动:

[root@lb01 conf]# nginx -t
nginx: the configuration file /application/nginx-1.16.0//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.16.0//conf/nginx.conf test is successful
[root@lb01 conf]# nginx
[root@lb01 conf]# netstat -lntup|grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7878/nginx: master

然后,检查测试结果。把负载均衡Linux作为客户端(可以选择任意客户端)的测试结果如下:

[root@lb01 ~]# tail -1 /etc/hosts
192.168.9.12 www.etiantian.org bbs.etiantian.org    ---192.168.9.12为负载均衡器的IP
[root@lb01 ~]# curl www.etiantian.org
bbs7
[root@lb01 ~]# curl www.etiantian.org
bbs9

下面宕掉任意一个Web节点,如Web02,再看看测试结果如何:

[root@lb01 ~]# curl www.etiantian.org
bbs7
[root@lb01 ~]# curl www.etiantian.org
bbs7

可以看到,网站业务不受影响,访问请求都定位到了正常的Web01节点上。
现在,宕掉所有Web节点,此时,访问测试结果如下:

[root@lb01 ~]# curl www.etiantian.org
<html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.16.0</center>
</body>
</html>

可以看到,Nginx代理下面没有节点了,因此,Nginx向用户报告了502错误。
如果同时开启所有的Web服务又会怎样?测试结果如下:

[root@lb01 ~]# curl www.etiantian.org
bbs7
[root@lb01 ~]# curl www.etiantian.org
bbs9
[root@lb01 ~]# curl www.etiantian.org
bbs7
[root@lb01 ~]# curl www.etiantian.org
bbs9

结果是Nginx又把请求一比一分配到了Nginx后面的节点上。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容