Nginx会话保持

Nginx会话保持

  • 1. 基于ip_hash的会话保持
  • 2. 基于cookie的会话保持
  • 3. 会话保持的作用

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应用中具有重要的作用,主要体现在以下几个方面:

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

你可能感兴趣的:(Nginx,nginx,运维,linux,centos)