##环境变量定义##
- 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客户端会将一些与登陆状态有关的数据记录在本地内存中,因此需要对$CAS_CLIENT_HOME的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的*<filter>*节点内添加一个初始化配置参数:
<!-- lang: xml -->
<init-param>
<param-name>sessionMappingStorageClass</param-name>
<param-value>org.jasig.cas.client.session.EhcacheBackedSessionMappingStorage</param-value>
</init-param>
nginx的反向代理配置也不在这里累述。
###CAS PHP客户端集群###
假设你已经按照这里配置好了PHP客户端.
首先启用php-memcached扩展,打开php.ini, 添加extension=memcached
配置项, 并将
<!-- lang: shell -->
session.save_handler = files
session.save_path = "/tmp"
改成
<!-- lang: shell -->
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中配置反向代理:
<!-- lang: shell -->
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的配置从略。
来源:oschina
链接:https://my.oschina.net/u/103999/blog/163547