Nginx实现会话保持的两种方式


Posted in Servers onMarch 18, 2022

前言

在我们做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实现会话保持的两种方式

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

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

Nginx实现会话保持的两种方式

二、基于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模块,添加成功

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实现会话保持的两种方式

总结

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

到此这篇关于Nginx实现会话保持的两种方式的文章就介绍到这了,更多相关Nginx 会话保持内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
Nginx的反向代理实例详解
Mar 31 Servers
Nginx反爬虫策略,防止UA抓取网站
Mar 31 Servers
Nginx工作原理和优化总结。
Apr 02 Servers
Nginx进程管理和重载原理详解
Apr 22 Servers
Rhit高效可视化Nginx日志查看工具
Nov 01 Servers
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
Nov 17 Servers
详解nginx安装过程并代理下载服务器文件
Feb 12 Servers
Nginx实现负载均衡的项目实践
Mar 18 Servers
解决xampp安装后Apache无法启动
Mar 21 Servers
docker-compose部署Yapi的方法
Apr 08 Servers
Windows server 2012搭建FTP服务器
Apr 29 Servers
centos7安装mysql5.7经验记录
May 02 Servers
Nginx实现负载均衡的项目实践
Mar 18 #Servers
Nginx中使用Lua脚本与图片的缩略图处理的实现
Mar 18 #Servers
nginx刷新页面出现404解决方案(亲测有效)
Mar 18 #Servers
Nginx+Windows搭建域名访问环境的操作方法
Mar 17 #Servers
nginx中封禁ip和允许内网ip访问的实现示例
Mar 17 #Servers
Apache Linkis 中间件架构及快速安装步骤
关于Nginx中虚拟主机的一些冷门知识小结
Mar 03 #Servers
You might like
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
jQuery代码实现实时获取时间
2017/01/29 Javascript
微信小程序返回多级页面的实现方法
2017/10/27 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
Python3 操作符重载方法示例
2017/11/23 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
详解python中递归函数
2019/04/16 Python
python实现飞机大战游戏
2020/10/26 Python
Python中print和return的作用及区别解析
2019/05/05 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
python复合条件下的字典排序
2020/12/18 Python
网络安全方面的面试题
2016/01/07 面试题
审核会计岗位职责
2013/11/08 职场文书
个性与发展自我评价
2014/02/11 职场文书
2014三八妇女节活动总结
2014/03/01 职场文书
购房协议书
2014/04/11 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
无房证明范本
2014/09/17 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
年会主持人开场白台词
2015/05/29 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang