首页 文章

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

提问于
浏览
2

我一直在努力 .

我在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在 Headers 中 .

1 回答

  • 2

    当使用 Application-Controlled Session Affinity时,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 Cookies :

    $ 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
    

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

    $ 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>
    Zone: <b>eu-west-1b</b>
    Internal IP: <b>10.0.0.21</b>
    Instance Id: <b>i-xxxxxxxx</b>
    Zone: <b>eu-west-1b</b>
    Internal IP: <b>10.0.0.21</b>
    Instance Id: <b>i-xxxxxxxx</b>
    Zone: <b>eu-west-1b</b>
    Internal IP: <b>10.0.0.21</b>
    Instance Id: <b>i-xxxxxxxx</b>
    Zone: <b>eu-west-1b</b>
    Internal IP: <b>10.0.0.21</b>
    Instance Id: <b>i-xxxxxxxx</b>
    Zone: <b>eu-west-1b</b>
    Internal IP: <b>10.0.0.21</b>
    Instance Id: <b>i-xxxxxxxx</b>
    Zone: <b>eu-west-1b</b>
    Internal IP: <b>10.0.0.21</b>
    Instance Id: <b>i-xxxxxxxx</b>
    Zone: <b>eu-west-1b</b>
    Internal IP: <b>10.0.0.21</b>
    ...

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

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

相关问题