Liuqichun's Blog

Nginx 负载均衡学习实践

Nginx 是一个高性能的静态资源、反向代理服务器,现在越来越多的互联网公司使用 Nginx 托管网站。还有一个出名的静态资源服务器——Apache:在 Nginx 没有出现之前,Apache 用的人很多;之后因后者功能及性能更加优秀,就被越来越多的人选择了。

Nginx 相较于 Apache 还具有反向代理的功能,同时在 IO 方面性能卓越。两者的详细区别可以参考以下两篇博客:

开始正文,这篇文章主要总结 Nginx 在负载均衡、反向代理、缓存等方面的实践。

代理、正向代理、反向代理

先说代理,代理就是加个中间层,现实中就是中介,这个中介可以帮客户(Client)做事情。基于代理可以做很多事情,缓存就是常见的应用场景。

关于正向代理和反向代理详细讲解的文章: https://www.cnblogs.com/taostaryu/p/10547132.html

nginx 负载均衡

负载均衡(load balance)是指把一部分业务负载分担到其他服务器,这样通过横向扩展的方式能提高系统的吞吐量和负载。

Nginx 负载均衡是一种简单的负载均衡技术:所有的请求打到 Nginx,然后 Nginx 再发出所有的响应。这种方式在吞吐量大的业务场景会成为业务系统瓶颈。解决的办法是使用 LVS(Linux Virtual Server),这种方式通过网络底层协议进行负载均衡,可以有效提高负载均衡器的吞吐量(LVS 是服务器端开发一块大的知识,因这篇文章总结的是 Nginx,不再详细介绍)。

nginx 单机负载均衡

实验环境:

1、实验准备,三台服务器

ip 及主机:

110.0.0.10 lb01 作为LB服务器
210.0.0.20 web01 作为web服务器1
310.0.0.21 web02 作为web服务器2

2、软件安装

在三台服务器都安装 Nginx,最简单的方式是通过 yum 安装,当然也可以编译安装。

这里使用 yum 安装。

1yum install -y nginx

安装完后还需要了解 Nginx 程序的一些信息:

3、配置两台 web 服务器(web01,web02)

这两个 Web 服务器不一定是 Web 服务器,也可以是代理后端的反向代理服务器。

3.1 启动服务

对三台服务器都做这个操作。

1# 启动服务
2systemctl start nginx
3# 或者, 前提环境变量配置好
4nginx

3.2 设置静态网页,以区分负载均衡代理的静态网页

1# nginx默认安装后,静态文件夹路径为 /usr/share/nginx/html
2# 切换到静态文件所在目录
3cd /usr/share/nginx/html
4
5# 把默认文件改为有标识内容
6echo "<h1>10.0.0.20 web01</h1>
7" > index.html

3.3 测试

在浏览器中访问,能显示“10.0.0.20 web01”。

image.png

3.4 web02 配置同上

4、配置负载均衡服务器(lb01)

4.1 在/etc/nginx/conf.d 文件夹中修改 default.conf

 1# 资源池
 2   upstream webpool {
 3        server 10.0.0.20:80 weight=5;
 4        server 10.0.0.21:80 weight=5;
 5
 6        server 10.0.0.22:80 weight=5 backup;
 7   }
 8# 站点
 9    server {
10        # 监听端口
11        listen       80;
12        # 站点名称
13        server_name  localhost;
14        # 站点资源文件夹路径
15        location / {
16            root /usr/share/nginx/html;
17            index index.html index.htm;
18            proxy_pass http://webpool;
19        }
20    }

4.2 重启并测试负载均衡

1# 重启
2systemctl restart nginx

测试效果

image.png

刷新浏览器后

image.png

5、upstream 参数

upstream 模块常用参数:

upstream 完整参数:nginx upstream 参数说明文档 · 中文

6、nginx 轮询算法

nginx 高可用负载均衡

使用 upstream 可以给被代理节点(后端服务)配置高可用:当后端服务访问不可用,或者在一定时间内未成功响应,则使用后备节点。

在原有的 nginx 配置上增加以下配置信息,lb02 拷贝 lb01 的配置。

1   upstream webpool {
2        # 正常工作的节点
3        server 10.0.0.20:80 weight=5;
4        server 10.0.0.21:80 weight=5;
5        # 备份节点
6        server 10.0.0.22:80 weight=5 backup;
7   }

如果要配置负载均衡 Nginx 的高可用,就需要额外的工具了。这里高可用方案是 nginx+keepalived:两台 Nginx 做负载均衡器,一主一备。

在使用 keepalived 做高可用后,此时访问 LB 服务器通过虚拟 IP 地址,即 VIP(Virtual IP)。当主 LB 宕机,利用 keepalived 进行 IP 地址漂移,来实现 failover。

这篇文章侧重实践,关于 keepalived 的详细内容可转到 https://www.jianshu.com/p/a6b5ab36292a

1、实验准备

准备四台服务器。

110.0.0.10 lb01 负载均衡主
210.0.0.11 lb02 负载均衡备
3
410.0.0.20 web01 web服务1
510.0.0.21 web02 web服务2

2、在两台 LB 服务器安装 keepalived

1yum install -y keepalived

3、配置

配置文件 /etc/keepalived/keepalived.conf

lb01 配置文件:

 1! Configuration File for keepalived
 2! 全局配置
 3global_defs {
 4    ! 出问题向那个邮箱报警
 5   notification_email {
 6     acassen@firewall.loc
 7   }
 8   ! 发件人是谁
 9   notification_email_from Alexandre.Cassen@firewall.loc
10   ! 邮件服务器的地址
11   smtp_server 192.168.200.1
12   ! 连接邮件服务器超时时间
13   smtp_connect_timeout 30
14   ! keepalived的编号, 不能相同, 与MySQL的server_id功能相同
15   router_id LVS_01
16   vrrp_skip_check_adv_addr
17   vrrp_strict
18   vrrp_garp_interval 0
19   vrrp_gna_interval 0
20}
21
22! keepalived的一个实例, 代表着一个服务, 一个ip地址
23! 通常配置一组高可用 state、priority 不同,其他都要相同
24vrrp_instance VI_1 {
25    ! 服务器状态
26    state MASTER
27    ! 使用的网卡,通信端
28    interface eth0
29    ! 实例的id,在一个高可用组中的要相同
30    virtual_router_id 51
31    ! 优先级, 影响结点选举master
32    priority 50
33    ! 心跳间隔, 单位:秒
34    advert_int 1
35    ! 服务器之间通信验证, 某组高可用结点它们的认证账号密码应该一样
36    authentication {
37        auth_type PASS
38        auth_pass 1111
39    }
40    ! VIP结点, virtual 结点, 可以是多个或一个
41    virtual_ipaddress {
42        10.0.0.30/24
43    }
44}

lb02 配置

配置文件不同点 :router_id、state、priority

 1! Configuration File for keepalived
 2! 全局配置
 3global_defs {
 4    ! 出问题向那个邮箱报警
 5   notification_email {
 6     acassen@firewall.loc
 7   }
 8   ! 发件人是谁
 9   notification_email_from Alexandre.Cassen@firewall.loc
10   ! 邮件服务器的地址
11   smtp_server 192.168.200.1
12   ! 连接邮件服务器超时时间
13   smtp_connect_timeout 30
14   ! keepalived的编号, 不能相同, 与MySQL的server_id功能相同
15   router_id LVS_01
16   vrrp_skip_check_adv_addr
17   vrrp_strict
18   vrrp_garp_interval 0
19   vrrp_gna_interval 0
20}
21
22! keepalived的一个实例, 代表着一个服务, 一个ip地址
23! 通常配置一组高可用 state、priority 不同,其他都要相同
24vrrp_instance VI_1 {
25    ! 服务器状态
26    state BACKUP
27    ! 使用的网卡,通信端
28    interface eth0
29    ! 实例的id, 在一个高可用组中的要相同
30    virtual_router_id 51
31    ! 优先级, 影响结点选举master
32    priority 150
33    ! 心跳间隔, 单位:秒
34    advert_int 1
35    ! 服务器之间通信验证, 某组高可用结点它们的认证账号密码应该一样
36    authentication {
37        auth_type PASS
38        auth_pass 1111
39    }
40    ! VIP结点, virtual 结点, 可以是多个或一个
41    virtual_ipaddress {
42        10.0.0.30/24
43    }
44}

4、启动两台 lb 服务器的 keepalived 程序

1# 启动
2systemctl start keepalived

在 lb01 上查看虚拟 ip 地址。

1# 查看虚拟ip--vip的信息, 应该看到10.0.0.30/24
2ip addr

image.png

在 lb02 上查看虚拟 IP 地址,正常应该看不到 10.0.0.30 的 IP 地址;只有当主宕机时,备份机(lb02)才会看到 10.0.0.30 这个 IP 地址。

1# 查看虚拟ip--vip的信息
2ip addr

image.png

5、测试

5.1 负载均衡器测试

image.png

5.2 关闭 lb01 再次进行测试

lb01 操作

1# 模拟宕机
2shutdown now -h

测试正常

image.png

image.png

查看 lb02 的 IP 地址,可以看到 10.0.0.30 这个 IP 地址已经漂移过来。此时 lb02 已经成为了负载均衡器的主节点(原来是备用节点)。

image.png

nginx 实现动静分离

所谓动静分离,即把动态请求(发向后端的)和静态资源请求分离开来,分别打到不同的反向代理节点上。

实现方式

  1. 根据请求路径,通过 Nginx 的 location 参数匹配分流
  2. 根据文件扩展名匹配分流
  3. 根据浏览器标识 user_agent(header)匹配分流

这些都通过设置 Nginx 的参数实现,即根据一定的规则匹配后,把不同的请求代理到不同的资源结点。

nginx 做缓存服务器

Nginx 也可以用来做缓存:第一次请求时的静态资源会保存在 Nginx 上,再次请求直接返回。

实现时通过配置 Nginx 的代理模块 http_proxy 参数即可。 ngx_http_proxy_module 模块参数

Nginx 做缓存服务器详细介绍文章: https://blog.csdn.net/weixin_30826095/article/details/97062677 https://www.cnblogs.com/Eivll0m/p/4921829.html

(完)

<< Previous Post

|

Next Post >>

#教程 #Nginx #负载均衡