一般来说,我们在java中都通过如下代码进行用户登录后的服务端注册,并且在用户下次请求时无需再登陆一遍,这就是Servlet的Session。使用了这种Session策略,那么Web容器比如tomcat就为当前用户生成一个SessionID,并且以这个SessionID为索引,存储这个用户相关的键值对,比如用户名,登陆时间一类的。存储在服务器的内存中。同时再response里向用户浏览器中设置一个cookie,这个cookie的名字为jsessionid,内容为服务器生成的随机数SessionID。在用户第二次请求时,将这个cookie发给服务器,服务器根据这个SessionID到内存中寻找相关数据,把用户名什么的提取出来,服务器就可以在本来无状态的HTTP连接中识别出这是哪个客户发出的请求,然后绘制相关页面。
        这中Session机制使用简单方便,被使用了很长时间。但是一旦做成集群,这种方式就不灵了。以NGINX默认的轮询方式为例,用户在A服务器上登陆成功,SessionID和用户名等相关信息写入了A服务器的内存中,该用户第二次请求时被NGINX分发到了B服务器,而B服务器没用该用户的SessionID和用户名等相关信息,于是要求用户再登陆一遍。用户第二次登陆之后发送第三次请求,被NGINX分配到了A或者C服务器,于是用户又必须登陆一遍,总之这个用户一直没法登陆成功。

基于以上现象,有几种存储session 的方法,如下:

1. 数据库存储session

2.使用 memcached,redis等存储session

3. 使用nginx 内置模块,ip_hash

4. 使用cookie的HASH来区分同一个用户的不同链接

前面我们已经知道了如果使用Servlet Session的话,Web容器会自动的在用户浏览器上建立名为jsessionid的cookie,并且值就是服务器端的SessionID。另一方面,新版的NGINX不光可以通过IP的hash来分发流量,也可以通过url的hash,cookie的hash,header的hash等等进行链接的固定分配。由于用户登陆成功以后名为jsessionid的cookie就有了一个短期固定的值,而且每个用户都不一样,那么我们就可以根据这个sessionid的hash值为它分配一个服务器。在当前sessionID起作用的时候那么分配的服务器也是同一个,并且不需要安装第三方的插件。

本次使用第4种方法,使用cookie 是用户分配的服务器是同一个。nginx 配置如下:

[root@www vhosts]# cat load.conf

upstream tomcat_server {    

hash        $cookie_jsessionid;   

# hash   $request_uri;    

server      172.16.31.16:8080;    

server      172.16.31.17:8080;

}

#error_page配置备份:    

upstream backup {    

server 11.11.11.14:80; }

error_page 404 500 502 503 504 =200 @fetch;     #注意:=200里的等号,左边有空格,右边没空格

server {  

     listen 80;  

     server_name www.load.com;  

     root /data/wwwroot/www.load.com;  

     index index.html index.htm index.php;

     access_log /usr/local/nginx/logs/www.load.com-access.log gufan;  

     error_log /usr/local/nginx/logs/www.load.com-error.log;

  location /stat {        

          proxy_pass            

         http://tomcat_server;        

         proxy_set_header      

         Host $http_host;        

         proxy_set_header       X-Real-IP $remote_addr;        

         proxy_set_header       X-Forwarded-For $proxy_add_x_forwarded_for;         

         proxy_intercept_errors on;        

         proxy_next_upstream off;  

   }

    location @fetch {     

         proxy_pass        http://backup;     

         proxy_set_header   Host             $host;     

        proxy_set_header   X-Real-IP        $remote_addr;     

       proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

    }

}

nginx 在浏览器端保持cookie 一致的更多相关文章

  1. [javascript]在浏览器端应用cookie记住用户名

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 获取浏览器端的cookie方法

    代码如下: function getCookie(key){ var cookies=document.cookie; if(cookies.length>0){ var start=cooki ...

  3. nginx优化:使用expires在浏览器端缓存静态文件

    一,nginx中expires指令的作用 网站的图片等静态文件一旦发布,通常很少改动, 为了减小对服务器请求的压力,提高用户浏览速度, 我们可以设置nginx中的expires, 使用户访问一次后,将 ...

  4. 常见的浏览器端的存储技术:cookie

    工作原理: cookie是存在用户硬盘中,用户每次访问站点时,Web应用程序都可以读取Cookie包含的信息.当用户再次访问这个站点时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie. ...

  5. 使用nginx实现浏览器跨域请求

    跨域访问问题, 相信很多人都遇到过, 并且都用不同的办法去解决过. 方法有很多种, 不一一叙述了. 这里主要使用nginx反向代理来解决跨域问题. 啥是跨域? 假如你是百度开发人员, 在百度页面去请求 ...

  6. html5 浏览器端数据库

    为什么使用浏览器端数据库:随着浏览器的处理能力不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少用户等待从服务器获取数据的时间. 一.localStorage  — 本地存储  可 ...

  7. FingerprintJS - 在浏览器端实现指纹识别

    FingerprintJS 是一个快速的浏览器指纹库,纯 JavaScript 实现,没有依赖关系.默认情况下,使用 Murmur Hash 算法返回一个32位整数.Hash 函数可以很容易地更换. ...

  8. 检测浏览器是否支持cookie方法

    cookie 摘自: http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html Cookie是什么? Cookie 是一小段文本信息 ...

  9. ele.me在IOS浏览器端启动APP的技巧分析

    ele.me在IOS浏览器端启动APP的技巧分析 巧妙利用后台重定向,在schemes启动时提示用户打开,启动不了APP时能够及时跳转至下载页面. 避免报错页面的出现以及用户还没来的及选择就跳转到下载 ...

随机推荐

  1. 最小生成树之Prim(普里姆)算法

    关于什么是Prim(普里姆算法)? 在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网, 则连通n个城市仅仅须要n-1条线路.这时.我们须要考虑这样一个问题.怎样在最节省经 ...

  2. SpringMVC中使用CommonsMultipartResolver进行文件上传

    概述: CommonsMultipartResolver是基于Apache的Commons FileUpload来实现文件上传功能的.所以在项目中需要相应的jar文件. FileUpload版本要求1 ...

  3. Mycat探索之旅(5)----常用的分片规则

    分片枚举 通过在配置文件中配置可能的枚举id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存, 而全国省份区县固定的,这类业务使用本条规则,配置如下: <table ...

  4. mac 上多版本python 共存

    Mac上自带了Python2.x的版本,有时需要使用Python3.x版本做开发,但不能删了Python2.x,可能引起系统不稳定,那么就需要安装多个版本的Python. 1.安装Python3.x版 ...

  5. linux 配置apache、mysql、php ——20150807

    2015年8月7日 一部分:mysql mysql 5.5.40安装 第二部分:apache(apache要安装在php前面.apache和mysql可以随意顺序) 1. # tar zxvf htt ...

  6. 【Python】help与dir的用法

    当你给dir()提供一个模块名字时,它返回在那个模块中定义的名字的列表.当没有为其提供参数时, 它返回当前模块中定义的名字的列表. 如果您需要快速获取任何的Python函数或语句的信息,那么您可以使用 ...

  7. 【Oracle】查找每期数据都存在的产品

    现在存在以下数据 如上图:A01与A02同时存在201710.201711.201712中 我们现在要将其查找出来 如果上图的表结构如下: 那么查询的SQL如下: SELECT DISTINCT CO ...

  8. Oracle 存储过程调用返回游标的另一个存储过程。

    一个扩展存储过程调用另一个存储过程,示例: 被调用存储过程:最后会返回一个游标,游标返回一个值.调用这个存储过程的存储过程同样需要获取它. procedure SearchBill --根据到货单号查 ...

  9. python challenge - orc.py

    http://www.pythonchallenge.com/pc/def/ocr.html recognize the characters. maybe they are in the book, ...

  10. centos mysql iptables配置

    在CentOS系统中防火墙默认是阻止3306端口的,我们要是想访问mysql数据库,我们需要这个端口,命令如下: iptables -I INPUT -p tcp --dport 3036 -j AC ...