文档章节

解决cas集群时登录需要刷新多次才可以登录成功

zchuanzhao
 zchuanzhao
发布于 2018/07/26 10:15
字数 1205
阅读 140
收藏 0

解决问题

CAS登录过程会有三次请求,我们依次命名为Authentication Request / Validation Request / Wrapper Request。Nginx缺省的分发规则,同一个浏览器的请求,会按照nginx自身某种规则进行分发。在双点集群环境下,Authentication Request和ValidationRequest可能会恰好被分发到两台服务器,这就会导致登录过程死循环,导致在集群下,点击登录后会在登录页面刷新多次。

工作原理

Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route

1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。

2.后端服务器处理完请求,将响应数据返回给nginx。

3.此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值

4.客户端接收请求,并保存带route的cookie。

5.当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。

安装

Sticky模块下载地址:

https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/master.tar.gz

解压后放在/root/cluster/nginx-sticky目录下

Nginx下载地址:http://nginx.org/download/nginx-1.14.0.zip

解压后放在目录/root/cluster/nginx-1.14.0目录下

编译安装nginx,加入sticky模块

[root@localhost ~]#cd cluster/nginx-1.14.0

[root@localhost nginx-1.14.0]# ./configure --prefix=/usr/local/nginx  --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/cluster/nginx-sticky

[root@localhost nginx-1.14.0]# make

[root@localhost nginx-1.14.0]# make install

安装完查看nginx编译参数


[root@localhost nginx-1.14.0]# /usr/local/nginx/sbin/nginx -V


如果出现以下内容说明安装成功


nginx version: nginx/1.14.0

built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)

configure arguments: --prefix=/root/cluster/nginx --with-http_gzip_static_module --with-http_flv_module --with-http_dav_module --with-http_stub_status_module --with-http_realip_module --add-module=/root/cluster/nginx-sticky/

然后修改nginx的conf配置,修改文件usr/local/nginx/conf/nginx.conf

如果在以上编译过程中报错,提示找不到MD5等问题,可能的问题如下

ngx_http_sticky_misc.c: In function 「ngx_http_sticky_misc_md5」:

ngx_http_sticky_misc.c:152:15: ERROR:「MD5_DIGEST_LENGTH」 undeclared (first use in this function)

   u_char hash[MD5_DIGEST_LENGTH];

解决方式就是修改你下载解压缩之后的sticky模块文件夹中的ngx_http_sticky_misc.c文件,将这两个模块 <openssl/sha.h> and <openssl/md5.h>包含到文件ngx_http_sticky_misc.c

添加下面红色标注的代码

#include <nginx.h>

#include <ngx_config.h>

#include <ngx_core.h>

#include <ngx_http.h>

#include <ngx_md5.h>

#include <ngx_sha1.h>

#include <openssl/sha.h>

#include <openssl/md5.h>

 

#include "ngx_http_sticky_misc.h"

然后重新再编译一次。

在upstream加入sticky配置,配置如下,nginx负载均衡配置参考文章《Nginx+Tomcat搭建高性能负载均衡集群

upstream 192.168.203.176 {

     sticky;

     server 192.168.203.31:8090;

     server 192.168.203.32:8090;

     server 192.168.203.33:8090;

}

 

加入sticky;后,重启nginx就可以了。

sticky参数解析

sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h]

       [hash=index|md5|sha1] [no_fallback] [secure] [httponly];

[name=route]       设置用来记录会话的cookie名称

[domain=.foo.bar]    设置cookie作用的域名

[path=/]          设置cookie作用的URL路径,默认根目录

[expires=1h]        设置cookie的生存期,默认不设置,浏览器关闭即失效,需要是大于1秒的值

[hash=index|md5|sha1]   设置cookie中服务器的标识是用明文还是使用md5值,默认使用md5

[no_fallback]       设置该项,当sticky的后端机器挂了以后,nginx返回502 (Bad Gateway or Proxy Error) ,而不转发到其他服务器,不建议设置

[secure]          设置启用安全的cookie,需要HTTPS支持

[httponly]         允许cookie不通过JS泄漏

注意

1.同一客户端的请求,有可能落在不同的后端服务器上

如果客户端启动时同时发起多个请求。由于这些请求都没带cookie,所以服务器会随机选择后端服务器,返回不同的cookie。当这些请求中的最后一个请求返回时,客户端的cookie才会稳定下来,值以最后返回的cookie为准。

2.cookie不一定生效

由于cookie最初由服务器端下发,如果客户端禁用cookie,则cookie不会生效。

3.cookie名称不要和业务使用的cookie重名。Sticky默认的cookie名称是route,可以改成任何值。

4.客户端发的第一个请求是不带cookie的。服务器下发的cookie,在客户端下一次请求时才能生效。

5.Nginx sticky模块不能与ip_hash同时使用

© 著作权归作者所有

共有 人打赏支持
zchuanzhao
粉丝 50
博文 242
码字总数 145449
作品 1
福州
程序员
私信 提问
如何在 CAS 单点登录环境下发送 Ajax 请求?

我已成功大家 CAS 单点登录服务器(简称 CAS),地址为:https://cas 有两个应用,已经它们集成在单点登录环境中,它们是: REST Server,地址为:http://rest-server REST Client,地址为:...

黄勇
2014/02/09
7.3K
9
单点登录 CAS4.0 服务器端配置

CAS 介绍 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: 开源的企业级单点登...

zbbmaster
2016/07/22
0
0
yale cas 登录成功再跳转问题

直接访问: http://127.0.0.1:8080/cas/login 输入密码然后成功登录 上面没问题, 我在成功界面里面添加了一个链接: http://172.25.61.79:8080/cas/services/manage.html 然后点击 http://l...

wad12302
2013/01/09
7.4K
7
CAS之5.2x版本之Gitlab单点登录-yellowcong

配置gitlab的单点登录,这个地方需要注意的是,有两种方案,1、用户必须有gitlab的账户才能用cas账户登录,这种做法,需要手动与cas用户关联。2、可以直接通过cas登录gitlab,不需要有gitlab的...

yelllowcong
2018/04/14
0
0
统一认证 - Apereo CAS 客户端的集成以及小结

前两篇介绍了Apereo CAS以及服务器端的安装,但还不够完整,服务端还没有Application真正用起来呢!这篇文章将介绍怎么用起来 集成的目的 客户端我们想要与Apereo CAS做什么集成呢?回顾一下...

Notech
02/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IOS  学习记录

1.StackView=>IOS 9及以上支持 2.布局方式: AutoLayout / StackView 堆布局 (线性布局) 3.屏幕适配 (资源分辨率、设计分辨率、屏幕分辨率) Size Class技术 可以针对 屏幕的方向进行设置...

萨x姆
50分钟前
3
0
第四次工业革命:自主经济的崛起

https://36kr.com/p/5170370.html

shengjuntu
昨天
3
0
Cloud Native 与12-Factor

12-Factor(twelve-factor),也称为“十二要素”,是一套流行的应用程序开发原则。Cloud Native架构中使用12-Factor作为设计准则。 12-Factor 的目标在于: 使用标准化流程自动配置,从而使...

waylau
昨天
9
0
java多线程2

“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在线程安全问题。这是因为方法内部的变量都是私有造成的。 synchronized 获取的都是对象锁。如果多个线程访问多个...

一滴水穿石
昨天
4
0
今天的学习

1,document.location.href:获取整个url 2,str.split(' '):用字符分割字符串 3,$this->load->library(' '):引用图像处理类 4,$this->load->library(' '):引用Email类 5,特殊访问指针$th......

墨冥
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部