tengine 配置两个upstream后在浏览器分别访问出现502错误

kcrjzv8t  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(503)

Ⅰ. 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?

  1. 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:
lqfhib0f

lqfhib0f1#

再次排查了一下,应该是cookie设置的作用域domain或者path路径的问题。
猜测是这样的:
先打开的环境有了一个cookie,但是默认的domain和path为空,导致后面打开的环境会使用这个cookie,而在这个环境中tengine根本就没有cookie的记录,于是就会提示upstream上层服务器没有存活。

猜测解决办法:
对于ip:port的访问是否能够设置session_sticky path=/aaa doamin=/aaa.test,这样路径和domain实际并不存在,不知道对访问环境是否有影响。

mqkwyuun

mqkwyuun2#

第二次请求的时候由于路由到另一个 Upstream , 而该 Upstream 中对应的 server 里面记录的session id 和另一个 Upstream 里面对应的session id不一样,所以导致不能匹配到对应的 server。一方面可以设置容灾策略(如,fallback选项),另一方面可以设置cookie作用域及路径,相关设置可以参考这个文档 http://tengine.taobao.org/document_cn/http_upstream_session_sticky_cn.html

相关问题