如何为 NGINX 负载均衡器设置异常
How to set exceptions for NGINX load balancer
是否可以在 least_conn 模式下配置 NGINX 负载均衡器以对某些路径进行例外处理?
我想配置负载均衡器,使单次登录操作所需的所有请求都发送到同一个后端应用程序实例。
我有前端应用程序通过 nginx 负载平衡器访问重复的后端应用程序。所有应用程序都部署在 Tomcat 8.5 上,后端实例已在 Tomcat 秒之间配置会话复制。
我的问题是,当用户使用 OAuth-2.0 authorization_code 授权方法进行身份验证时,前端应用程序获取授权码,但由于通过负载均衡器连接到后端,它会尝试使用此代码从另一台机器获取令牌导致 InvalidGrantException。
使用 ip_hash 模式或其变体不能解决此问题,因为当通过 VPN 访问应用程序时它不稳定。
是的,您可以通过声明两个位置并区别对待它们来实现您想要的。请参阅下面的示例并检查 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 中找到确切问题的解决方案,我会执行以下操作:
- 在 每个 响应中,我将添加一个特定的 header 特定后端响应此请求。
add_header X-Upstream $upstream_addr;
- 在这条特定路径上,我将根据 header 的值来处理请求。
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 验证 headers。
是否可以在 least_conn 模式下配置 NGINX 负载均衡器以对某些路径进行例外处理?
我想配置负载均衡器,使单次登录操作所需的所有请求都发送到同一个后端应用程序实例。
我有前端应用程序通过 nginx 负载平衡器访问重复的后端应用程序。所有应用程序都部署在 Tomcat 8.5 上,后端实例已在 Tomcat 秒之间配置会话复制。
我的问题是,当用户使用 OAuth-2.0 authorization_code 授权方法进行身份验证时,前端应用程序获取授权码,但由于通过负载均衡器连接到后端,它会尝试使用此代码从另一台机器获取令牌导致 InvalidGrantException。
使用 ip_hash 模式或其变体不能解决此问题,因为当通过 VPN 访问应用程序时它不稳定。
是的,您可以通过声明两个位置并区别对待它们来实现您想要的。请参阅下面的示例并检查 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 中找到确切问题的解决方案,我会执行以下操作:
- 在 每个 响应中,我将添加一个特定的 header 特定后端响应此请求。
add_header X-Upstream $upstream_addr;
- 在这条特定路径上,我将根据 header 的值来处理请求。
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 验证 headers。