【运维知识进阶篇】集群架构-Nginx七层负载均衡详解(一)

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 【运维知识进阶篇】集群架构-Nginx七层负载均衡详解

为什么要使用负载均衡

当我们的Web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台Web服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中,实现负载的分发。那么会大大提升系统的吞吐率、请求性能。

负载均衡简单介绍

我们将负载均衡称为SLB(Server Load Balance),Nginx就是SLB的一种,负载均衡的叫法有很多,还可以叫负载、Load Balance、LB,公有云中叫SLB(阿里云负载均衡)、QLB(青云负载均衡)、CLB(腾讯云负载均衡)、ULB(ucloud负载均衡),常见的负载均衡软件有Nginx、Haproxy、LVS,Nginx是七层负载,可以造伪四层,Haproxy是七层负载、LVS是四层负载。

负载均衡分七层和四层,七层从下到上分别是1.物理层、2.数据链路层、3.网络层、4.传输层、5.会话层、6.表示层、7.应用层,而四层负载均衡仅到传输层,所以说四层负载均衡速度更快,但是七层负载均衡更贴近于服务,http协议就是七层协议,我们可以用Nginx做会话保持、URL路径规则匹配、Head头改写等等,这些四层无法实现。本篇文章我们介绍Nginx的七层负载均衡。

Nginx负载均衡配置语法

Nginx实现负载均衡都需要用proxy_pass代理模块配置

Nginx负载均衡与Nginx代理不同,Nginx的一个location仅能代理一台服务器,而Nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池。

1、我们准备1台LB01作为负载均衡服务器(10.0.0.5;172.16.1.5)、2台Web服务器分别是Web01(10.0.0.7;172.16.1.7)、Web02(10.0.0.8;172.16.1.8)

2、在Web01和Web02分别配置Nginx,并创建测试代码文件

[root@Web01 ~]# cat /etc/nginx/conf.d/test.conf
server {
  listen 80;
  server_name test.koten.com;
  location /{
    root /code/test;
    index index.html;
  }
}
[root@Web01 ~]# mkdir -p /code/test
[root@Web01 ~]# echo 'Web01' > /code/test/index.html
[root@Web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@Web01 ~]# systemctl restart nginx
[root@Web02 ~]# cat /etc/nginx/conf.d/test.conf
server {
  listen 80;
  server_name test.koten.com;
  location /{
    root /code/test;
    index index.html;
  }
}
[root@Web02 ~]# mkdir -p /code/test
[root@Web02 ~]# echo 'Web02' > /code/test/index.html
[root@Web02 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@Web02 ~]# systemctl restart nginx

3、配置Nginx负载均衡

[root@LB01 ~]# vim /etc/nginx/conf.d/test_proxy.conf  #负载均衡配置文件
upstream node {
    server 172.16.1.7;
    server 172.16.1.8;
}
server {
    listen 80;
    server_name test.koten.com;
    location / {
        proxy_pass http://node;
        include proxy_params;
        }
}
~                                                                
~                                                                
~                                                                
[root@LB01 ~]# vim /etc/nginx/proxy_params  #负载均衡调用的模块信息
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
~                                                                
~                                                                
~                                                                
~                                                                
~                                                                
[root@LB01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@LB01 ~]# systemctl restart nginx

4、修改本地HOST文件并打开浏览器访问test.koten.com

刷新一下页面,显示Web02,意味着我们已经通过负载均衡访问到了Web02服务器。

Nginx负载均衡常见故障

Nginx负载均衡比较智能,如果一个服务器宕了,会自动访问下一个服务器,但是如果后台服务器没有宕而是返回错误,就需要我们增加一个负载均衡设置了,以保证如果出错能直接访问下一台,而不是返回错误。

proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
[root@LB01 ~]# vim /etc/nginx/conf.d/test_proxy.conf
upstream node {
    server 172.16.1.7;
    server 172.16.1.8;
}
server {
    listen 80;
    server_name test.koten.com;
    location / {
        proxy_pass http://node;
        include proxy_params;
        proxy_next_upstream error timeout http_500 http_502 http_
503 http_504; #这样如果报这些错误也会自动访问下一个服务器节点
        }
}
~                                                                
<inx/conf.d/test_proxy.conf" 14L, 274C written

Nginx负载均衡调度算法

这样的负载均衡,每刷新一下就是一次请求,一次请求就变一次访问的服务器,我们把这种负载均衡算法,称为轮询。常见的负载均衡算法有以下几种:

调度算法 概述
轮询 按时间顺序逐一分配到不同的后端服务器(默认)
weight 加权轮询,weight值越大,分配到的访问几率越高
ip_hash 每个请求按照访问的IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
url_hash 按照访问的URL的hash结果来分配请求,不同的URL定向到不同的后端服务器

least_conn

最少连接数,哪个机器连接数少就分发哪个

Nginx负载均衡轮询配置

upstream load_pass {
    server 10.0.0.7:80;
    server 10.0.0.8:80;
}

Nginx负载均衡权重轮询配置

upstream load_pass {
    server 10.0.0.7:80 weight=5;
    server 10.0.0.8:80;
}

Nginx负载均衡ip_hash配置

upstream load_pass {
    ip_hash;
    server 10.0.0.7:80 weight=5;
    server 10.0.0.8:80;
}
注意:不能和weight一起使用,因为一个IP下不止一台客户端,如果客户端都走相同代理,会导致某一台服务器连接数过多。

Nginx负载均衡后端状态

后端Web服务器在前端Nginx负载均衡调度中的状态

状态 概述
down 当前的服务器不参与负载均衡,一般用于停机维护
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后,服务器暂停时间
max_coms 限制最大的接收连接数

down测试

[root@LB01 ~]# vim /etc/nginx/conf.d/test_proxy.conf
upstream webs {
    server 172.16.1.7 down;
    server 172.16.1.8;
}
server {
    listen 80;
    server_name test.koten.com;
    location / {
        proxy_pass http://webs;
        include proxy_params;
        proxy_next_upstream error timeout http_500 http_502 http_
503 http_504;
        }
}
~                                                                
<inx/conf.d/test_proxy.conf" 14L, 279C written 
[root@LB01 ~]# systemctl restart nginx

浏览器访问test.koten.com刷新只显示Web02了

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
27天前
|
机器学习/深度学习 人工智能 运维
云架构不是养祖宗,智能运维教你省心又省钱
云架构不是养祖宗,智能运维教你省心又省钱
54 2
|
14天前
|
数据采集 运维 数据可视化
AR 运维系统与 MES、EMA、IoT 系统的融合架构与实践
AR运维系统融合IoT、EMA、MES数据,构建“感知-分析-决策-执行”闭环。通过AR终端实现设备数据可视化,实时呈现温度、工单等信息,提升运维效率与生产可靠性。(238字)
|
3月前
|
运维 监控 Cloud Native
从“守机器”到“写策略”——云原生架构把运维逼成了架构师
从“守机器”到“写策略”——云原生架构把运维逼成了架构师
62 1
|
2月前
|
运维 监控 安全
“没服务器了,那我这运维是白干了吗?”——无服务器架构对运维的冲击与转机
“没服务器了,那我这运维是白干了吗?”——无服务器架构对运维的冲击与转机
60 0
|
5月前
|
负载均衡 前端开发 应用服务中间件
Tomcat的负载均衡和动静分离(与nginx联动)
总的来说,负载均衡和动静分离是提高Web应用性能的两个重要手段。通过合理的配置和使用,我们可以让Web应用更好地服务于用户。
159 21
|
5月前
|
负载均衡 Java 应用服务中间件
Tomcat与Nginx的负载均衡与动静分离技巧
总的来说,Tomcat和Nginx各有各的优点,在负载均衡和动静分离这两方面它们都有很好的应用。灵活使用这两个工具能够让Web应用具有更好的扩展性和用户体验。
132 14
|
5月前
|
负载均衡 前端开发 JavaScript
LVS-DR模式、keepalived、Nginx与Tomcat合作,打造动静分离,高效负载均衡与高可用性
为了采用这样的架构,你需要对LVS-DR、Keepalived、Nginx与Tomcat有一定的理解和掌握,同时也需要投入一些时间去研究和配置,但是一旦你把它运行起来,你将会发现,这一切都是值得的。
180 11
|
6月前
|
Kubernetes 安全 应用服务中间件
IngressNightmare:Ingress Nginx 再曝5个安全漏洞,可接管你的 K8s 集群
是否还记得 2022 年 K8s Ingress Nginx 披露了的 3 个高危安全漏洞(CVE-2021-25745, CVE-2021-25746, CVE-2021-25748),并在那一年宣布停止接收新功能 PR,专注修复并提升稳定性。
|
7月前
|
运维 供应链 前端开发
中小医院云HIS系统源码,系统融合HIS与EMR功能,采用B/S架构与SaaS模式,快速交付并简化运维
这是一套专为中小医院和乡镇卫生院设计的云HIS系统源码,基于云端部署,采用B/S架构与SaaS模式,快速交付并简化运维。系统融合HIS与EMR功能,涵盖门诊挂号、预约管理、一体化电子病历、医生护士工作站、收费财务、药品进销存及统计分析等模块。技术栈包括前端Angular+Nginx,后端Java+Spring系列框架,数据库使用MySQL+MyCat。该系统实现患者管理、医嘱处理、费用结算、药品管控等核心业务全流程数字化,助力医疗机构提升效率和服务质量。
367 4
|
7月前
|
负载均衡 算法 应用服务中间件
Nginx长连接负载均衡详细说明以及案例
本文详细介绍了Nginx长连接负载均衡的配置与原理。长连接(Keepalive)允许客户端和服务器保持连接,减少建立和关闭连接的开销。Nginx支持多种负载均衡算法,如轮询、IP哈希等。通过在Nginx配置文件中使用`upstream`模块和`keepalive`指令,可以实现长连接负载均衡,从而提高系统的性能和响应速度。示例配置展示了如何设置后端服务器组、长连接数及HTTP/1.1协议,确保连接复用,降低延迟。
429 5