我有 NGINX 作为反向代理和两个 Apache 作为上游服务器。
每当我访问 example.com(定向到 NGINX)时,两个 Apache 服务器都会收到 GET 请求。这似乎很奇怪,因为 NGINX 默认基于轮询方法工作
这是我的配置:-
upstream apache {
server 172.18.0.164;
server 172.18.8.18;
}
location / {
proxy_pass http://apache;
}
登录 Apache 1 机器:-
192.168.10.236 - - [05/Oct/2015:07:59:21 -0400] "GET / HTTP/1.0" 200
登录 Apache 2 机器:-
172.18.8.97 - - [05/Oct/2015:11:59:27 +0000] "获取 /wordpress/ HTTP/1.0"
答案1
直接来自Nginx 管理指南:
启用会话持久性
NGINX Plus 支持三种会话持久化方法。这些方法通过黏指示。
这粘性饼干方法。使用此方法,NGINX Plus 会将会话 cookie 添加到上游组的第一个响应中,并标识发送响应的服务器。当客户端发出下一个请求时,它将包含 cookie 值,并且 NGINX Plus 会将请求路由到相同的上游服务器:
upstream backend {
server backend1.example.com;
server backend2.example.com;
sticky cookie srv_id expires=1h domain=.example.com path=/;
}
示例中,srv_id
参数设置要设置或检查的 Cookie 的名称。可选参数expires
设置浏览器保留 Cookie 的时间。可选参数domain
定义设置 Cookie 的域。可选参数path
定义设置 Cookie 的路径。这是最简单的会话持久化方法。
这粘性路由方法。使用此方法,NGINX Plus 将在收到第一个请求时为客户端分配一个“路由”。所有后续请求都将与路线参数服务器指令用于标识将代理请求的服务器。路由信息取自 cookie 或 URI。
upstream backend {
server backend1.example.com route=a;
server backend2.example.com route=b;
sticky route $route_cookie $route_uri;
}
这cookie 学习方法。使用这种方法,NGINX Plus 首先通过检查请求和响应来查找会话标识符。然后 NGINX Plus“学习”哪个上游服务器对应哪个会话标识符。通常,这些标识符在 HTTP cookie 中传递。如果请求包含已“学习”的会话标识符,NGINX Plus 会将请求转发到相应的服务器:
upstream backend {
server backend1.example.com;
server backend2.example.com;
sticky learn
create=$upstream_cookie_examplecookie
lookup=$cookie_examplecookie
zone=client_sessions:1m
timeout=1h;
}
在示例中,其中一个上游服务器通过在响应中设置 cookie“EXAMPLECOOKIE”来创建会话。
必选参数create
指定一个变量,指示如何创建新会话。在我们的示例中,新会话是根据上游服务器发送的 cookie“EXAMPLECOOKIE”创建的。
必选参数lookup
指定如何搜索现有会话。在我们的示例中,在客户端发送的 cookie“EXAMPLECOOKIE”中搜索现有会话。
必选参数zone
指定一个共享内存区域,其中保存有关粘性会话的所有信息。在我们的示例中,该区域已命名client_sessions
,大小为 1 兆字节。
这是一种更复杂的会话持久方法,因为它不需要在客户端保留任何 cookie:所有信息都保存在服务器端的共享内存区域中。