CAS客戶端集群

jopen 12年前發布 | 73K 次閱讀 CAS OpenID/單點登錄SSO

環境變量定義

  • 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>

    網絡拓撲

    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的配置從略。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!