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

目录
  • 前言
  • 一、基于ip_hash的会话保持
  • 二、基于cookie的会话保持
  • 总结

前言

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

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

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

在代理服务器(负载均衡服务器)配置

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

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

(0)

相关推荐

  • Python实现模拟浏览器请求及会话保持操作示例

    本文实例讲述了Python实现模拟浏览器请求及会话保持操作.分享给大家供大家参考,具体如下: python下读取一个页面的数据可以通过urllib2轻松实现请求 import urllib2 print urllib2.urlopen('http://www.baidu.com').read() 涉及到页面的POST请求操作的话需要提供头信息,提交的post数据和请求页面. 其中的post数据需要urllib.encode()一下,其实就是将字典转换成"data1=value1&data

  • 自定义session存储机制避免会话保持问题

    PHP服务端session以文件的方式存储,当用户访问量过大时,session文件会非常多,而且当横向增加服务器后,session文件并不能同步,面临会话保持的问题. 有以下两种解决方案: 1. 拿出单独的一台服务器使用NFS或Samba文件共享方式,共享session文件,可以解决负载均衡时会话不同步的问题.(但无法解决效率的问题,上万个session文件,查找会较慢) 2. session存数据库,其他服务器可以通过共享数据库服务器,解决会话问题,同时数据库也解决了文件的效率问题.数据库可以

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

    目录 前言 一.基于ip_hash的会话保持 二.基于cookie的会话保持 总结 前言 在我们做Nginx负载均衡的时候经常会遇到会话保持的问题,为了保证同一用户session会被分配到同一台服务器上,这时就需要会话保持,我们常用的方法有基于ip_hash的会话保持.基于cookie的会话保持. 一.基于ip_hash的会话保持 在做Nginx的负载均衡时,可以在upstream里设置ip_hash,每个请求按访问ip的hash结果分配,映射到固定某一台的服务器,当后端服务器宕机后,sessi

  • php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式

    先给大家介绍下php 与 nginx 的两种处理方式,具体内容如下所示: 1.IP:Port 监听方式 php-fpm docker pull PHP:2.4-alpine nginx.conf fastcgi_pass 127.0.0.1:9000; php-fpm 在容器里的 nginx.conf location /php { proxy_set_header Host $host:$server_port; proxy_pass http://138.38.38.111:80/; } 2

  • Docker部署Nginx并修改配置文件的两种方式

    目录 一.创建容器 二.修改配置文件 1. 进入容器内部修改配置文件 2.容器加载外部配置文件 总结 一.创建容器 # 搜索Nginx镜像 docker search nginx # 拉取Nginx镜像 docker pull nginx # 查看镜像名为nginx的镜像 docker images nginx # 运行镜像,生成容器 # 命令解读: # -d:以后台守护线程运行 # --name:容器命名 # -p 80:80 : 映射端口,容器内部80端口映射到服务器80端口 # nginx

  • Nginx配置同一个域名同时支持http与https两种方式访问实现

    Nginx配置同一个域名http与https两种方式都可访问,证书是阿里云上免费申请的 server { listen 80; listen 443 ssl; ssl on; server_name 域名; index index.html index.htm index.php default.html default.htm default.php; ssl_certificate /usr/local/nginx/cert/21402058063066221.pem; //下载申请后阿里s

  • .NET实现定时发送邮件代码(两种方式)

    有时候我们或许会遇到想在某一个时刻给别人发送一封邮件,就像是在生日的时候,但是我们又怕到时候忘记了,这时就应该 使用发送定时邮件的功能,但是这个定时发送邮件功能是怎么实现的呢?下面用两种方式实现.net定时发送邮件代码,具体请看下面内容. 实现思路.需求添加一个全局应用程序类Global.asax 代码会在访问网站时运行 Global.asax代码: void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 Sys

  • javascript记住用户名和登录密码(两种方式)

    下面主要通过代码给大家展示下javascript记住用户名和登录密码,具体代码内容请看下文. 第一种方式: CONTENT     login.html     welcome.html     cookie.js     common.js login.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-t

  • MyBatis开发Dao层的两种方式实现(原始Dao层开发)

    本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方式) 本次使用的mybatis版本为mybatis-3.2.7,开发工具为eclipse,数据库为mysql,jdk版本jdk1.8.0_151. SqlSession使用范围 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlS

  • Hibernate中获取Session的两种方式代码示例

    Session:是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久层操作的基础.对象的生命周期/事务的管理/数据库的存取都与Session息息相关. Session对象是通过SessionFactory构建的,下面举个例子来介绍Hibernate两种获取session的方式. 日志,是编程中很常见的一个关注点.用户在对数据库进行操作的过程需要将这一系列操作记录,以便跟踪数据库的动态.那么一个用户在向数据库插入一条记录的时候,就要向日志文件中记录一条记录,用户的一系列操作都要在

  • Docker中数据卷(volume)管理的两种方式

    上篇文章给大家介绍过 docker基础知识之挂载本地目录的方法 ,今天给大家介绍Docker中数据卷(volume)管理的两种方式,具体内容如下所示: 什么是数据卷 数据卷( volume ):volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利. 为什么要用数据卷 Docker分层文件系统存在的问题: Docker的镜像是由一系列的只读层组合而来的,当启动一个容器时, Docker加载镜像的所有只读层,并在最上

  • 阿里nacos+springboot+dubbo2.7.3统一处理异常的两种方式

    目录 1.为什么要抛异常? 2.给出解决方案 3.两种抛异常的实例解说 dubbo工程搭建 在网上很多关于dubbo异常统一处理的博文,90%都是抄来抄去.大多都是先上一段dubbo中对于异常的统一处理的原码,然后说一堆的(甚至有12345,五种)不靠谱方案,最后再说“本篇使用的是方案4”,然后再对所谓的方案4写了一段文字,最后还说不清!!! 本篇解决方案不会那么罗里吧嗦也不会贴dubbo源码来凑字数,我就直接从刚结束不久的双11保卫战性能全链路优化中我们的面对10万级别TPS的方案中提取的代码

随机推荐