Nginx会话保持的具体实现

 更新时间:2024年07月02日 10:55:21   作者:TA548464  
会话保持是指在会话持续或会话完成一个任务或一个事务的时间段内,将客户端请求引导至同一个后端Web服务器或应用服务器,本文主要介绍了Nginx会话保持的具体实现,感兴趣的可以了解一下

1. 基于ip_hash的会话保持

  • 在做Nginx的负载均衡时,可以在upstream里设置ip_hash,每个请求按访问ip的hash结果分配,映射到固定某一台的服务器
  • 当后端服务器宕机后,session会丢失,再次发起请求时,会重新固定访问另一台正常的服务器并实现会话保持。
  • 缺点就是由于同一个IP客户端都固定访问一个后端服务器,这就可能会导致负载不均衡。下面是 ip_hash 的会话保持格式。
  • ip_hash 源地址哈希算法,将同一客户端的请求总是发往同一个后端服务器,除非该服务器不可用。
  • url_hash 目标地址哈希算法
#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来判断。
//编译安装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应用中具有重要的作用,主要体现在以下几个方面:

  • 用户登录状态维护: 通过会话保持,Web应用能够跟踪用户的登录状态,确保用户在多次请求之间保持登录状态。这对于需要用户身份验证的应用来说尤为重要,以便提供个性化的服务和访问控制。
  • 购物车和交易状态: 在电子商务网站中,用户可能会添加商品到购物车并进行结算。通过会话保持,系统可以跟踪用户的购物车状态,确保用户在购物过程中的信息不会丢失,同时保护交易过程的一致性。
  • 个性化用户体验: 对于一些需要根据用户个性化设置或历史记录提供服务的应用,会话保持可以确保用户在访问过程中保持一致的体验。例如,用户在一个新闻应用中的阅读历史、个性化推荐等。
  • 减少重复认证: 在一些分布式系统中,用户可能会访问多个服务。通过会话保持,用户只需要在登录时进行一次身份验证,然后在整个会话期间,其他服务可以通过会话标识来确认用户身份,避免重复的身份验证过程。
  • 保持用户上下文: 有些应用需要在用户多次请求之间保持特定的上下文信息,例如在多步骤的表单提交中,确保用户在不同步骤之间的数据保持一致。
  • 提高系统性能: 通过将用户请求路由到同一台后端服务器,会话保持可以减少后端服务器之间的数据同步和共享的需求,从而提高系统的性能和效率。

到此这篇关于Nginx会话保持的具体实现的文章就介绍到这了,更多相关Nginx会话保持内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • nginx中path模式配置示例

    nginx中path模式配置示例

    这篇文章主要介绍了nginx中path模式配置示例,nginx服务器默认是不支持pathinfo模式的,需要修改配置才可以实现,本文即给出了配置示例,需要的朋友可以参考下
    2014-12-12
  • 利用nginx和腾讯云免费证书制作https的方法

    利用nginx和腾讯云免费证书制作https的方法

    这篇文章主要介绍了利用nginx和腾讯云免费证书制作https的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • nginx服务器异常502 bad gateway原因排查

    nginx服务器异常502 bad gateway原因排查

    这篇文章主要介绍了nginx服务器异常502 bad gateway原因排查,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • centos8安装nginx1.9.1的详细过程

    centos8安装nginx1.9.1的详细过程

    这篇文章主要介绍了centos8安装nginx1.9.1的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 详解Nginx中HTTP的keepalive相关配置

    详解Nginx中HTTP的keepalive相关配置

    这篇文章主要介绍了Nginx中HTTP的keepalive相关配置,以及Nginx的Httpd守护进程相关的keepalive timeout配置,需要的朋友可以参考下
    2016-01-01
  • Nginx Location指令URI匹配规则详解小结

    Nginx Location指令URI匹配规则详解小结

    这篇文章主要介绍了Nginx Location指令URI匹配规则详解小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Nginx本地目录映射实现代码实例

    Nginx本地目录映射实现代码实例

    这篇文章主要介绍了Nginx本地目录映射实现代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 强大的Nginx配置生成器详解

    强大的Nginx配置生成器详解

    Nginx Config 是一款可以一键生成 Nginx 配置的神器,相当给力,这篇文章主要介绍了强大的Nginx配置生成器,需要的朋友可以参考下
    2022-11-11
  • nginx FastCGI错误Primary script unknown解决办法

    nginx FastCGI错误Primary script unknown解决办法

    这篇文章主要介绍了nginx错误Primary script unknown解决办法,需要的朋友可以参考下
    2014-03-03
  • nginx实现数据库端口转发

    nginx实现数据库端口转发

    本文主要介绍了nginx实现数据库端口转发,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论