Amazon ELB - Sticky session cookie 丢失
Amazon ELB - Sticky session lost of cookie
我在 Elastic Beanstalk 运行 上有一个 Node.js 应用程序,在负载均衡器后面的多个 ec2 实例上 (elb)。
由于我的应用程序需要,我不得不激活 session 粘性。
我使用我的自定义 cookie "sails.sid" 作为参考激活了 "AppCookieStickinessPolicy"。
问题是我的应用程序需要这个 cookie 才能正常工作,但是当我激活 session 粘性时(通过 Duration-Based Session 粘性或在我的情况下:Application-Controlled Session Stickiness),进入我的服务器的 headers 被修改,我丢失了我的自定义 cookie,它被 AWSELB (amazon ELB ) 饼干。
如何将负载均衡器配置为不替换我的 cookie?
如果我理解得很好,AppCookieStickinessPolicies 必须保留我的自定义 cookie,但事实并非如此。
我哪里做错了?
提前致谢
我的负载均衡器的描述:
{
"LoadBalancerDescriptions": [
{
"AvailabilityZones": [
"us-east-1b"
],
....
"Policies": {
"AppCookieStickinessPolicies": [
{
"PolicyName": "AWSConsole-AppCookieStickinessPolicy-awseb-e-y-AWSEBLoa-175QRBIZFH0I8-1452531192664",
"CookieName": "sails.sid"
}
],
"LBCookieStickinessPolicies": [
{
"PolicyName": "awseb-elb-stickinesspolicy",
"CookieExpirationPeriod": 0
}
],
"OtherPolicies": []
},
"ListenerDescriptions": [
{
"Listener": {
"InstancePort": 80,
"LoadBalancerPort": 80,
"InstanceProtocol": "HTTP",
"Protocol": "HTTP"
},
"PolicyNames": [
"AWSConsole-AppCookieStickinessPolicy-awseb-e-y-AWSEBLoa-175QRBIZFH0I8-1452531192664"
]
}
]
....
}
]
}
ELB 设置的粘性会话 cookie 用于识别集群中的哪个节点将请求路由到。
如果您在应用程序中设置您需要依赖的 cookie,然后期望 ELB 使用该 cookie,它将覆盖您设置的值。
尝试让 ELB 管理会话 cookie。
我花了很多时间尝试 ELB 粘性功能,并将来自同一客户端的请求路由到后端集群服务器中的同一台机器。
问题是,它并不总是 100% 有效,所以我不得不使用存储在 MySQL 中的会话编写备份程序。但后来,我意识到我不需要 ELB 粘性功能,我可以只使用 MySQL 会话系统。
写数据库session系统比较复杂,当然也有开销,每次http调用都不可避免的要查询数据库。但是,如果此查询使用主索引,还不错。
最大的优势是任何请求都可以到达任何服务器。或者,如果您的一台服务器挂掉,下一台也可以处理这项工作。对于真正具有弹性的应用程序,数据库会话系统是不可避免的。
我在 Elastic Beanstalk 运行 上有一个 Node.js 应用程序,在负载均衡器后面的多个 ec2 实例上 (elb)。
由于我的应用程序需要,我不得不激活 session 粘性。 我使用我的自定义 cookie "sails.sid" 作为参考激活了 "AppCookieStickinessPolicy"。
问题是我的应用程序需要这个 cookie 才能正常工作,但是当我激活 session 粘性时(通过 Duration-Based Session 粘性或在我的情况下:Application-Controlled Session Stickiness),进入我的服务器的 headers 被修改,我丢失了我的自定义 cookie,它被 AWSELB (amazon ELB ) 饼干。
如何将负载均衡器配置为不替换我的 cookie?
如果我理解得很好,AppCookieStickinessPolicies 必须保留我的自定义 cookie,但事实并非如此。 我哪里做错了?
提前致谢
我的负载均衡器的描述:
{
"LoadBalancerDescriptions": [
{
"AvailabilityZones": [
"us-east-1b"
],
....
"Policies": {
"AppCookieStickinessPolicies": [
{
"PolicyName": "AWSConsole-AppCookieStickinessPolicy-awseb-e-y-AWSEBLoa-175QRBIZFH0I8-1452531192664",
"CookieName": "sails.sid"
}
],
"LBCookieStickinessPolicies": [
{
"PolicyName": "awseb-elb-stickinesspolicy",
"CookieExpirationPeriod": 0
}
],
"OtherPolicies": []
},
"ListenerDescriptions": [
{
"Listener": {
"InstancePort": 80,
"LoadBalancerPort": 80,
"InstanceProtocol": "HTTP",
"Protocol": "HTTP"
},
"PolicyNames": [
"AWSConsole-AppCookieStickinessPolicy-awseb-e-y-AWSEBLoa-175QRBIZFH0I8-1452531192664"
]
}
]
....
}
]
}
ELB 设置的粘性会话 cookie 用于识别集群中的哪个节点将请求路由到。
如果您在应用程序中设置您需要依赖的 cookie,然后期望 ELB 使用该 cookie,它将覆盖您设置的值。
尝试让 ELB 管理会话 cookie。
我花了很多时间尝试 ELB 粘性功能,并将来自同一客户端的请求路由到后端集群服务器中的同一台机器。
问题是,它并不总是 100% 有效,所以我不得不使用存储在 MySQL 中的会话编写备份程序。但后来,我意识到我不需要 ELB 粘性功能,我可以只使用 MySQL 会话系统。
写数据库session系统比较复杂,当然也有开销,每次http调用都不可避免的要查询数据库。但是,如果此查询使用主索引,还不错。
最大的优势是任何请求都可以到达任何服务器。或者,如果您的一台服务器挂掉,下一台也可以处理这项工作。对于真正具有弹性的应用程序,数据库会话系统是不可避免的。