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) </ul>
網絡拓撲

集群原理
不管是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的配置從略。