首页IT科技nginx负载均衡原理简介及其应用(Nginx之负载均衡upstream模块简介和使用)

nginx负载均衡原理简介及其应用(Nginx之负载均衡upstream模块简介和使用)

时间2025-06-14 23:32:09分类IT科技浏览6462
导读:一、upstream模块简介 Nginx的负载均衡功能依赖于ngx_http_upsteam_module模块,所支持的代理方式包括proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass和grpc_pass。ngx_h...

一              、upstream模块简介

Nginx的负载均衡功能依赖于ngx_http_upsteam_module模块              ,所支持的代理方式包括proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass和grpc_pass              。ngx_http_upstream_module模块有允许Nginx定义一组或多组服务组                     ,使用的可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应upstream组的名字上                     。upstream模块可以实现负载均衡       ,其实隐含了一个重要功能那就是冗余              ,在一个web节点故障的时候                     ,配置了upstream时可以自动切换到正常工作的节点       。

二                     、负载均衡算法简介

调度算法一般分为两类:第一类为静态调度算法       ,即负载均衡器根据自身设定的规则进行分配       ,不需要考虑后端节点服务器的情       。第二类为动态调度算法                     ,即负载均衡器会根据后端节点的当前状态来决定是否分发请求                     。

1       、轮询

rr 轮循即round robin 默认调度算法              ,静态调度算法              。客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器       ,这相当于 LVS 中的 rr 算法                     ,如果后端节点服务器宕机(默认情况下nginx 只检测80端口)       。宕机的服务器会自动从节点服务器池中剔除              ,以便客户端的用户访问不受影响                     。新的请求会分配给正产的服务器              。

2              、权重轮询

wrr即weight 权重轮循,静态调度算法。在 rr 轮循算法的基础上加上权重                     ,即为权重轮循算法                     ,当使用该算法时,权重和用户访问成正比              ,权重值越大                     ,被转发的请求也就越多                     。可以根据服务器的配置和性能指定权重值大小       ,有效解决新旧服务器性能不均带来的请求分配问题                     。

3                     、IP哈希

ip_hash是静态调度算法              ,每个请求按客户端 IP 的 hash 结果分配                     ,当新的请求到达时       ,先将其客户端IP通过哈希算法哈希出一个值       ,在随后的客户端请求中                     ,客户 IP 的哈希值只要相同              ,就会被分配至同一台服务器       ,该调度算法可以解决动态网页的 session 共享问题                     ,但有时会导致请求分配不均              ,即无法保证 1:1 的负载均衡,因为在国内大多数公司都是 NAT 上网模式                     ,多个客户端会对应一个外部 IP                     ,所以,这些客户端都会被分配到同一节点服务器              ,从而导致请求分配不均。LVS 负载均衡的 -P 参数       、keepalived 配置里的 persistence_timeout 50 参数都类似这个 Nginx 里的 ip_hash 参数                     ,其功能均为解决动态网页的 session 共享问题              。

4       、最小连接数

least_conn是动态调度算法       ,会根据后端节点的连接数来决定分配情况              ,哪个机器连接数少就分发                     。

5                     、最短响应时间

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

6              、url_hash算法

url_hash算法是动态调度算法                     ,按访问 URL 的 hash 结果来分配请求              ,使每个 URL 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率命中率       。(多用于后端服务器为缓存时的场景下)Nginx 本身是不支持 rul_hash的                     ,如果需要使用这种调度算法                     ,必须安装 Nginx 的hash 模块软件包                     。

三       、配置示例

1                     、配置示例模板

upstream backend { server backend1.example.com weight=5; #执行realserver,可以赋权重 server backend2.example.com:8080; server unix:/tmp/backend3; server backup1.example.com:8080 backup; #backup表示该节点为热备节点              ,激活节点失效时启用 server backup2.example.com:8080 down; #下线服务器                     ,可以在real服务器需要维护时配置 } server { listen 80; #listen              、server_name这些正常配置 server_name www.test.com; location / { proxy_pass http://backend; ##反向代理执行定义的upstream名字 } }

2、权重轮询配置示例

upstream show { server 192.168.0.141 weight=1; server 192.168.0.142 weight=2; }

3                     、ip_hash配置示例

upstream show { ip_hash; server 192.168.0.141 ; server 192.168.0.142 ; }

4                     、fair配置示例

upstream show { fair; server 192.168.0.141 ; server 192.168.0.142 ; }

5、least_conn配置示例

upstream show { least_conn; server 192.168.0.141 ; server 192.168.0.142 ; }

6              、url_hash配置示例

upstream show { server 192.168.0.141 ; server 192.168.0.142 ; hash $request_uri; hash_method crc32; }

四                     、负载均衡效果展示

1       、部署2个web服务器

分别在s142主机和s142主机部署2个Tomcat服务       ,服务访问页面内容如下:

2              、配置nginx服务

upstream show { ip_hash ; #使用ip_hash负载均衡调度算法 server 192.168.10.141:8080 ; server 192.168.10.142:8080 ; } server { listen 80; #listen                     、server_name这些正常配置 server_name www.test.com; access_log /var/log/nginx/test.access.log; location / { proxy_pass http://show; ##反向代理执行定义的upstream名字 } }

3       、配置域名解析

这是模拟测试              ,使用测试域名                     ,通过修改hosts文件(C:WindowsSystem32driversetchosts)实现直接通过域名访问       ,实际应用需要申请域名并解析              。

4       、访问域名验证

5                     、停止s142的web服务后再次访问

停止s142的web服务后应用自动切换到了s141节点       ,其实upstream模块可以作为负载均衡                     ,更重要的是实现冗余              ,如果是单机部署的web应用在出现节点故障时服务即无法访问       ,通过upstream可以实现多节点冗余       。

6              、修改调度算法为轮询

先自我介绍一下                     ,小编13年上师交大毕业              ,曾经在小公司待过,去过华为OPPO等大厂                     ,18年进入阿里                     ,直到现在                     。深知大多数初中级java工程师,想要升技能              ,往往是需要自己摸索成长或是报班学习                     ,但对于培训机构动则近万元的学费       ,着实压力不小              。自己不成体系的自学效率很低又漫长              ,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家                     ,初衷也很简单       ,就是希望帮助到想自学又不知道该从何学起的朋友       ,同时减轻大家的负担                     。添加下方名片                     ,即可获取全套学习资料哦

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
关于G笔(关于GBin1中文互联) 百度快速收录功能开通(Typecho百度收录插件:提升网站曝光度的绝佳利器)