我一直在努力。
我在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就在标题中。
答案 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
已创建,其中包含STICKINESSID
和AWSELB
个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
的相同测试进行测试,无粘性。