Nginx之会话管理解读

2023-09-21 08:40:08

目录

session概念

问题引进

Nginx_hash高级负载均衡

ip_hash

 hash $cookie_xxx

 hash $request_uri

 补充知识点:服务器扩容


session概念

Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。

问题引进

集群模式下,里面会含有多个服务器,而客户端在某个时刻访问哪个服务器是由负载均衡器决定的,这里就产生了一个问题如果一个用户的Session信息如果存储在一个服务器上,那么当负载均衡器把用户的下一个请求转发到另一个服务器上,由于服务器上没有用户的session信息,那么该用户就需要重新进行登录操作,或者是在某一个服务器上时创建的重要session信息将丢失。

纯 ip hash 像局域网内的访问ip 访问会导致ip倾斜 

Nginx_hash高级负载均衡

ip_hash

ip_hash 可以保证用户访问可以请求到上游服务中的固定的服务器,前提是用户ip没有发生更改。

ip_hash是一个算法,原理很简单,根据请求所属的客户端IP计算得到一个数值,然后把请求发往该数值对应的后端。也就是同一个客户端的请求,会发往同一台后端,所以可以达到保持会话的效果。

不同的ip地址经过ip_hash后生成不同的hash值,同一个ip经过ip_hash后会是同一个值,比如两台服务器的话,值%2取余就可以打到固定的机器上了。 ​

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

不能把后台服务器直接移除,只能标记down. 

 该配置适合中小型公司使用,如果是大型项目的话,不太适合。如果后台服务器挂一台,回话就会中断,又需要重新登录,之前的回话保持的数据都消失了,用户体验和安全性不太好。

 hash $cookie_xxx

$cookie_xxx:是指cookie里的变量。

upstream iphashserver {

        hash $cookie_grafana_session;
        server www.test.com:8002;
        server www.test.com:8003;

    }

cookie_grafana_session:请求携带grafana_session一样的就会分发到同一台服务器上面

同理也可以设置php里的sessionID或者Tomcat里的jsessionid,可以达到保持回话的目的。

ip_hash和cookie_jsessionid的什么区别:一个局域网,大家都接到了同一个路由器上,去请求一个服务器的时候,服务器只会认为你们是同一个ip打过来的,都是路由器的ip(网关),所以都会把流量分发到同一台机器,这个时候后台服务器负载就不均衡了。后者是更具回话sessionId做的hash的,这样会平均打倒后端服务上。

 在upstream 里面配置 hash 的方式 使用 cookie_jsessionid 去做hash

#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
 
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    #gzip  on;
   
    upstream backend {
        # 指定hash 方式是 cookie_jessionid nginx自带的方式
        hash $cookie_jsessionid;
        server 172.16.225.1:8081;
			  server 172.16.225.1:8080;
    }
 
    server {
        listen       80;
        server_name  localhost;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location / {
            # 指定负载到后端upstream
	    			proxy_pass http://backend;  
        }
 
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
 
}

 hash $request_uri

原理:请求同一个uri会打到同一个服务器上。(uri:指的是完整的url除了域名部分的后半段)

 upstream iphashserver {

        hash $request_uri;
        server www.test.com:8001;
        server www.test.com:8002;

    }

 补充知识点:服务器扩容


1、硬件扩容
简介:也叫纵向扩容。简单来讲就是通过增加和改价硬件的方式来换取服务器的高性能。比如说买块内存条,换个ssd。

瓶颈:一直扩容下去也是有瓶颈的,比如主板只能支持100G的内存,你插再大的内存条也不管事,主板不支持,所以得再叠加水平扩容。

2、水平扩容
简介:通过集群的方式来提高服务器的性能。

更多推荐

Elastic Stack 8.10:更简单的跨集群搜索和身份验证等等

作者:TylerPerkins,GiladGal,ShaniSagiv,GeorgeKobar,MichaelPeterson,ArisPapadopoulosElasticStack8.10增强了跨集群和向量搜索、数据摄取、Kibana®和云注册。配置远程搜索时获得更大的灵活性,并提供更多信息来分类问题,从而促进跨集

演示spring AOP的切入表达式重用和优先级问题以及怎么实现基于xml的AOP

😀前言本篇的Spring-AOP系类文章第五篇讲解了演示springAOP的切入表达式重用和优先级问题以及怎么实现基于xml的AOP🏠个人主页:尘觉主页🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉在csdn获奖荣誉:🏆csdn城市之星2名⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣

王江涛十天搞定考研词汇

学习目标:考研词汇学习内容:2023-9-17第一天考研词汇学习时间:2023-9-17学习产出:Aintellect智力;知识分子intellectual智力的;聪明的intellectualize使...理智化,对...做理性探索contempt轻视,蔑视contemptible可鄙的,可轻视的contemptuo

【企业级SpringBoot单体项目模板】 —— 全局配置

😜作者:是江迪呀✒️本文关键词:SpringBoot、模版、企业级☀️每日一言:你坚持下来了,而别人坚持不下来,这就是你的资本。文章目录一、全局异常配置1.1全局异常处理1.2处理业务异常类1.3状态码枚举类1.3使用二、返回体配置2.1返回体类2.2抽象controller2.3使用上回我们创建了一个SpringB

XC3420B 低压降压IC 5V降3.3V 大电流降压IC 开关频率1.5MHZ

XC3420B是一个1.5MHz的恒定频率,电流模式降压转换器。它非常适合需要单节鲤离子电池提供高达2A电流的便携式设备,同时在峰值负载条件下仍能实现90%以上的效率。XC3420B也可以运行在100%的低压差操作占空比,延长便携式系统的电池寿命,而轻载操作提供了非常低的输出纹波噪声敏感的应用。XC3420B可提供高达

在月球上看地球和太阳是怎么转的?

文章目录参数初始化运动模型绝对坐标系以太阳和地球为中心以月球为坐标原点参数初始化众所周知,地球围绕太阳转,月球围绕地球转。但在地球上看,月亮和太阳都绕着地球转,那么如果我们是土生土长的月球人,我们看到的是谁绕着谁转呢?日地月就是典型的三体系统,其中太阳质量为1.989×1030kg1.989×10^{30}kg1.98

三维模型3DTile格式轻量化在网络传输中的重要性分析

三维模型3DTile格式轻量化在网络传输中的重要性分析三维模型3DTile格式轻量化在网络传输中扮演了至关重要的角色。随着数字化和虚拟化技术的发展,越来越多的应用需要通过网络来获取和分享大规模三维地理空间数据。但由于这类数据通常具有高精度和大尺度等特点,其数据量巨大,直接传输原始数据会消耗大量的网络带宽,严重影响传输效

Swift 5.9 有哪些新特性(二)

文章目录前言Noncopyable结构体和枚举结束变量绑定的生命周期makeStream()方法添加sleep(for:)到ClockDiscardingtaskgroups总结前言虽然Swift6已经在地平线上浮现,但5.x版本仍然有很多新功能-更简单的if和switch用法、宏、非可复制类型、自定义actor执行器

2603. 收集树中金币

给你一个n个节点的无向无根树,节点编号从0到n-1。给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其中coins[i]可能为0也可能为1,1表示节点i处有一个金币。一开始,你需要选择树中任意一个节点出发。

Java 21 新特性:Record Patterns

RecordPatterns第一次发布预览是在JDK19、随后又在JDK20中进行了完善。现在,Java21开始正式推出该特性优化。下面我们通过一个例子来理解这个新特性。recordPoint(intx,inty){}staticvoidprintSum(Objectobj){if(objinstanceofPoint

1. 两数之和

目录给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15],target=9输出:[0,1]

热文推荐