是否可以在least_conn模式下配置NGINX负载平衡器以使某些路径异常?
我希望以这样的方式配置负载均衡器,即单个登录操作所需的所有请求都发送到同一个后端应用程序实例。
我有前端应用程序访问重复的后端应用程序通过nginx负载均衡器。所有应用程序都部署在Tomcat 8.5上,后端实例配置了Tomcat之间的会话复制。
我的问题是,当使用OAuth-2.0 authorization_code授予方法对用户进行身份验证时,前端应用程序获得授权代码,但是由于通过负载均衡器连接后端,它试图使用该代码从另一台机器获得令牌,从而生成InvalidGrantException。
使用ip_hash模式或它的变体并不能解决这个问题,因为当应用程序通过VPN访问时,它是不稳定的。
发布于 2019-08-10 00:32:03
是的,你可以通过声明两个地点来实现你想要的结果,并对它们给予不同的对待。参见下面的示例,并检查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中找到确切的解决方案,我将执行以下操作:
add_header X-Upstream $upstream_addr;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验证标头。
https://stackoverflow.com/questions/57389709
复制相似问题