Ⅰ. Issue Description
在一个或者多个配置文件内配置了多个upstream,且有一个以上的proxy_pass到这些upstream
Ⅱ. Describe what happened
第一次浏览器访问了其中一个环境后,浏览器再访问其他的环境就会出现502
Ⅲ. Describe what you expected to happen
浏览器访问所有配置的环境应该是正常的
Ⅳ. How to reproduce it (as minimally and precisely as possible)
1.共两组环境。其中2个real server分别配置一个到两个不同的upstream,tengine使用两个端口,比如8080,8090反向代理这两个upstream。
2.那么应该访问的地址分别为ip:8080,ip:8090
3.在浏览器访问其中一个环境后,再访问另一个则出现502
4.实际测试添加contextpath不影响测试结果
5.日志报错:no live upstream while connecting to upstream
6.另一个环境使用隐身窗口或者换一个浏览器可以正常访问,或者把proxy_pass代理的upstream更换为实际的ip:port也是正常访问的。
7.所以有可能是跟负载均衡的sticky_session有一些冲突存在?
Ⅴ. Anything else we need to know?
- If applicable, add nginx debug log doc .
2.使用默认参数编译安装nginx,复制tengine的配置文件过去,只取消掉sticky_session配置,浏览器访问无问题
3.或者取消掉tengine配置文件upstream段中的session_sticky也无问题
Ⅵ. Environment:
- Tengine version (use
sbin/nginx -V
):
2.3.2
- OS (e.g. from /etc/os-release):
centos6.8
- Kernel (e.g.
uname -a
): - Others:
2条答案
按热度按时间lqfhib0f1#
再次排查了一下,应该是cookie设置的作用域domain或者path路径的问题。
猜测是这样的:
先打开的环境有了一个cookie,但是默认的domain和path为空,导致后面打开的环境会使用这个cookie,而在这个环境中tengine根本就没有cookie的记录,于是就会提示upstream上层服务器没有存活。
猜测解决办法:
对于ip:port的访问是否能够设置session_sticky path=/aaa doamin=/aaa.test,这样路径和domain实际并不存在,不知道对访问环境是否有影响。
mqkwyuun2#
第二次请求的时候由于路由到另一个 Upstream , 而该 Upstream 中对应的 server 里面记录的session id 和另一个 Upstream 里面对应的session id不一样,所以导致不能匹配到对应的 server。一方面可以设置容灾策略(如,fallback选项),另一方面可以设置cookie作用域及路径,相关设置可以参考这个文档 http://tengine.taobao.org/document_cn/http_upstream_session_sticky_cn.html