【问题标题】:How to set exceptions for NGINX load balancer如何为 NGINX 负载均衡器设置例外
【发布时间】:2019-12-14 19:32:04
【问题描述】:

是否可以在 least_conn 模式下配置 NGINX 负载均衡器以对某些路径进行异常处理?

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

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

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

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

【问题讨论】:

    标签: nginx oauth-2.0 request load-balancing


    【解决方案1】:

    是的,您可以通过声明两个位置并区别对待它们来实现您想要的。请参阅下面的示例并检查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 验证标头。

    【讨论】:

    • 感谢您的回答。我真正想要的是将某个路径的两个连续请求始终传递给同一台机器。用户登录时总是有两次请求 /authorize 路径。问题是第二次请求使用 Oauth 2.0 授权码,需要传递给同一台机器以获得令牌。我不知道为什么,但即使后端应用程序之间的会话被复制,代码也仅在发出它的实例上有效。
    • 我根据您的评论更新了答案,我认为现在它更适合您的用例。
    • 这个答案最有帮助,尽管还不够。如果可以,我稍后会发布答案。
    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    相关资源
    最近更新 更多