Nginx+Tomcat负载均衡、反向代理

目录

一、代理

1.概述

二、Nginx反向代理

[1.七层反向代理 - 动静分离](#1.七层反向代理 - 动静分离)

[2.四层反向代理 - 负载均衡](#2.四层反向代理 - 负载均衡)

三、Nginx负载均衡调度策略


一、代理

1.概述

代理:

指服务端和客户端之间架设的一层服务器。代理负责接受客户端的请求并将它转发给服务端,然后再将服务端返回的响应转发给客户端。

代理又分为正向代理和反向代理。

正向代理:

为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。

反向代理:

为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。

二、Nginx反向代理

1.七层反向代理 - 动静分离

七层反向代理:

基于http、https等七层应用协议的代理转发,可以根据用户的请求访问的URL路径来转发请求,通常用于动静分离等应用场景。

Nginx动静分离:

通过location匹配用户的访问路径来判断是动静态资源请求还是动态资源请求。静态资源请求就由Nginx自行处理并相应,动态资源请求则通过反向代理转发请求给后端应用服务器处理了。

配置:

1)在 http 配置块中使用 upstream 定义后端应用服务器池的名称和各个节点的参数
http {
    upstream 服务器池名称 {
        server IP1:PORT1 weight=1;
        server IP2:PORT2 weight=1;
        [调度策略;]
    }

2)在 server 配置块中使用 location 匹配用户请求的动态资源的URL路径,在 location 配置块里使用 proxy_pass 基于协议配置转发
    server {
	    listen 
        server_name
        .....
        location ~ .*\.jsp$ {
		    proxy_pass http://服务器池名称;
			 
            #还可以添加一些转发参数,用于为后端服务器获取真实的客户端地址
            proxy_set_header HOST $host;		
            proxy_set_header X_Real_IP $remote_addr;		
            proxy_set_header X_Forwarded_For $proxy_add_x_forwarded_for;		
		}		
    }

}

2.四层反向代理 - 负载均衡

四层反向代理:

基于IP端口实现的代理转发,可以根据用户请求的IP或端口来转发请求,通常用于做网络接入层的负载均衡器等应用场景。

Nginx负载均衡:

通过反向代理实现的,可以将Nginx反向代理服务器接收到的请求根据调度策略转发给多个后端应用服务器处理。

配置:

1)编译安装nginx时需要添加 stream 四层代理模块  ./configure --with-stream

2)在 http 配置块上面同层级添加 stream 配置块,在 stream 配置块里添加 upstream 配置块,使用 upstream 定义后端应用服务器池的名称和各个节点的参数
stream {
    upstream 服务器池名称 {
	    server IP1:PORT1 weight=1;
        server IP2:PORT2 weight=1;
        [调度策略;]
	}
	
3)在 stream 配置块里添加 server 配置块,在 server 配置块里使用 listen 定义监听地址和端口,使用 proxy_pass 配置转发
    server {
	    listen  IP:PORT;
        proxy_pass 服务器池名称;
	}
}

http {....}

三、Nginx负载均衡调度策略

  • 轮询:是nginx默认调度策略,按照时间顺序逐一分配请求
  • 加权轮询:使用weight参数设置权重,权重值越高的后端节点被分配请求的概率越大
  • least_conn(最少连接):优先将请求分配给当前连接数最少的后端节点
  • ip_hash:根据客户端IP做hash缓存调度,会将来自同一个IP的请求都分配给固定的一个后端节点
  • url_hash:根据客户端请求的URL路径做hash缓存调度,会将相同的URL路径的请求都分配给固定的一个后端节点。需要第三方插件模块支持
  • fair:优先将请求给给响应时间最少的后端节点。需要第三方插件模块支持
  • random:随机分配请求
  • hash $remote_addr consistent:一致性hash算法,根据nginx全局变量的值来做hash缓存调度

配置举例:

upstream 服务器池名称 {
    server IP1:PORT1   weight=权重  max_fails=最大的失败次数  fail_timeout=暂时服务的时间;
	.....
	least_conn;/ip_hash;/fair;/hash $request_uri;/random;
}

Nginx负载均衡如何实现会话保持

  1. ip_hash、url_hash、hash $remote_addr consistent
    基于客户端IP或请求的URL路径将请求发送到同一个后端节点服务器来实现会话保持,但是此法容易出现负载失衡问题

  2. sticky_cookie_insert
    基于cookie判断实现会话保持

    upstream backend {
        server IP1:PORT1;
        server IP2:PORT2;
        sticky_cookie_insert  srv_id   expires=浏览器中保持cookie的时间    domain=cookie的域名    path=cookie的路径;
    }
    
  3. 通过后端应用服务器自身机制,配合使用缓存数据库(redis、memcached等)为后端节点服务器做session同步复制实现会话保持

相关推荐
尘浮生3 分钟前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
威哥爱编程4 分钟前
SQL Server 数据太多如何优化
数据库·sql·sqlserver
小华同学ai6 分钟前
AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具
数据库·信息可视化·开源
明月看潮生23 分钟前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
Acrelhuang27 分钟前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
wowocpp34 分钟前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
萨格拉斯救世主1 小时前
jenkins使用slave节点进行node打包报错问题处理
运维·jenkins
川石课堂软件测试1 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
十叶知秋1 小时前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试
‍。。。1 小时前
使用Rust实现http/https正向代理
http·https·rust