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同步复制实现会话保持

相关推荐
增量星球1 分钟前
embedding专题之向量化革命:从关键词到语义检索
数据库·embedding
夕除1 分钟前
redis--008
java·jvm·数据库
AlanBruce9 分钟前
一键设备扫描功能详解
服务器·网络·网络协议·modbus·摩尔信使·设备扫描
烬羽10 分钟前
一个博客系统,为什么要拆成 6 张表?
数据库·mysql
程序员-Benothing12 分钟前
MySQL 中的日志类型有哪些?binlog、redo log 和 undo log 的作用和区别是什么?
数据库·mysql
烬羽12 分钟前
Dockerfile 是"做奶茶的配方"?用 todos 全栈项目看懂 Docker 构建与发布
nginx·docker·nestjs
XuCoder15 分钟前
你写的每条 SQL 都没加过锁,可 MySQL 凭什么不怕两个事务打架?
数据库·后端
mengge.cloud16 分钟前
Linux小白入门教程(基础命令篇)
linux·运维·服务器
TechExplorer36518 分钟前
Tomcat 下载与安装
java·tomcat
深念Y22 分钟前
局域网 HTTP 请求转发 502 问题排查记录
网络·网络协议·http·网络安全·代理·转发·中转