`

nginx集群时遇到双认证中心的单点登录

阅读更多

1.项目背景

目前OA和认证中心CA分别部署了2套tomcat。即机器1有OA1和CA1.机器2有OA2和CA2。两个tomcat分别对应电信和联通的外网。其他系统分别有APP1、APP2等。

用户可从CA1或者CA2统一登录。如果从CA1登录后,会跳到OA1的首页,OA1上有APP1、APP2等连接,单击连接后应该从CA1得到Token,第三方得到Token后,应该去CA1认证通过后跳到第3方系统主页或其他页面。从CA2登录亦然。

 

目前需要使用nginx集群OA1/OA2和CA1/CA2

 

2.关键问题

 

因OA原来都是使用Session,所有nginx使用ip-hash策略。可把固定IP被分配到固定的服务器。nginx实际地址配置到原来的2个tomcat。

OA或者第3方得到token后,返回CA认证,使用的httpClient。从第3方应用服务器端返回认证时无法区分是哪个CA产生token,所以验证失败。

3.解决方案

 

使用memcache。把Token信息保存在分布式缓存服务器上。key包括”sessionIds_${用户账号}“和"token_${SessoionIds}",value类型分布式list和String。第三方发回Token认证时,根据账号得到sessionIds,逐个得到sessionIds对应的Token来比较。

 

3.nginx.conf配置文件如下.

#user  nobody;

worker_processes  1;

 

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

 

#pid        logs/nginx.pid;

 

 

events {

    worker_connections  1024;

}

 

 

http {

    include       mime.types;

    default_type  application/octet-stream;

 

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

    #                  '$status $body_bytes_sent "$http_referer" '

    #                  '"$http_user_agent" "$http_x_forwarded_for"';

 

    #access_log  logs/access.log  main;

 

    sendfile        on;

    #tcp_nopush     on;

 

    #keepalive_timeout  0;

    keepalive_timeout  65;

 

    #gzip  on;

    upstream local_tomcat {  

        ip_hash; 

#server 10.200.5.134:8080; 

server 10.200.1.229:7080; 

server 172.20.38.4:8088; 

    }  

 

    server {

        listen       80;

        server_name  localhost;

 

        #charset koi8-r;

 

        #access_log  logs/host.access.log  main;

 

        location  /  {

            #root   html;

            #index  index.html index.htm;

            index http://local_tomcat/sso2/main.jsp;

   proxy_pass http://local_tomcat;

        }

 

  location ~ (.jsp)|(.action)|(.do)|(.ftl)$                              ###所以jsp、do的动态请求都交给后面的tomcat处理     

   {     

   proxy_pass  http://local_tomcat;     

   proxy_redirect off;     

   proxy_set_header HOST $host;     

   proxy_set_header X-Real-IP $remote_addr;     

   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;     

   client_max_body_size 10m;     

   client_body_buffer_size 128k;     

   proxy_connect_timeout 90;     

   proxy_send_timeout 90;     

   proxy_read_timeout 90;     

   proxy_buffer_size 4k;     

   proxy_buffers 4 32k;     

   proxy_busy_buffers_size 64k;     

   proxy_temp_file_write_size 64k;     

  } 

 

 

#location ~ \.jsp$ {

# proxy_pass http://localhost:8080;

#}

 

#location ~ \.(html|js|css|png|gif)$ {

# root D:/apache/apache-tomcat-7.0.47/webapps/ROOT;

#}

        #error_page  404              /404.html;

 

        # redirect server error pages to the static page /50x.html

        #

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

 

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80

        #

        #location ~ \.php$ {

        #    proxy_pass   http://127.0.0.1;

        #}

 

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

        #

        #location ~ \.php$ {

        #    root           html;

        #    fastcgi_pass   127.0.0.1:9000;

        #    fastcgi_index  index.php;

        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

        #    include        fastcgi_params;

        #}

 

        # deny access to .htaccess files, if Apache's document root

        # concurs with nginx's one

        #

        #location ~ /\.ht {

        #    deny  all;

        #}

    }

 

 

    # another virtual host using mix of IP-, name-, and port-based configuration

    #

    #server {

    #    listen       8000;

    #    listen       somename:8080;

    #    server_name  somename  alias  another.alias;

 

    #    location / {

    #        root   html;

    #        index  index.html index.htm;

    #    }

    #}

 

 

    # HTTPS server

    #

    #server {

    #    listen       443 ssl;

    #    server_name  localhost;

 

    #    ssl_certificate      cert.pem;

    #    ssl_certificate_key  cert.key;

 

    #    ssl_session_cache    shared:SSL:1m;

    #    ssl_session_timeout  5m;

 

    #    ssl_ciphers  HIGH:!aNULL:!MD5;

    #    ssl_prefer_server_ciphers  on;

 

    #    location / {

    #        root   html;

    #        index  index.html index.htm;

    #    }

    #}

 

}

 

分享到:
评论

相关推荐

    PHP面试大全-基础篇

    - **AJAXP3P**:可能是指使用AJAX技术实现的多站点间的单点登录解决方案。 - **多站点登录**:指用户在一个站点登录后,可以无需再次登录即可访问其他相关联的站点。 **2.3 PHP SPL** - **SPL(Standard ...

    java毕业设计&课设-仿斗鱼直播小程序.zip

    7. **负载均衡与集群**:随着用户量的增长,可能需要部署在多个服务器上,以实现负载均衡,避免单点故障。Nginx或HAProxy等工具可以帮助分配请求到不同的服务器。 8. **云服务集成**:为了方便部署,项目可能利用了...

    基于PHP的财经直播聊天系统php版v2.0源码.zip

    10. 负载均衡与高可用:随着用户量增长,可能需要考虑负载均衡和服务器集群,通过Nginx、Apache等服务器软件进行反向代理,分发请求,提高系统可用性和稳定性。 11. 测试与部署:系统开发完成后,需要进行单元测试...

    某开奖投注平台源码

    8. **负载均衡与集群**:对于高并发的投注平台,源码可能包含了负载均衡策略,如Nginx反向代理,以及应用服务器集群配置,以应对大量用户访问。 9. **日志管理**:为了方便问题排查和性能监控,源码中通常会有日志...

    基于Java的即时通讯工具设计与代码实现

    本文将深入探讨如何使用Java语言来设计并实现一个即时通讯工具,涵盖了从架构设计到具体代码实现的关键知识点。 1. **基础架构** - **TCP/IP协议**:即时通讯工具的核心是建立可靠的网络连接,Java通过Socket编程...

    视频会议系统后端源码基于springboot开发.zip

    - **负载均衡与集群**:大型系统通常需要考虑负载均衡和集群部署,如使用Nginx等反向代理服务器进行负载分发,提高系统可用性和扩展性。 总结而言,这个基于SpringBoot的视频会议系统后端源码展示了如何利用...

    网络聊天室

    9. **负载均衡与集群**:对于大型聊天室,可能需要使用Nginx做反向代理,以及Docker容器化部署,实现负载均衡和扩展性。 10. **安全性**:防止XSS(跨站脚本攻击)和CSRF(跨站请求伪造)等网络安全问题,使用HTTPS...

    chatapp

    7. **用户认证与授权**:确保用户安全登录和权限管理是聊天应用的重要组成部分。理解OAuth2.0或JWT(JSON Web Tokens)等身份验证机制,并使用Spring Security等框架可以简化这一过程。 8. **用户界面**:尽管题目...

    gateway-assignments

    10. **负载均衡与集群**:了解如何使用Nginx或其他工具实现负载均衡,提高服务的可用性和性能。 通过完成这样的"gateway-assignments",开发者可以提升JavaScript编程技能,同时深入理解网关在现代Web应用中的作用...

    聊天服务器

    此时,我们需要考虑负载均衡和水平扩展,比如使用Nginx反向代理或使用集群技术如PM2。 10. **安全实践**:最后,必须关注服务器的安全性。这包括数据加密、防止SQL注入、XSS攻击以及DDoS防护等措施。 综上所述,...

Global site tag (gtag.js) - Google Analytics