nginx负载均衡原理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx负载均衡原理相关的知识,希望对你有一定的参考价值。
参考技术A 负载均衡(Load Balance),它在网络现有结构之上可以提供一种廉价、有效、透明的方法来扩展 网络设备 和 服务器的带宽 ,并可以在一定程度上 增加吞吐量 、 加强网络数据处理能力 、提高 网络的灵活性 和 可用性 等。用官网的话说,它充当着网络流中“交通指挥官”的角色,“站在”服务器前 处理所有服务器端和客户端之间的请求 ,从而最大程度地 提高响应速率和容量利用率 ,同时 确保任何服务器都没有超负荷工作 。如果单个服务器出现故障, 负载均衡的方法会将流量重定向到其余的集群服务器,以保证服务的稳定性 。当新的服务器添加到服务器组后,也可通过负载均衡的方法使其开始自动处理客户端发来的请求。负载均衡涉及到以下的基础知识。
a. Round Robin: 对所有的backend轮训发送请求,算是最简单的方式了,也是默认的分配方式;
b. Least Connections(least_conn): 跟踪和backend当前的活跃连接数目,最少的连接数目说明这个backend负载最轻,将请求分配给他,这种方式会考虑到配置中给每个upstream分配的weight权重信息;
c. Least Time(least_time): 请求会分配给响应最快和活跃连接数最少的backend;
d. IP Hash(ip_hash): 对请求来源IP地址计算hash值,IPv4会考虑前3个octet,IPv6会考虑所有的地址位,然后根据得到的hash值通过某种映射分配到backend;
e. Generic Hash(hash): 以用户自定义资源(比如URL)的方式计算hash值完成分配,其可选consistent关键字支持一致性hash特性;
用户(浏览器)在和服务端交互的时候,通常会在本地保存一些信息,而整个过程叫做一个会话(Session)并用唯一的Session ID进行标识。会话的概念不仅用于购物车这种常见情况,因为HTTP协议是无状态的,所以任何需要逻辑上下文的情形都必须使用会话机制,此外HTTP客户端也会额外缓存一些数据在本地,这样就可以减少请求提高性能了。如果负载均衡可能将这个会话的请求分配到不同的后台服务端上,这肯定是不合适的,必须通过多个backend共享这些数据,效率肯定会很低下,最简单的情况是保证会话一致性——相同的会话每次请求都会被分配到同一个backend上去。
出问题的backend要能被及时探测并剔除出分配群,而当业务增长的时候可以灵活的添加backend数目。此外当前风靡的Elastic Compute云计算服务,服务商也应当根据当前负载自动添加和减少backend主机。
通常现代的网络服务者一个域名会关连到多个主机,在进行DNS查询的时候,默认情况下DNS服务器会以round-robin形式以不同的顺序返回IP地址列表,因此天然将客户请求分配到不同的主机上去。不过这种方式含有固有的缺陷:DNS不会检查主机和IP地址的可访问性,所以分配给客户端的IP不确保是可用的(Google 404);DNS的解析结果会在客户端、多个中间DNS服务器不断的缓存,所以backend的分配不会那么的理想。
转自 https://blog.csdn.net/weixin_43694144/java/article/details/84098906
Nginx——nginx作为负载均衡服务(负载均衡示例)
目录
一、nginx负载均衡的理解
1、nginx负载均衡原理
- nginx通过proxy_pass模块实现负载均衡,proxy_pass是代理模块的一个核心配置,把所有的客户端请求通过proxy_pass代理转发到后端一组服务器上。从而实现nginx的负载均衡。
2、nginx负载均衡图解
3、nginx负载均衡配置语法
(1)、proxy_pass 配置语法
- Syntax:proxy_pass URL; URL表示所有客户端请求请求到nginx代理服务器后,nginx代理服务器向原始服务器请求的url。URL格式:http://ip+端口/路径
- Default:—— 表示默认没有配置。
- Context:location; 表示需要在location块中。
(2)、upstream 配置语法
- Syntax:upstream name{…}; name表示服务的名称。
- Default:—— 表示默认没有配置。
- Context:http; 表示需要在http块中。
二、nginx负载均衡演示示例
1、lz虚拟机说明
ip | 说明 |
---|---|
192.168.3.10(已安装nginx) | 此虚拟机作为代理服务器 |
192.168.3.11(已安装nginx) | 此虚拟机通过nginx配置三个端口访问三个不同的页面(模拟三台虚拟机应用) |
2、配置192.168.3.11虚拟机(即模拟三台虚拟机应用服务器)
(1)分别在/opt/app/code1、code2、code3目录下创建index.html页面(模拟三台服务器分别对应的index页面)
-
/opt/app/code1/目录下创建index.html页面,内容如下:
<html lang="en"> <head> <meta charset="utf-8"> <title>server1</title> </head> <body style="background-color:red;"> <h1>server1</h1> </body> </html>
-
/opt/app/code2/目录下创建index.html页面,内容如下:
<html lang="en"> <head> <meta charset="utf-8"> <title>server2</title> </head> <body style="background-color:yellow;"> <h1>server2</h1> </body> </html>
-
/opt/app/code3/目录下创建index.html页面,内容如下:
<html lang="en"> <head> <meta charset="utf-8"> <title>server3</title> </head> <body style="background-color:blue;"> <h1>server3</h1> </body> </html>
(2)、编辑 nginx.conf 配置文件可以看到在/etc/nginx/conf.d/目录下可以创建子配置文件,如下图:
(3)在/etc/nginx/conf.d/目录下分别创建server1.conf、server2.conf和server3.conf三个配置文件(模拟三台服务器通过不同的端口访问对应目录下的index页面,即模拟三台服务三个不同的应用)
-
server1.conf配置文件内容如下:
server { listen 8001; #8001端口 server_name localhost; #ip地址 location / { root /opt/app/code1;#指定code1目录下的文件 index index.html index.htm; } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
-
server2.conf配置文件内容如下:
server { listen 8002; #8002端口 server_name localhost; #ip地址 location / { root /opt/app/code2;#指定code2目录下的文件 index index.html index.htm; } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
-
server3.conf配置文件内容如下:
server { listen 8003; #8003端口 server_name localhost; #ip地址 location / { root /opt/app/code3;#指定code3目录下的文件 index index.html index.htm; } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
(4)、启动nginx服务并从新加载配置文件
-
启动nginx服务
[root@localhost conf.d]# systemctl start nginx.service
-
检查配置修改的配置文件是否正确,返回successful表示配置文件修改无错
[root@localhost nginx]# nginx -t -c /etc/nginx/nginx.conf
-
重新加载nginx配置文件,并查看
[root@localhost conf.d]# nginx -s reload -c /etc/nginx/nginx.conf
-
查看本机启用nginx的端口
[root@localhost conf.d]# netstat -luntp|grep nginx
(5)、浏览器分别输入地址,访问模拟的三台服务器分别对应的index页面(即模拟三台服务三个不同的应用)
-
http://192.168.3.11:8001
-
http://192.168.3.11:8002
-
http://192.168.3.11:8003
3、配置192.168.3.10虚拟机(即代理服务器)
(1)、编辑 nginx.conf 配置文件可以看到在/etc/nginx/conf.d/目录下可以创建子配置文件,如下图:
(2)、在/etc/nginx/conf.d/目录下创建upstream_server.conf配置文件,内容如下:
upstream blance {#配置服务器的分别对应的应用ip和的端口
server 192.168.3.11:8001;
server 192.168.3.11:8002;
server 192.168.3.11:8003;
}
server {
listen 80; #80端口
server_name localhost; #ip地址
location / {#配置代理,名称与upstream后面追加的名称相同
proxy_pass http://blance;
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
(3)、启动nginx服务并从新加载配置文件
-
启动nginx服务
[root@localhost conf.d]# systemctl start nginx.service
-
检查配置修改的配置文件是否正确,返回successful表示配置文件修改无错
[root@localhost nginx]# nginx -t -c /etc/nginx/nginx.conf
-
重新加载nginx配置文件,并查看
[root@localhost conf.d]# nginx -s reload -c /etc/nginx/nginx.conf
-
查看本机启用nginx的端口
[root@localhost conf.d]# netstat -luntp|grep nginx
(4)、浏览器输入代理服务的访问地址http://192.168.3.10/,因为代理服务器的端口为80可以直接省略,依次刷新服务器,可以看到依次轮询访问对应的三个页面,如下图:
(5)至此,nginx负载均衡配置已结束。
以上是关于nginx负载均衡原理的主要内容,如果未能解决你的问题,请参考以下文章