我在一组微服务前面有一个 Nginx 反向代理。当新客户端连接时,我理想情况下希望使用连接数最少的上游。他们将在响应主体中收到一个令牌,并在所有后续请求的标头中传递该令牌。
我希望同一个上游服务器处理与该令牌相关的所有未来请求。
使用“ip_hash”不起作用,因为我需要对来自同一源 IP 的请求进行负载平衡。(但使用不同的标头令牌)我无法对“map”进行硬编码,因为微服务是瞬态的。每个请求都必须通过“auth_request”,该请求能够公开具有正确上游 IP 的变量以进行连接,但我不确定如何代理传递给动态变量。
我已经将 Redis 和 Memcached 用于许多其他任务,我可以轻松地将“key = header token”、“value = 上游 IP”加载到其中任何一个中。但我再次不确定如何使用缓存值作为代理上游目标。我见过的大多数基于缓存的解决方案只能将缓存值作为客户端响应返回,而不能在“location”块中使用它进行进一步路由。
我愿意听取任何关于如何使用不依赖于硬编码映射或 IP/URI 散列的标头值将请求固定到特定上游的想法。
提前谢谢大家,我已经在这个问题上呆了 5 个多小时了。:(
答案1
我有同样的问题,我只想用“哈希”方法
upstream backend {
# if you use Tengine (https://github.com/alibaba/tengine)
# consistent_hash $http_customheadername;
hash $http_customheadername;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name test2.com;
default_type text/plain;
location / {
proxy_pass http://backend;
}
}
server {
listen 8080;
server_name _;
location / {
echo "8080";
}
}
server {
listen 8081;
server_name _;
location / {
echo "8081";
}
}
server {
listen 8082;
server_name _;
location / {
echo "8082";
}
}
您可以为标题设置唯一值。