如何为NGINX负载均衡器设置例外

时间:2019-08-07 08:06:35

标签: nginx oauth-2.0 request load-balancing

是否可以在minimum_conn模式下配置NGINX负载均衡器以使某些路径例外?

我想以这样的方式配置负载均衡器:将单次登录操作所需的所有请求发送到同一后端应用程序实例。

我有前端应用程序通过nginx负载均衡器访问重复的后端应用程序。所有应用程序都部署在Tomcat 8.5上,后端实例已配置Tomcat之间的会话复制。

我的问题是,当用户使用OAuth-2.0authorization_code授予方法对用户进行身份验证时,前端应用会获取授权代码,但是由于通过负载均衡器与后端连接,它尝试使用此代码从另一台计算机获取令牌,从而导致InvalidGrantException。

使用ip_hash模式或它的变体版本不能解决此问题,因为通过VPN访问应用程序时不稳定。

1 个答案:

答案 0 :(得分:0)

是的,您可以通过声明两个位置并将它们区别对待来实现所需的功能。请参见下面的示例,并检查this question,其中解释了优先级的工作原理。

http {
  upstream myapp1 {
    least_conn;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
  }

  server {
    listen 80;

    location / {
        proxy_pass http://myapp1;
    }

    location /my-special-path/ {
        proxy_pass http://srv1.example.com;
    }
  }
}

以上是主要基于第一个要基于某些路径进行路由的语句的解决方案。如果您的问题更加复杂,即这些路径是动态创建的,那么您可以共享一个示例,以更容易理解您的具体情况。

更新

基于评论。我真的建议对您的后端进行故障排除,以便进行同步。话虽这么说,如果您真的想从nginx中找到确切问题的解决方案,我将执行以下操作:

  1. 每个响应中,我将添加一个特定的标头,特定的后端响应了此请求。 add_header X-Upstream $upstream_addr;
  2. 在此特定路径上,我将根据该标头的值提供请求。 proxy_pass http://$http_x_upstream;

所以配置看起来像这样:

http {
  ...

  server {
  ...
    location / {
        add_header  X-Upstream  $upstream_addr always;
        proxy_pass http://myapp1;
    }

    location /authorize/ {
        add_header  X-Upstream  $upstream_addr always;
        proxy_pass http://$http_x_upstream;
    }
  }
}

注意:安全性。如果您走这条路,请注意您将根据客户端可以操纵的值来路由请求。因此,请确保至少要验证此值。检查this answer以使用nginx验证标头。