无法在 AWS 中获得粘性会话?

Posted

技术标签:

【中文标题】无法在 AWS 中获得粘性会话?【英文标题】:Can't get sticky sessions working in AWS? 【发布时间】:2017-12-24 22:46:23 【问题描述】:

我有一个在 EC2 上的 tomcat 实例中运行的 Web 应用程序,我无法在我的一生中获得粘性会话来在负载均衡器上工作。我已经按照http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html 中的所有步骤操作,尝试使用基于应用程序(使用 JSESSIONID cookie)和基于时间(使用 86400 秒)的方法,但无论哪种方式,它都不起作用。同一用户在所有不同的节点上不断被弹跳。每次他们点击网页上的新链接时,都会将他们弹回主屏幕以再次登录。

我不知道为什么它不起作用。我对这些东西也不太了解(哎呀,直到 2 小时前,我什至不知道“粘性会话”是什么意思——不,我不能让别人去做)所以我'我也不确定从哪里开始调试它。

编辑:查看我的 cookie.. AWSELB cookie 似乎在我每次加载网站时都会被删除和重写,而不是像预期的那样持续存在。

编辑 2:我的负载均衡器的 XML 配置:


    "LoadBalancerDescriptions": [
        
            "Subnets": [
                "subnet-5c83aa39",
                "subnet-6a778830",
                "subnet-c41cdde8"
            ],
            "CanonicalHostedZoneNameID": "Z35SXDOTRQ7X7K",
            "CanonicalHostedZoneName": "<ELB_NAME>-<redacted>.us-east-1.elb.amazonaws.com",
            "ListenerDescriptions": [
                
                    "Listener": 
                        "InstancePort": 5432,
                        "LoadBalancerPort": 5432,
                        "Protocol": "TCP",
                        "InstanceProtocol": "TCP"
                    ,
                    "PolicyNames": []
                ,
                
                    "Listener": 
                        "InstancePort": 8888,
                        "LoadBalancerPort": 8888,
                        "Protocol": "HTTP",
                        "InstanceProtocol": "HTTP"
                    ,
                    "PolicyNames": [
                        "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500995555135"
                    ]
                
            ],
            "HealthCheck": 
                "HealthyThreshold": 2,
                "Interval": 10,
                "Target": "HTTP:44554/",
                "Timeout": 8,
                "UnhealthyThreshold": 4
            ,
            "VPCId": "vpc-721bec0b",
            "BackendServerDescriptions": [],
            "Instances": [
                
                    "InstanceId": "i-0ca9c244ed930d58f"
                ,
                
                    "InstanceId": "i-0cf47dc916f3f3443"
                ,
                
                    "InstanceId": "i-09ce2f24abc50259f"
                
            ],
            "DNSName": "<ELB_NAME>-<redacted>.us-east-1.elb.amazonaws.com",
            "SecurityGroups": [
                "sg-f5ff638b"
            ],
            "Policies": 
                "LBCookieStickinessPolicies": [
                    
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500564994754",
                        "CookieExpirationPeriod": 86400
                    ,
                    
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500565103581",
                        "CookieExpirationPeriod": 0
                    ,
                    
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500566463445",
                        "CookieExpirationPeriod": 28800
                    ,
                    
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500566440580",
                        "CookieExpirationPeriod": 0
                    ,
                    
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500476922828",
                        "CookieExpirationPeriod": 86400
                    ,
                    
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500481383343",
                        "CookieExpirationPeriod": 86400
                    ,
                    
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500479370743",
                        "CookieExpirationPeriod": 86400
                    ,
                    
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500475843862",
                        "CookieExpirationPeriod": 86400
                    ,
                    
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500995555135",
                        "CookieExpirationPeriod": 86400
                    
                ],
                "AppCookieStickinessPolicies": [
                    
                        "PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500477157435",
                        "CookieName": "JSESSIONID"
                    ,
                    
                        "PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500472642494",
                        "CookieName": "JSESSIONID"
                    ,
                    
                        "PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500473344752",
                        "CookieName": "JSESSIONID"
                    ,
                    
                        "PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500473227851",
                        "CookieName": "JSESSIONID"
                    
                ],
                "OtherPolicies": []
            ,
            "LoadBalancerName": "<ELB_NAME>",
            "CreatedTime": "2017-07-18T15:32:33.890Z",
            "AvailabilityZones": [
                "us-east-1a",
                "us-east-1b",
                "us-east-1c"
            ],
            "Scheme": "internet-facing",
            "SourceSecurityGroup": 
                "OwnerAlias": "558554867759",
                "GroupName": "<redacted>"
            
        
    ]

编辑 3:有人吗?请我越来越绝望我需要这个工作......

【问题讨论】:

请捕获一些请求和响应标头以说明您的 cookie “被删除”。 @Michael-sqlbot 不知道该怎么做(同样,我对网络东西真的很陌生).. 我只是在 chrome 中查看 cookie 列表并注意到 AWSELB cookie 保留改变... 您能否使用 AWS CLI 发送负载均衡器配置的 XML 描述:aws elb describe-load-balancers --load-balancer-name my-loadbalancer 您是否曾经在 Application Load Balancer 上遇到过粘滞会话? 【参考方案1】:

首先这些粘性的东西是如何工作的! ELB 只是第一次添加一个 cookie AWSELB(或者可能是其他名称;您可以查找所有 cookie 并查看哪个不是您的)。此 cookie 还包含此请求应发送到哪个服务器的信息。

现在,来自同一浏览器的所有请求都将具有该 cookie,并且 ELB 知道要转发到哪里。这里没有什么是行不通的。

让我们做以下事情:

    你能把你正在尝试的网站/webapp 发给我吗?如果可以公开访问。因为即使我也可以调试它。

    确保允许使用 cookie;尽管从您的问题看来,这不是问题。

    您在 Edit Stickiness 上设置的有效期是多长!确保在 ELB 上时 --> 单击 Edit Stickiness --> 选择单选按钮“启用负载均衡器生成的 cookie 粘性”,最重要的是,将到期期限留空。

    如果您使用的是 HTTPS,也对 HTTPS 重复第 3 步。

让我知道它是否有效;我只在这里一个小时。

不知道为什么你的 XML 显示了这么多 LBCookieStickinessPolicies !!

【讨论】:

网站不向公众开放。允许使用 Cookie。有效期为空白。未使用 HTTPS。 正在考虑;我能想到的唯一可能的原因是你的服务器正在从 ELB 停止服务.. 你能去 ELB --> 监控 --> 健康的主机 --> 看看你的任何实例是否间歇性地不健康.我想让你尝试的另一件事是另一个浏览器。 服务器已经健康运行了 4 周,没有中断。一直在尝试使用 Chrome、Edge 和 Firefox 对不起,我对你没有帮助。如果你可以公开网站;我本来可以试试看饼干的。【参考方案2】:

您使用不同的配置创建了许多不同的策略,但只有一个与侦听器相关联,并且该策略是基于时间的。

"LoadBalancerDescriptions": [
    
        "Subnets": [
            "subnet-5c83aa39",
            "subnet-6a778830",
            "subnet-c41cdde8"
        ],
        "CanonicalHostedZoneNameID": "Z35SXDOTRQ7X7K",
        "CanonicalHostedZoneName": "<ELB_NAME>-<redacted>.us-east-1.elb.amazonaws.com",
        "ListenerDescriptions": [
            
                "Listener": 
                    "InstancePort": 5432,
                    "LoadBalancerPort": 5432,
                    "Protocol": "TCP",
                    "InstanceProtocol": "TCP"
                ,
                "PolicyNames": []
            ,
            
                "Listener": 
                    "InstancePort": 8888,
                    "LoadBalancerPort": 8888,
                    "Protocol": "HTTP",
                    "InstanceProtocol": "HTTP"
                ,
                "PolicyNames": [
 here ---->         "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500995555135"
                ]
            
        ],

文档指出了如何将策略与侦听器相关联:http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html#enable-sticky-sessions-duration

尝试仅将使用 JSESSIONID 的 AppCookieStickinessPolicies 之一关联到侦听器

【讨论】:

以上是关于无法在 AWS 中获得粘性会话?的主要内容,如果未能解决你的问题,请参考以下文章

EKS 上的 AWS NLB 粘性会话

如何使用 Cloudformation 模板在 AWS Elastic Beanstalk 中包含粘性会话

我可以在 AWS Elastic Beanstalk 中使用应用程序控制的会话粘性吗?

如何在每个页面上获得粘性页脚

如何在我的 WordPress 主题上获得粘性页脚?

气氛无法在 Glassfish 3.1.2 上获得会话