最近我们用python开发了一套SSO、然后权限系统一起的一次大更新上线,上线后发现SSO无法正常工作,但测试环境一直无问题。

问题描述

问题URL
http://sso.a.com/signin?redirect_uri=http://tomcat
正常URL
http://sso.a.com/signin?redirect_uri=http://b.c.com

排查

检查代码啥的发现没问题,把动态获取的host改成静态的域名,单启进程后正常,问题定位在nginx的负载上.

nginx domain配置文件

upstream tomcat {
         server 10.143.88.240:10086;
}
server {
                listen 80 ;
                server_name xxxx;
                gzip on;
                gzip_static on;
                gzip_vary on;
                gzip_proxied any;
                gzip_min_length     1000;
                gzip_buffers    4 8k;
                gzip_disable    "msie6";
                gzip_http_version 1.1;
                gzip_comp_level 5;
                gzip_types text/plain text/css text/javascript application/javascript application/x-javascript;

                location / {
                        proxy_pass http://tomcat;
                }

}

稍微思考一下,upstream中的name是一个变量,而做为变量即可得到后端地址,而不是直接给后端地址。

处理

将upstream中的name改成实际的域名,在这里即是b.c.com即可以获取,然后工作正常。

查看官主解释

默认情况下,nginx按加权轮转的方式将请求分发到各服务器。 在上面的例子中,每7个请求会通过以下方式分发: 5个请求分到backend1.example.com, 一个请求分到第二个服务器,一个请求分到第三个服务器。 与服务器通信的时候,如果出现错误,请求会被传给下一个服务器,直到所有可用的服务器都被尝试过。 如果所有服务器都返回失败,客户端将会得到最后通信的那个服务器的(失败)响应结果。