Nginx 教程

Nginx 教程 Nginx 简介 Nginx 源码架构分析 Nginx 编译安装 Nginx(Tengine) 编译安装 Nginx(OpenResty) 编译安装 Nginx 配置简述 Nginx Docker 容器化配置

Nginx 核心配置指令

Nginx 核心配置指令 Nginx 配置文件 Nginx 进程配置指令 Nginx 端口监听:listen Nginx 主机名server_name Nginx 处理HTTP请求 Nginx 路由匹配规则:localhost Nginx 重定向配置:rewrite Nginx 根目录配置:root Nginx 访问路径别名:alias Nginx 文件判断:try_files Nginx 零复制:sendfile Nginx 日志记录配置

Nginx HTTP模块

Nginx 镜像模块 Nginx 请求头控制模块 Nginx IP访问控制模块 Nginx 用户cookie模块 Nginx 并发连接数限制模块 Nginx 首页处理模块 Nginx 请求频率限制模块 Nginx 页面缓存时间配置 Nginx gzip压缩及相关配置

Nginx Web服务

Nginx 静态资源服务器搭建 Nginx 文件下载服务器搭建 Nginx 伪动态SSI服务器 Nginx HTTPS服务器搭建 Nginx FastCGI模块配置简述 Nginx PHP服务器环境搭建 Nginx 基于FastCGI负载均衡 Nginx CGI网关接口 Nginx uWSGI模块配置 Nginx Python项目部署 Nginx 伪流媒体服务器搭建 Nginx HTTP2模块配置简述 Nginx WebDAV模块配置简述

Nginx 代理服务器

Nginx HTTP代理服务器 Nginx stream模块简述 Nginx TCP/UDP代理简述 Nginx 基于SSL的TCP代理服务器 Nginx gRPC代理服务器

Nginx 缓存

Nginx Web缓存配置 Nginx 代理缓存配置 Nginx Memcached 缓存模块 Nginx 反向代理缓存服务器配置 Nginx 客户端缓存控制

Nginx 负载均衡

Nginx 负载均衡模块 Nginx 负载均衡策略 Nginx 长连接负载均衡 Nginx upstream容错机制 Nginx upstream动态更新 Nginx TCP/UDP负载均衡

Nginx 日志管理监控

Nginx 日志分析简述 Nginx 访问日志配置 Nginx 错误日志配置 Nginx 日志归档配置 Nginx 日志分析工具 ELK Nginx 监控工具 Prometheus

Nginx 集群

LVS(Linux虚拟服务器)简介 Keepalived 配置简述 Nginx 集群负载搭建 Nginx 集群配置管理规划 Nginx 配置归档工具GitLab Nginx 配置修改工具Ansible Jenkins 安装与配置简述 Nginx 集群配置管理实例

Nginx 在 k8s 的应用

Kubernetes(k8s)系统简述 Kubernetes(k8s)集群部署 Kubernetes(k8s)网络通信 Nginx Ingress 简介 Nginx Ingress 安装部署 Nginx Ingress 配置映射 Nginx Ingress 注解


Nginx 集群负载(基于LVS和Keepalived)搭建

基于 LVS 和 Keepalived 的 Nginx 集群负载是使用 LVS 做传输层的负载均衡设备,将客户端请求从传输层负载到后端的多组 Nginx 集群,并由 Nginx 集群实现应用层负载均衡处理的多层负载均衡网络架构。Keepalived 通过文件配置的方式实现 LVS 的运行管理,并通过 VRRP 机制实现传输层负载的高可用,为 Nginx 集群提供高性能、高可用的负载应用。

Nginx 集群负载部署图如下图所示。
  • LVS 作为传输层负载均衡与接入路由对接,负责把数据包转发给后端的 Nginx 服务器。
  • LVS 选用 DR 转发模式,网络数据包在传输层被分发到 Nginx 服务器,并由 Nginx 经过本地路由返回给客户端。
  • LVS 对后端 Nginx 服务器集群选用加权轮询(wrr)的负载均衡调度策略。
  • Keepalived 通过 VRRP 协议组播通告状态信息,确保两台 LVS 服务器的高可用。
  • 当处于 MASTER 状态的 Keepalived 发生故障时,处于 BACKUP 状态的 Keepalived 切换为 MASTER 状态,负责与接入路由对接,把数据包转发给后端的 Nginx 服务器。
  • Keepalived 通过健康检测机制检测 Nginx 集群内每台 Nginx 服务器的健康状态。
  • Nginx 负责应用层负载均衡,完成客户端请求的负载、路由分流、过滤等操作。

Nginx 集群负载部署图
图:Nginx 集群负载部署图

1) Keepalived安装

Keepalived 在 CentOS 7 系统下使用 yum 安装即可。在 CentOS 7 系统下,LVS 已被集成到内核中,无须单独安装。

yum  -y install keepalived

systemctl enable keepalived

2) Keepalived配置

Keepalived 需要分别在两台 LVS 服务器上进行配置,主服务器上的 Keepalived 配置如下:
! Configuration File for keepalived

global_defs {
    notification_email {
      monitor@nginxbar.org                          # 发生故障时发送邮件告警通知的邮箱
    }
    notification_email_from admin@nginxbar.org      # 使用哪个邮箱发送
    smtp_server mail.nginxbar.org                   # 发件服务器
    smtp_connect_timeout 30
    router_id LVS_01                                # 当前设备路由ID为LVS_01
}

vrrp_instance VI_1 {
    state MASTER                                    # 初始路由状态为MASTER
    interface eth0                                  # VRRP绑定的本地网卡接口为eth0
    virtual_router_id 51                            # 虚拟路由器的VRID为51
    priority 100                                    # 当前设备的优先级是100
    advert_int 5                                    # VRRP组播的间隔时间是5s
    authentication {
        auth_type PASS                                      # 认证类型为PASS
        auth_pass 2222                                      # 认证密码为2222
    }
    virtual_ipaddress {
        192.168.21.155                                      # 虚拟服务器的VIP是192.168.21.155
    }
}

virtual_server 192.168.21.155 80 {                      # 虚拟服务器IP及端口
    delay_loop 6                                            # 健康检测间隔时间为6s
    lb_algo wrr                                             # 负载均衡调度算法为加权轮询
    lb_kind DR                                              # 转发模式为DR
    persistence_timeout 60                                  # 保持连接的超时时间为60s
    protocol TCP                                            # 负载均衡转发协议为TCP
    real_server 192.168.2.108 80 {                          # 真实服务器IP及端口
        weight 100                                          # 真实服务器权重为100
        notify_down /etc/keepalived/scripts/stop.sh         # 当真实服务器健康检测失败时执
                                                                # 行stop.sh脚本
        HTTP_GET {
            url {
                path "/healthcheck"                         # 指定要检查的URL的路径
                digest bfaa324fdd71444e43eca3b7a1679a1a     # 检测URL返回值的MD5计算值
                status_code 200                             # 健康检测返回状态码
            }
            connect_timeout 10                      # 连接超时时间为10s
            nb_get_retry 3                          # 重试3次确认失败
            delay_before_retry 3                    # 失败重试的时间间隔为3s
        }
    }
    real_server 192.168.2.109 80 {                  # 真实服务器IP及端口
        weight 100                                  # 真实服务器权重为100
        notify_down /etc/keepalived/scripts/stop.sh # 当真实服务器健康检测失败时执
                                                                # 行stop.sh脚本
        HTTP_GET {
            url {
                path "/healthcheck"                         # 指定要检查的URL的路径
                digest bfaa324fdd71444e43eca3b7a1679a1a     # 检测URL返回值的MD5计算值
                status_code 200                             # 健康检测返回状态码
            }
            connect_timeout 10                              # 连接超时时间为10s
            nb_get_retry 3                          # 重试3次确认失败
            delay_before_retry 3                    # 失败重试的时间间隔为3s
        }
    }
}
备份服务器上的 Keepalived 配置样例如下:
! Configuration File for keepalived

global_defs {
    notification_email {
      monitor@nginxbar.org                          # 发生故障时发送邮件告警通知
                                                                # 的邮箱
    }
    notification_email_from admin@nginxbar.org              # 使用哪个邮箱发送
    smtp_server mail.nginxbar.org                   # 发件服务器
    smtp_connect_timeout 30
    router_id LVS_02                                # 当前设备路由ID为LVS_02,此
                                                                # 处与主服务器配置不同
}

vrrp_instance VI_1 {
    state BACKUP                                    # 初始路由状态为BACKUP,此处
                                                                # 与主服务器配置不同
    interface eth0                                  # VRRP绑定的本地网卡接口为eth0
    virtual_router_id 51                            # 虚拟路由器的VRID为51
    priority 99                                     # 当前设备的优先级是99,此处
                                                                # 与主服务器配置不同
    advert_int 5                                    # VRRP组播的间隔时间是5s
    authentication {
        auth_type PASS                                      # 认证类型为PASS
        auth_pass 2222                                      # 认证密码为2222
    }
    virtual_ipaddress {
        192.168.21.155                              # 虚拟服务器的VIP是192.168.21.155
    }
}

virtual_server 192.168.21.155 80 {                      # 虚拟服务器IP及端口
    delay_loop 6                                            # 健康检测间隔时间为6s
    lb_algo wrr                                             # 负载均衡调度算法为加权轮询
    lb_kind DR                                              # 转发模式为DR
    persistence_timeout 60                                  # 保持连接的超时时间为60s
    protocol TCP                                            # 负载均衡转发协议为TCP
    real_server 192.168.2.108 80 {                          # 真实服务器IP及端口
        weight 100                                  # 真实服务器权重为100
        notify_down /etc/keepalived/scripts/stop.sh # 当真实服务器健康检测失败时执
                                                                # 行stop.sh脚本
        HTTP_GET {
            url {
                path "/healthcheck"                         # 指定要检查的URL的路径
                digest bfaa324fdd71444e43eca3b7a1679a1a     # 检测URL返回值的MD5计算值
                status_code 200                             # 健康检测返回状态码
            }
            connect_timeout 10                              # 连接超时时间为10s
            nb_get_retry 3                                  # 重试3次确认失败
            delay_before_retry 3                            # 失败重试的时间间隔为3s
        }
    }
    real_server 192.168.2.109 80 {                          # 真实服务器IP及端口
        weight 100                                          # 真实服务器权重为100
        notify_down /etc/keepalived/scripts/stop.sh # 当真实服务器健康检测失败时执
                                                                # 行stop.sh脚本
        HTTP_GET {
            url {
                path "/healthcheck"                         # 指定要检查的URL的路径
                digest bfaa324fdd71444e43eca3b7a1679a1a     # 检测URL返回值的MD5计算值
                status_code 200                             # 健康检测返回状态码
            }
            connect_timeout 10                              # 连接超时时间为10s
            nb_get_retry 3                                  # 重试3次确认失败
            delay_before_retry 3                            # 失败重试的时间间隔为3s
        }
    }
}
至此,高可用的 LVS 负载均衡就配置完成了。当主 LVS 服务器出现故障时,备份 LVS 服务器可以快速接管传输层网络数据的负载均衡工作,将数据包分发给后端的 Nginx 服务器集群。