目录

  • 前言
  • 一、基于ip_hash的会话保持
  • 二、基于cookie的会话保持
  • 总结

前言

在我们做Nginx负载均衡的时候经常会遇到会话保持的问题,为了保证同一用户session会被分配到同一台服务器上,这时就需要会话保持,我们常用的方法有基于ip_hash的会话保持、基于cookie的会话保持。

一、基于ip_hash的会话保持

在做Nginx的负载均衡时,可以在upstream里设置ip_hash,每个请求按访问ip的hash结果分配,映射到固定某一台的服务器,当后端服务器宕机后,session会丢失,再次发起请求时,会重新固定访问另一台正常的服务器并实现会话保持。缺点就是由于同一个IP客户端都固定访问一个后端服务器,这就可能会导致负载不均衡。下面是ip_hash的会话保持格式。

  • 这里假设后端服务器都正常运行

    在Nginx代理服务器(负载均衡服务器)中配置:
    ===========================================
    upstream test { ip_hash;server 10.20.151.112:80;server 10.20.151.113:80;
    }
    

    至于这里为什么会返回这个结果,在我的Nginx实现负载均衡那篇博客有具体配置操作,感兴趣的可以去看看。因此不难看出,当我使用ip_hash时,实现了session保持,即客户端会固定访问112这台后端服务器(除非这台服务器宕机了),就算再次刷新页面也不会返回其他后端服务器的内容(注意:实际生产中后端服务器返回给请求客户端的内容是一样的,这里仅仅是为了做测试效果)。

  • 假设固定访问的那台服务器宕机了

二、基于cookie的会话保持

这种方式就是将 用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在该用户的session,如果没有就先把cookie里面的sessoin存入该服务器,实现session会话保持。缺点是存入cookie有安全隐患,比如黑客可能会获取你的cookie从而获取你相关信息。使用这种方式实现会话保持保持,需要添加sticky_cookie_insert模块,与ip_hash不同之处在于,它不是基于IP来判断客户端的,而是基于cookie来判断。

  • 添加sticky模块(我用yum方式安装的Nginx)

    yum install -y pcre* openssl* gcc gcc-c++ make   --安装编译环境
    wget  https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip   --下载sticky模块
    nginx -v  --查看Nginx版本,因为要下载和yum安装nginx对应版本的源码包
    wget  http://nginx.org/download/nginx-1.18.0.tar.gz
    yum install -y unzip   --安装解压工具
    unzip 08a395c66e42.zip --解压模块包
    mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42/ nginx-sticky-module-ng/  --改名
    tar xzvf nginx-1.18.0.tar.gz -C /usr/local/  --解压nginx的源码包
    cd /usr/local/nginx-1.18.0/
    nginx -V   --查看yum安装nginx所有模块
    ======================================================================================
    ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=/root/nginx-sticky-module-ng
    ======================================================================================
    make && make install
    Nginx -V  --再次查看Nginx模块,添加成功
    

  • 在代理服务器(负载均衡服务器)配置

    vim upstream.conf   --在子配置文件conf.d中创建upstream.conf
    =====================================================================================
    upstream qfedu {server 192.168.198.143;server 192.168.198.145;sticky;
    }
    
    vim proxy.conf     ----在子配置文件conf.d中创建proxy.conf
    =====================================================================================
    server {listen       80;server_name  localhost;location / {proxy_pass http://testweb;}
    }
    
    nginx -t    --检查配置文件语法是否有错
    nginx -s reload   --重新加载配置文件
    

    访问http://10.20.151.240/

总结

Nginx会话保持一般有基于ip_hash和基于cookie两种方式,尽管Nginx的会话保持可以使某个ip客户端访问固定的后端服务器,但这可能会导致负载的不均衡。采用cookie的方式进行会话保持时,需要引入第三方模块(sticky模块)才能实现。 使用sticky_cookie_insert启用会话亲缘关系,这会导致来自同一客户端的请求被传递到一组服务器的同一台服务器,这种方法可以避免上述ip_hash中来自同一局域网的客户端和前段代理导致负载失衡的情况。 使用后端服务器自身通过相关机制保持session同步,如:使用数据库、redis、memcached 等做session复制。

Nginx实现会话保持相关推荐

  1. 推荐:Nginx 会话黏着一致性解决

    关于session共享有四种方案 1), tomcat广播, 对系统资源占用较大, 占用io流, 不推荐使用 2), 使用memcache 3), 使用redis, 安装第三方库, 4), 使用ten ...

  2. nginx第三方模块---nginx-sticky-module的使用(基于cookie的会话保持)

    目前的项目网站架构中使用了F5和nginx,F5用来做负载均衡,nginx只用作反向代理服务器.最近应客户的要求准备去掉F5,使用软负载.大家都知道nginx抗并发能力强,又可以做负载均衡,而且使用n ...

  3. nginx+tomcat

    全部系统采用centos7.1 各节点配置好hosts文件 cat /etc/hosts 172.16.92.1    node1.centos7.com    node1 172.16.92.2   ...

  4. 一文玩转NGINX(对于NGINX,你真的了解吗?)

    前言 nginx [engine x] 是一个 HTTP 和反向代理服务器, 邮件代理服务器, 和一个通用的 TCP/UDP 代理服务器, 最初由 Igor Sysoev . 运行了很久 在许多负载重 ...

  5. Web服务器之Nginx介绍

    一.Nginx简介 Nginx (engine x) 是一个高性能的Web和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服器.Nginx处理高并发能力是十分强大的,能经受高负载的考 ...

  6. mysql nginx

    公司架构: ​mysql 1.数据库的类型 非关系型数据库:存储格式灵活,可以是key-value的形式,也可以是文本文档图片等形式.读写速度快,可以使用磁盘或随机存储器作为载体,具有高扩展性,但是不 ...

  7. 运维笔记-nginx详解

    目录 1.简介 2.正向代理与反向代理 3.nginx的安装部署(基于Centos-stream操作系统) 4.nginx配置文件详解 5.高效的Web服务器-nginx 5.1nginx服务器基本配 ...

  8. Spring Session - Cookie VS Session VS Token 以及 Session不一致问题的N种解决方案

    文章目录 Cookie VS Session VS Token History Cookie Session Token Session不一致问题 Session不一致解决方案 nginx sessi ...

  9. 淘宝网秒杀需求分析与实现 - 公开课笔记

    主要内容 高并发系统架构面试的时候被问到该怎么说? 一个高并发系统中有哪些重要指标项? 从真实需求触发拆解淘宝网秒杀系统 - 消息中间件解耦.消峰.限流 分布式锁,限流,熔断,分布式事务,阿里云动态扩 ...

  10. tomcat相关实验

    tomcat相关实验 1.实现LNT 同主机实现 1.安装并启动tomcat 1)OpenJDK的安装yum install java-1.8.0-openjdk-devel.x86_64 确定JDK ...

最新文章

  1. 【Visual C++】游戏开发笔记之五——游戏画面绘图(二)绘制位图
  2. 【Go】Panic函数
  3. linux网络编程之posix 线程(四):posix 条件变量与互斥锁 示例生产者--消费者问题
  4. Django博客--5.让博客支持 Markdown 语法和代码高亮
  5. python3 爬虫实例_【实战练习】Python3网络爬虫快速入门实战解析(上)
  6. 初学者python笔记(类的内置属性)
  7. android读写相册权限,androidQ 关于存储权限相册图片
  8. SQL Server中的查询优化技术:数据库设计和体系结构
  9. aspnetpager分页UI调用存储过程函数
  10. 四种进程或线程同步互斥的控制方法
  11. oracle 导入文件 年月日,oracle导入文件时,日期格式问题
  12. Could not mount the media/drive ‘D:\......./VBoxGuestAdditions.iso‘ (VERR_PDM_MEDIA_LOCKED)
  13. 1.1 电 电流 电压 电路 基本电子元件
  14. Ubuntu安装基础教程(No Zuo No Die)
  15. 西门子1200控制V90伺服,西门子1200通过PN通讯控制 V90伺服,程序控制采用FB285功能块
  16. 振耀退休感言及海辉执行董事长视频访谈
  17. python实现添加商品至购物车
  18. 学习规律及其在学习中的应用
  19. 语法糖(Syntactic sugar)/ 语法盐(syntactic salt)
  20. android设置图片亮度分10档,批处理图片同时调整图片亮度批处理图的大小压缩图片裁边(6页)-原创力文档...

热门文章

  1. 【无标题】A\Btest
  2. 计算机英语四六级对调剂有影响吗,四六级没过影响考研复试和调剂吗?各高校标准不一...
  3. C#篇-unity和序列化和反序列
  4. 百度谷歌淘宝自定义搜索乱码问题的解决
  5. 普歌-码上鸿鹄团队-复习系统模块
  6. qq(q音乐)扫码授权登陆分析及python实现
  7. swarm集群搭建教程
  8. 【WinHex篇】WinHex跳过坏扇区制作磁盘镜像
  9. linux下的网络·环境部署
  10. 华为认证HCIP-Datacom Advanced Routing Switching Technology 知识点