Nginx反向代理

1.Nginx负载均衡实现原理

Nginx 反向代理:将Nginx接收到的请求转发给其它应用服务器处理
Nginx 负载均衡:通过反向代理实现,还可以将nginx接收到的请求转发给多个后端应用服务器处理
Nginx 动静分离:静态页面请求,由nginx自行处理并响应;动态页面请求,则nginx通过反向代理转发给后端应用服务器处理


2.Nginx反向代理的类型

(1)七层反向代理

(1)基于http、https、mail等七层应用协议的代理转发(根据用户访问请求的URL路径来转发请求),通常用于 动静分离 等应用场景
配置:

1)在http配置块中使用upstream定义后端服务器列表名称和节点参数
http {
    upstream 服务器列表名称 {
        server IP1:PORT1 weight=1;
        server IP2:PORT2 weight=1;
        ......
    }


2)在server配置块中使用location匹配用户请求的动态页面的URL路径,使用 proxy_pass 基于协议代理转发
    server {
	    ......
	    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和端口来转发请求),通常用于做 网关访问入口的负载均衡器 等应用场景
1)编译安装时需要添加 stream 四层代理模块 ./configure --with-stream

2)在 http 配置块同层级,一般在 http 配置块上面添加 stream 配置块,在 stream 配置块里使用upstream定义后端服务器列表名称和节点参数以及使用server配置块定义监听端口和转发配置

stream {
    upstream 服务器列表名称 {
        server IP1:PORT1 weight=1;
        server IP2:PORT2 weight=1;
        ......
    }

    server {
	    listen IP:PORT;
		proxy_pass 服务器列表名称;
	}
}

http {....}

注:四层反向代理 比 七层反向代理 转发性能更高于;七层反向代理 比 四层反向代理 转发功能更多、更灵活

3.Nginx的负载均衡模式

在 upstream 配置块里设置

(1)nginx调度算法

调度算法
轮询(round robin、rr) 是nginx的默认调度模式,按照时间顺序逐一分配请求
加权轮询(weight round robin、wrr) 使用weight参数设置权重,weight值越高的节点被分配请求的概率越大
least_conn(最少连接、最小连接) 优先将请求分配给当前连接数最少的节点
ip_hash(源地址哈希) 根据客户端IP做hash缓存调度,会将请求分配给固定的一个节点
url_hash(目的地址哈希) 根据客户端请求访问的URL路径做hash缓存调度,会将请求分配给固定的一个节点。需要另外按照第三方模块支持
fair 优先将请求分配给响应时间最少的节点。需要另外按照第三方模块支持
random 随机分配请求
hash nginx全局变量 consistent 一致性hash算法,根据nginx全局变量的值来做hash缓存调度(比如 hash $remote_addr consistent 根据客户端ip做hash缓存调度,是ip_hash的加强版)

举例:

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

(2)Nginx负载均衡如何实现会话保持?

1)ip_hash 或 一致性hash算法    
基于客户端IP做hash缓存将请求发送给同一个后端节点服务器来实现会话保持,但是此方法容易导致负载失衡问题

2)sticky_cookie_insert        基于cookie来判断实现会话保持
    upstream backend {
    server ...... ;
    sticky_cookie_insert srv_id expires=浏览器中保持cookie的时间 domain=cookie的域名 path=cookie的路径;
    }
	
3)后端应用服务器自身通过相关机制设置,使用缓存数据库为后端节点服务器做session同步复制实现会话保持

posted @ 2024-06-14 10:57  无敌小鲁班  阅读(19)  评论(0编辑  收藏  举报