Nginx+Tomcat负载均衡、反向代理
目录
一、代理
1.概述
二、Nginx反向代理
1.七层反向代理 - 动静分离
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负载均衡如何实现会话保持
- ip_hash、url_hash、hash $remote_addr consistent
基于客户端IP或请求的URL路径将请求发送到同一个后端节点服务器来实现会话保持,但是此法容易出现负载失衡问题 - sticky_cookie_insert
基于cookie判断实现会话保持upstream backend { server IP1:PORT1; server IP2:PORT2; sticky_cookie_insert srv_id expires=浏览器中保持cookie的时间 domain=cookie的域名 path=cookie的路径; }
- 通过后端应用服务器自身机制,配合使用缓存数据库(redis、memcached等)为后端节点服务器做session同步复制实现会话保持