使用反向代理代理服务
假设我们有三台服务器提供不同的服务
nginx作为代理服务器
代理服务器: 192.168.101.23
其余三台服务器
服务器1 192.168.101.18
服务器2 192.168.101.87
服务器3 192.168.101.20
代理服务器的nginix配置
server {
listen 8085;
server_name 127.0.0.1;
location /server1 { #根据请求路径路由到不同的服务中
proxy_pass http://192.168.101.18:9001/;
}
location /server2 {
proxy_pass http://192.168.101.87:9001/;
}
location /server3 {
proxy_pass http://192.168.101.20:9001/;
}
}
服务器:192.168.101.18
server {
listen 9001;
server_name localhost;
default_type text/html;
return 200 '<h1>192.168.101.18:9001</h1>';
}
服务器:192.168.101.87
server {
listen 9001;
server_name localhost;
default_type text/html;
return 200 '<h1>192.168.101.87:9001</h1>';
}
服务器:192.168.101.20
server {
listen 9001;
server_name localhost;
default_type text/html;
return 200 '<h1>192.168.101.20:9001</h1>';
}
浏览器测试
如果三台服务是一样的可以使用nginx的负载均衡
Nginx七层负载均衡
Nginx 实现七层负载均衡主要依赖于其 proxy_pass 代理模块。这个模块在 Nginx 的默认安装中通常是已经启用的,不需要进行额外的配置来启用它。
在 Nginx 中,负载均衡是通过反向代理实现的,具体来说,用户的请求会被根据指定的算法转发到一个由多个后端服务器组成的【upstream 服务器组】。以下是一些基本的步骤和配置示例。
upstream指令
该指令是配置文件中用来定义一组后端服务器的指令块。这个指令块允许你将请求分发到多个后端服务器,通常用于负载均衡和故障转移
语法 | upstream name {…} |
---|---|
默认值 | - |
位置 | http |
server指令
该指令用来指定后端服务器的名称和一些参数,可以使用域名、IP、端口或者unix socket。
语法 | server { … } |
---|---|
默认值 | 无默认值 |
位置 | upstream |
例如:
server {
listen 8085;
server_name 127.0.0.1;
location / {
proxy_pass http://backend;
}
}
upstream backend{ #定义一组后端服务器的指令块
server 192.168.101.18:9001; #server指令
server 192.168.101.20:9001;
server 192.168.101.87:9001;
}
下面使用upstream与server执行测试负载均衡
环境:三台服务器分别是192.168.101.18,192.168.101.20,192.168.101.87
三台服务器的nginx配置
192.168.101.18
server{
listen 9001;
server_name localhost;
default_type text/html;
return 200 '<h1>192.168.101.18:9001</h1>';
}
192.168.101.20
server{
listen 9001;
server_name localhost;
default_type text/html;
return 200 '<h1>192.168.101.20:9001</h1>';
}
192.168.101.87
server{
listen 9001;
server_name localhost;
default_type text/html;
return 200 '<h1>192.168.101.87:9001</h1>';
}
代理服务器设置
server {
listen 8085;
server_name 127.0.0.1;
location / {
proxy_pass http://backend;
}
}
upstream backend{
server 192.168.101.18:9001;
server 192.168.101.20:9001;
server 192.168.101.87:9001;
}
页面访问测试
负载均衡状态
代理服务器在负责均衡调度中的状态有以下几个:
down 当前的server暂时不参与负载均衡
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后, 服务暂停时间
max_conns 限制最大的接收连接数
down 该状态一般会对需要停机维护的服务器进行设置。
down:将该服务器标记为永久不可用,该代理服务器将不参与负载均衡。
upstream backend{
server 192.168.101.18:9001 down; #标记为不可用
server 192.168.101.20:9001;
server 192.168.101.87:9001;
}
访问测试
服务器只在两台之间轮询
backup
backup:将该服务器标记为备份服务器,当主服务器不可用时,该服务器将用来传递请求。
server {
listen 8085;
server_name 127.0.0.1;
location / {
proxy_pass http://backend;
}
}
upstream backend{
server 192.168.101.18:9001 down; #标记为不可用
server 192.168.101.20:9001 backup;
server 192.168.101.87:9001;
}
测试:
标记后无论刷新多少次都只有一台服务器可以用
模拟192.168.101.87不可用
使用防火墙关闭9001端口
访问测试
此时备用服务器192.168.101.20可以连接了
max_conns
max_conns=number:用来设置代理服务器同时活动链接的最大数量,默认为0,表示不限制,使用该配置可以根据后端服务器处理请求的并发量来进行设置。
设置最大连接数=10
server {
listen 8085;
server_name 127.0.0.1;
location / {
proxy_pass http://backend;
}
}
upstream backend{
server 192.168.101.18:9001 down;
server 192.168.101.20:9001 max_conns=10;
server 192.168.101.87:9001;
}
max_fails和fail_timeout
max_fails=number:设置允许请求代理服务器失败的次数,默认为1。
fail_timeout=time:设置经过max_fails失败后,服务暂停的时间,默认是10秒。
server {
listen 8085;
server_name 127.0.0.1;
location / {
proxy_pass http://backend;
}
}
upstream backend{
server 192.168.101.18:9001 down;
server 192.168.101.20:9001 backup;
server 192.168.101.87:9001 max_fails=3 fail_timeout=20;
}
模拟192.168.101.87:9001暂时不可用,关闭9001端口
测试 :快速失败超过3次后 ,将防火墙端口添加回来
负载均衡策略
nginx有如下六种负载均衡的算法
轮询 默认方式
weight 权重方式
ip_hash 依据ip分配方式
least_conn 依据最少连接方式
url_hash 依据URL分配方式
fair 依据响应时间方式
轮询
是upstream模块负载均衡默认的策略。每个请求会按时间顺序逐个分配到不同的后端服务器。轮询不需要额外的配置。默认weight=1。
server {
listen 8085;
server_name 127.0.0.1;
location / {
proxy_pass http://backend;
}
}
upstream backend{
server 192.168.101.18:9001 weight=1; #默认值,无论写不写都是weight=1
server 192.168.101.20:9001;
server 192.168.101.87:9001;
}
weight加权[加权轮询]
weight=number:用来设置服务器的权重,默认为1,权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所有此策略比较适合服务器的硬件配置差别比较大的情况。
server {
listen 8085;
server_name 127.0.0.1;
location / {
proxy_pass http://backend;
}
}
upstream backend{
server 192.168.101.18:9001 weight=10;
server 192.168.101.20:9001 weight=6;
server 192.168.101.87:9001 weight=2;
}
测试
访问次数
192.168.101.18 11
192.168.101.20 7
192.168.101.87 2
从结果看 87服务器是最少的访问量
18是最多的 其次是20
ip_hash
当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。这样,当来自某一个IP的用户在后端Web服务器A上登录后,在访问该站点的其他URL,能保证其访问的还是后端web服务器A。
server {
listen 8085;
server_name 127.0.0.1;
location / {
proxy_pass http://backend;
}
}
upstream backend{
ip_hash; # ip_hash设置
server 192.168.101.18:9001 weight=1;
server 192.168.101.20:9001 weight=1;
server 192.168.101.87:9001 weight=1;
}
访问测试
ip_hash的缺点是无法保证后端服务器的负载均衡,可能导致有些后端服务器接收到的请求多,有些后端服务器接收的请求少,而且设置后端服务器权重等方法将不起作用。
least_conn
使用最少连接数的服务器策略,把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
server {
listen 8085;
server_name 127.0.0.1;
location / {
proxy_pass http://backend;
}
}
upstream backend{
least_conn;
server 192.168.101.18:9001;
server 192.168.101.20:9001;
server 192.168.101.87:9001;
}
测试通过jmeter对18服务器施加压力测试
但是最终好像没什么效果 18服务器并没有因为连接过多而被减少连接。
url_hash
当使用 url_hash 时,Nginx 会根据请求的URL计算出一个哈希值,然后将这个哈希值映射到后端服务器,以此来实现负载均衡。这种方式可以确保具有相同URL的请求总是被分发到同一个后端服务器,从而提高缓存的一致性和效率。
upstream backend{
hash $request_uri;
server 192.168.101.18:9001;
server 192.168.101.20:9001;
server 192.168.101.87:9001;
}
测试 :只要uri不变则返回的地址也不会变
地址发生变更 负载均衡的服务器也会发生变化
fair
fair采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。要使用第三方模块的fair负载均衡策略需要添加nginx-upstream-fair模块。
安装成功后测试
没有什么复杂业务,看不出什么效果
对特定资源实现负载均衡
upstream videobackend{
server 192.168.101.18:9001;
server 192.168.101.20:9001;
}
upstream filebackend{
server 192.168.101.87:9001;
server 192.168.101.89:9001;
}
server {
listen 8084;
server_name localhost;
location /video/ { #通过指定路径负载均衡
proxy_pass http://videobackend;
}
location /file/ {
proxy_pass http://filebackend;
}
}
对不同域名实现负载均衡
upstream homebackend{
server 192.168.101.18:9001;
server 192.168.101.20:9001;
}
upstream homelandbackend{
server 192.168.101.87:9001;
server 192.168.101.89:9001;
}
server {
listen 8085;
server_name www.home.com;
location / {
proxy_pass http://homebackend;
}
}
server {
listen 8086;
server_name www.homeland.com;
location / {
proxy_pass http://homelandbackend;
}
}
实现带有URL重写的负载均衡
server {
listen 8086;
server_name 127.0.0.1;
location /file/ {
rewrite ^(/file/.*) /server /$1 last; #正则表达式说明:"^(/file/.*)"请求以file开头且"."转义后的"*"匹配任意后缀结尾 然后将地址重写到 /server location "/$1"表示前面括号的内容拼接到/server后面 "last"表示在当前的server重新查找location
}
location /server {
proxy_pass http://backend;
}
}
upstream backend{
#hash $request_uri;
fair;
server 192.168.101.18:9001;
server 192.168.101.20:9001;
server 192.168.101.87:9001;
}
测试