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. 提高系统性能: 通过将用户请求路由到同一台后端服务器,会话保持可以减少后端服务器之间的数据同步和共享的需求,从而提高系统的性能和效率。
相关推荐
小政同学2 小时前
【NFS故障】共享的文件无法执行
linux·运维·服务器
AI木马人2 小时前
3.【Prompt工程实战】如何设计一个可复用的Prompt系统?(避免每次手写提示词)
linux·服务器·人工智能·深度学习·prompt
ch3nyuyu2 小时前
Ubuntu(乌班图)基础指令
linux·运维·网络
minglie13 小时前
gcc编译器汇总
linux
挽安学长3 小时前
保姆级教程,通过GACCode使用Claude Code Desktop!
运维·服务器
firstacui4 小时前
MGRE实验
运维·服务器·网络
白菜欣4 小时前
Linux —《开发三件套:gcc/g++、gdb、make/Makefile 全解析》
linux·运维
何中应5 小时前
Grafana如何给列表设置别名
运维·grafana·监控
senijusene5 小时前
基于 imx6ull平台按键驱动开发:input子系统+中断子系统+platform总线
linux·驱动开发
MXsoft6185 小时前
运维的尽头,是把“救火”变成“算命”
运维