CAS客户端集群

jopen 11年前

环境变量定义

  • CAS_CLIENT_HOME : CAS Java客户端源码包目录(版本:3.2.1)
  • NGINX_HOME:nginx安装目录(版本:1.4.1)
  • PHP_HOME :php安装目录(版本:    5.5.1)
  • CATALINA_HOME: tomcat安装目录(版本: 7.0.42)

网络拓扑

CAS客户端集群

集群原理

不管是Java还是PHP,还是其他语言的CAS客户端,集群要解决问题就是session同步。如果客户端在本地内存记录了与登陆状态有关的数据,那么这部分代码需要进行改造——把这部分的数据共享出去。

CAS JavaEE客户端集群

我们以tomcat 7自带的例子examples应用为例。假设你已经按照这里配置好,下面只需配置session同步以及同步单点登出。session同步不在这里累述。需要注意的是,web.xml中的 casServerUrlPrefixcasServerUrlPrefixserverName这几个参数的ip(或域名)指向nginx服务器。比如这里是192.168.121.130

这里要着重说说”同步单点登出“。 由于CAS 提供的Java客户端会将一些与登陆状态有关的数据记录在本地内存中,因此需要对$CASCLIENTHOME的cas-client-core模块和cas-client-support-distributed-ehcache进行一些修改(我已将修改后的源代码放在这里 ).

先后将cas-client-core和cas-client-support-distributed-ehcache模块编译打包,然后把打包后的jar文件复制到$CATALINA_HOME/webapps/examples/WEB-INF/lib目录中。

打开web.xml, 在filter-name为CasSingleSignOutFilter的 节点内添加一个初始化配置参数:

         sessionMappingStorageClass         org.jasig.cas.client.session.EhcacheBackedSessionMappingStorage  

nginx的反向代理配置也不在这里累述。

CAS PHP客户端集群

假设你已经按照这里配置好了PHP客户端.

首先启用php-memcached扩展,打开php.ini, 添加extension=memcached配置项, 并将

session.save_handler = files   session.save_path = "/tmp"

改成

session.save_handler = memcached  session.save_path = "192.168.121.128:12221"  # 格式: ip或域名:端口,  多台memcached用逗号(,)隔开  memcached.hash_strategy = consistent

同时记得把memcached.so复制到php的加载目录中(默认是$PHP_HOME/php/ext)

接着,在192.168.121.130的nginx中配置反向代理:

http{      upstream phpserver {          server 192.168.121.131: 8088 fail_timeout = 3s;          server 192.168.121.132: 8088 fail_timeout = 3s;      }        upstream phpservers {           server 192.168.121.131: 9443 fail_timeout = 3s;            server 191.168.121.132: 9443 fail_timeout = 3s;      }        upstream cas-server {           server 192.168.121.129: 8080;        }        upstream cas-servers {           server 192.168.121.129: 8443;      }        # ...       server {          listen   8088;                 server_name  hostname;           # ...           proxy_redirect  http://192.168.121.130 /;          proxy_redirect  http://localhost/  /;            location ~ \.php$ {              proxy_pass http://phpserver$uri$is_args$args;              proxy_set_header Host $host;              proxy_set_header X-Real-IP $remote_addr;              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;              proxy_set_header X-FORWARDED-HOST $server_addr;                proxy_set_header X-FORWARDED-PORT $server_port;         }            location ~ ^/cas/(.*)$ {              proxy_pass  http://cas-server/cas/$1$is_args$args;              proxy_set_header Host $host;              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;              proxy_set_header   X-Real-IP        $remote_addr;          }                 }       server {          listen       9443;          server_name  localhost;            ssl                  on;          ssl_certificate      nginx-server.pem;          ssl_certificate_key  nginx-private.key;            proxy_redirect http://192.168.121.130/ /;          proxy_redirect http://localhost/ /;            location ~ ^/cas/(.*)$ {              proxy_pass  https://cas-servers/cas/$1$is_args$args;              proxy_set_header Host $host;              proxy_set_header X-Forwarded-For $remote_addr;              proxy_set_header   X-Real-IP        $remote_addr;          }                location ~ \.php$ {              proxy_pass  http://servers/$1$is_args$args;              proxy_set_header Host $host;              proxy_set_header X-Forwarded-For $remote_addr;              proxy_set_header   X-Real-IP        $remote_addr;              proxy_set_header X-FORWARDED-HOST $server_addr;                proxy_set_header X-FORWARDED-PORT $server_port;          }      }  }

注意proxy_set_header X-FORWARDED-HOST $server_addr;proxy_set_header X-FORWARDED-PORT $server_port;是确保能正常实现登陆跳转的两行配置。

另外,要将$NGINX_HOME/html/config.php中的 $cas_host$cas_port分别改为 192.168.121.1309443

192.168.121.131和192.168.121.132上两台nginx的配置从略。