CAS客户端集群
环境变量定义
- 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)
网络拓扑
集群原理
不管是Java还是PHP,还是其他语言的CAS客户端,集群要解决问题就是session同步。如果客户端在本地内存记录了与登陆状态有关的数据,那么这部分代码需要进行改造——把这部分的数据共享出去。
CAS JavaEE客户端集群
我们以tomcat 7自带的例子examples应用为例。假设你已经按照这里配置好,下面只需配置session同步以及同步单点登出。session同步不在这里累述。需要注意的是,web.xml中的 casServerUrlPrefix , casServerUrlPrefix 和 serverName这几个参数的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.130 和 9443
192.168.121.131和192.168.121.132上两台nginx的配置从略。