如何在ELB中使用aws应用程序生成的会话粘性

时间:2015-06-27 02:59:47

标签: java http cookies amazon-web-services amazon-elb

我一直在努力。

我在ELB后面的两个EC2实例上实现了一个非常简单的HTTP服务器。 HTTP服务器仅从标头中读取cookie,并在响应头中发回与响应相同的cookie。

在客户端,我使用

curl --cookie "mychannelid=mytest; Expires=Sat, 27-Jun-2017 02:48:17 GMT" --header "Accept-Language: en" "http://myelb.elb.amazonaws.com:8000/test"

另外,在elb上,我使用cookie名称mychannelid启用了应用程序粘性。但是当我运行这个系统时,我仍然有50/50的服务器分配。我该如何实现呢?

另一个信息是,如果在HTTP服务器上生成cookie,并发送回客户端,我也需要使用firefox访问HTTP服务器,然后我可以得到我想要的。如果我使用curl访问HTTP服务器,我就无法做到。我不知道为什么,我检查了数据包,cookie就在标题中。

1 个答案:

答案 0 :(得分:2)

使用应用程序控制会话关联时,ELB在技术上不会根据您的应用程序Cookie决定粘性,而是会为其分配自己的AWSELB Cookie,类似于基于持续时间的cookie,但是在与应用程序cookie相同的到期日期之后。因此,每当浏览器(或任何其他客户端)返回ELB时,它应该发送两个Cookie而不仅仅是应用程序。

首先,我们需要定期curl,而不是像--cookie "mychannelid=mytest"那样发送Cookie,而是将收到的Cookie保存到名为cookies.txt的文件中:

curl -c cookies.txt -v http://example.com/cookie.php 

(请注意,服务器上的cookie.php需要设置应用程序Cookie,对我来说,我称之为STICKINESSID并将值设置为tomtest31mar1030

显示返回cookie的卷曲输出:

...
* Added cookie STICKINESSID="tomtest31mar1030" for domain example.com, path /, expire 1459525228
< Set-Cookie: STICKINESSID=tomtest31mar1030; expires=Fri, 01-Apr-2016 15:40:28 GMT
* Added cookie AWSELB="85937D8F08DC213046BA84053FDD6504FB203E36C25DA455A6835969F6D49F8DF9878D0F954A8EC75B8EE2AE208ECFE0AC2CE02E2EDE8DD014D2F17F4C80301EDBC4AE5CC3EBD730BD3127FF8DAAD636359B592B73" for domain example.com, path /, expire 1459525228
< Set-Cookie: AWSELB=85937D8F08DC213046BA84053FDD6504FB203E36C25DA455A6835969F6D49F8DF9878D0F954A8EC75B8EE2AE208ECFE0AC2CE02E2EDE8DD014D2F17F4C80301EDBC4AE5CC3EBD730BD3127FF8DAAD636359B592B73;PATH=/;EXPIRES=Fri, 01-Apr-2016 15:40:28 GMT
...

即。文件cookies.txt已创建,其中包含STICKINESSIDAWSELB个Cookie:

$ cat cookies.txt 

#  Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

example.com FALSE   /   FALSE   1459525228  STICKINESSID    tomtest31mar1030
example.com FALSE   /   FALSE   1459525228  AWSELB  85937D8F08DC213046BA84053FDD6504FB203E36C25DA455A6835969F6D49F8DF9878D0F954A8EC75B8EE2AE208ECFE0AC2CE02E2EDE8DD014D2F17F4C80301EDBC4AE5CC3EBD730BD3127FF8DAAD636359B592B73

现在,让两个饼干都需要保持粘性,让我们测试在请求中发送它们:

$ for i in {1..20}; do curl --silent -b cookies.txt http://example.com/cookie.php | grep Instance; done
Instance Id: <b>i-xxxxxxxx</b><br/>Zone: <b>eu-west-1b</b><br/>Internal IP: <b>10.0.0.21</b><br/>
Instance Id: <b>i-xxxxxxxx</b><br/>Zone: <b>eu-west-1b</b><br/>Internal IP: <b>10.0.0.21</b><br/>
Instance Id: <b>i-xxxxxxxx</b><br/>Zone: <b>eu-west-1b</b><br/>Internal IP: <b>10.0.0.21</b><br/>
Instance Id: <b>i-xxxxxxxx</b><br/>Zone: <b>eu-west-1b</b><br/>Internal IP: <b>10.0.0.21</b><br/>
Instance Id: <b>i-xxxxxxxx</b><br/>Zone: <b>eu-west-1b</b><br/>Internal IP: <b>10.0.0.21</b><br/>
Instance Id: <b>i-xxxxxxxx</b><br/>Zone: <b>eu-west-1b</b><br/>Internal IP: <b>10.0.0.21</b><br/>
Instance Id: <b>i-xxxxxxxx</b><br/>Zone: <b>eu-west-1b</b><br/>Internal IP: <b>10.0.0.21</b><br/>
...

(假设http://example.com/cookie.php输出一些调试信息,您可以在其中看到ELB背后的实例的IP,因此您可以测试粘性)

这表明,在多个请求中保留了粘性。尝试不使用-b cookies.txt的相同测试进行测试,无粘性。