Nginx会话保持

Nginx会话保持

  • [1. 基于ip_hash的会话保持](#1. 基于ip_hash的会话保持)
  • [2. 基于cookie的会话保持](#2. 基于cookie的会话保持)
  • [3. 会话保持的作用](#3. 会话保持的作用)

1. 基于ip_hash的会话保持

  • 在做Nginx的负载均衡时,可以在upstream里设置ip_hash,每个请求按访问ip的hash结果分配,映射到固定某一台的服务器
  • 当后端服务器宕机后,session会丢失,再次发起请求时,会重新固定访问另一台正常的服务器并实现会话保持。
  • 缺点就是由于同一个IP客户端都固定访问一个后端服务器,这就可能会导致负载不均衡。下面是 ip_hash 的会话保持格式。
  • ip_hash 源地址哈希算法,将同一客户端的请求总是发往同一个后端服务器,除非该服务器不可用。
  • url_hash 目标地址哈希算法
bash 复制代码
#ip_hash语法:
upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
}

2. 基于cookie的会话保持

  • 这种方式就是将用户的cookie存入session里,当用户分配到不同的服务器时,先判断服务器是否存在该用户的session,如果没有就先把cookie里面的sessoin存入该服务器,实现session会话保持。
  • 缺点是存入cookie有安全隐患,比如黑客可能会获取你的cookie从而获取你相关信息。
  • 使用这种方式实现会话保持保持,需要添加sticky_cookie_insert模块,与 ip_hash 不同之处在于,它不是基于IP来判断客户端的,而是基于cookie来判断。
c 复制代码
//编译安装sticky模块
//给yum安装的nginx添加模块(1.24最新的版本重新编译安装会报错,1.18的不会报错,版本兼容性的问题)
​
//安装编译环境
[root@nginx-server ~]# yum install -y pcre* openssl* gcc gcc-c++ make 
[root@nginx-server ~]# wget  https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip  //下载sticky模块
[root@nginx-server ~]# nginx -v
nginx version: nginx/1.18.0
[root@nginx-server ~]# wget  http://nginx.org/download/nginx-1.18.0.tar.gz    #下载yum安装nginx对应版本的源码包
[root@nginx-server ~]# yum install -y unzip    //安装解压工具
[root@nginx-server ~]# unzip 08a395c66e42.zip    //解压模块包
[root@nginx-server ~]# mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42/ nginx-sticky-module-ng/
[root@nginx-server ~]# tar xzvf nginx-1.18.0.tar.gz -C /usr/local/    //解压nginx的源码包
[root@nginx-server ~]# cd /usr/local/nginx-1.18.0/
​
[root@nginx-server nginx-1.18.0]# nginx -V    //查看yum安装nginx所有模块
[root@nginx-server nginx-1.18.0]# ./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
[root@nginx-server nginx-1.18.0]# make && make install
​
//配置基于cookie会话保持
[root@nginx-server conf.d]# vim upstream.conf
upstream jianglt {
        server 192.168.221.136;
        server 192.168.221.138;
        sticky;
}
server {
    listen       80;
    server_name   www.test.com;
    charset utf-8;
    #access_log  /var/log/nginx/host.access.log  main;
    location / {
        proxy_pass http://jianglt;
    }
}
[root@nginx-server conf.d]# nginx -t 
[root@nginx-server conf.d]# nginx -s reload
​
//或者:
upstream jianglt {
        server 192.168.221.136;
        server 192.168.221.138;
        sticky expires=1h domain=testpm.com path=/;
}

说明:
expires:设置浏览器中保持cookie的时间
domain:定义cookie的域
path:为cookie定义路径

浏览器测试访问;记得在windows本地hosts文件中添加解析

浏览器具体的体现:

1、访问www.test.com,会随机访问到一个页面,可能是136,也可能是138

2、按下F12,打开浏览器的控制台工具,找到请求头下面的Cookie(例如:Cookie:route=19c3afb04a79d36869450dfe7dca8512),并将Cookie复制粘贴到记事本中

3、停掉当前访问的服务器,crtl + F5强制刷新,再次查看浏览器中请求头的Cookie,观察是否跟前一次的Cookie一样(如果第一次访问的是136的页面,则停掉136,反之,停掉138)

  • 注意:使用后端服务器可以自身通过相关机制保持session同步,如:使用数据库、redis、memcached 等做session复制

3. 会话保持的作用

会话保持在Web应用中具有重要的作用,主要体现在以下几个方面:

  1. 用户登录状态维护: 通过会话保持,Web应用能够跟踪用户的登录状态,确保用户在多次请求之间保持登录状态。这对于需要用户身份验证的应用来说尤为重要,以便提供个性化的服务和访问控制。
  2. 购物车和交易状态: 在电子商务网站中,用户可能会添加商品到购物车并进行结算。通过会话保持,系统可以跟踪用户的购物车状态,确保用户在购物过程中的信息不会丢失,同时保护交易过程的一致性。
  3. 个性化用户体验: 对于一些需要根据用户个性化设置或历史记录提供服务的应用,会话保持可以确保用户在访问过程中保持一致的体验。例如,用户在一个新闻应用中的阅读历史、个性化推荐等。
  4. 减少重复认证: 在一些分布式系统中,用户可能会访问多个服务。通过会话保持,用户只需要在登录时进行一次身份验证,然后在整个会话期间,其他服务可以通过会话标识来确认用户身份,避免重复的身份验证过程。
  5. 保持用户上下文: 有些应用需要在用户多次请求之间保持特定的上下文信息,例如在多步骤的表单提交中,确保用户在不同步骤之间的数据保持一致。
  6. 提高系统性能: 通过将用户请求路由到同一台后端服务器,会话保持可以减少后端服务器之间的数据同步和共享的需求,从而提高系统的性能和效率。
相关推荐
原神启动1几秒前
Docker 场景化作业:生产环境容器操作实训
运维·docker·容器
云老大TG:@yunlaoda3605 分钟前
如何通过华为云国际站代理商CSBS进行备份策略设置?
运维·数据库·华为云
老王熬夜敲代码44 分钟前
解决IP不够用的问题
linux·网络·笔记
码里法1 小时前
centos安装nginx并配置https完整版
nginx·https·centos
zly35001 小时前
linux查看正在运行的nginx的当前工作目录(webroot)
linux·运维·nginx
QT 小鲜肉1 小时前
【Linux命令大全】001.文件管理之file命令(实操篇)
linux·运维·前端·网络·chrome·笔记
呼啦啦呼啦啦啦啦啦啦1 小时前
docker制作镜像的两种方式(保姆级教学)
运维·docker·容器
Asurplus1 小时前
Centos7安装Git环境
git·centos·yum·dnf
问道飞鱼2 小时前
【Linux知识】Linux 虚拟机磁盘扩缩容操作指南(按文件系统分类)
linux·运维·服务器·磁盘扩缩容
egoist20232 小时前
【Linux仓库】超越命令行用户:手写C语言Shell解释器,解密Bash背后的进程创建(附源码)
linux·c语言·bash·xshell·环境变量·命令行参数·内建命令