在Elastic Beanstalk中维护会话

5
随着Amazon Elastic Beanstalk中实例数量的不断变化,如果一个应用程序是用PHP构建的,那么如何在多个实例之间维护会话?我们如何确保不删除父实例(即应用程序启动时的第一个实例)?

1
EIP 将与您的终止实例解除关联。通常,我只需将 Web 域 CNAME 映射到 Elastic Beanstalk 环境 URL,参见 使用自定义域 - study
不会被映射到新实例。 - study
@study 那么这个问题的解决方案是什么? - user1765876
不要将 EIP 分配给您的实例(仅在需要登录特定实例时使用)。解决方案就像我之前说的那样,只需将 Web 域 CNAME 映射到 Elastic Beanstalk 环境 URL。 - study
@study 我可以指向一个IP,而不是像pro-elasticbean.com这样的地址。 - user1765876
显示剩余5条评论
7个回答

9

弹性 Beanstalk 完全不使用 Dynamo。 - user1765876
1
@user1765876,您可以设置Elastic Beanstalk来使用DynamoDB。请参阅AWS Elastic Beanstalk开发人员指南 - study
1
Jim是正确的。您可以创建一个DynamoDB表,然后使用AWS SDK for PHP中的DynamoDB Session Handler,将DynamoDB用作$_SESSION超全局变量的后端。 - Ryan Parman
如何在WordPress中访问会话变量 http://silvermapleweb.com/using-the-php-session-in-wordpress/ - nu everest

3
如果一个应用程序是用PHP构建的,那么如何在多个实例之间维护会话?
不。Elastic Beanstalk不会在多个实例之间维护会话。您必须自己在多个实例之间维护会话。如果启用了弹性负载均衡会话粘性,它只会确保将用户转发到相同的实例。
如何确保不删除父实例(应用程序启动时的第一个实例)?
Elastic Beanstalk自动缩放使用默认终止策略,它将首先终止最旧的实例。您可以修改Elastic Beanstalk自动缩放终止策略以避免首先终止最旧的实例。

弹性负载均衡会话粘滞是什么意思?默认情况下是禁用的。 - user1765876
我还是有些困惑,黏性特性默认是禁用的,那我应该启用它吗?如果我不启用它会怎样? - user1765876
1
如果启用它,您的用户请求将被定向到同一EC2实例。因此,您不需要关注会话复制问题。如果禁用它,弹性负载平衡将轮询选择一个EC2实例来处理您的用户请求。但是某些EC2实例没有用户会话,您的用户可能会从系统中注销。 - study
但是缩减 EC2 实例(Scaling in)也可能导致用户丢失状态。 - study

2
这是一个使用DynamoDB和Tomcat配置持久会话的教程。 https://packageprogrammer.wordpress.com/2014/01/13/aws-elastic-beanstalk-and-dynamodb-session-manager-for-tomcat/ AWS项目:https://github.com/aws/aws-dynamodb-session-tomcat 使用DynamoDB管理Tomcat会话状态:http://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-tomcat-session-manager.html 上述链接的关键摘录。请注意,由于该教程使用Tomcat 7和aws-dynamodb-session-tomcat的1.0.1版本,您可能需要更改版本号。
Tomcat的配置:
aws-dynamodb-session-tomcat下载AmazonDynamoDBSessionManagerForTomcat-2.0.4.jar,并将其复制到Tomcat安装的lib目录中 编辑context.xml以使用以下代码jar:
<?xml version='1.0' encoding='utf-8'?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Manager className="com.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager"
             createIfNotExist="true" />
</Context>

弹性 Beanstalk 的配置:
aws-dynamodb-session-tomcat 下载 AmazonDynamoDBSessionManagerForTomcat-2.0.4.jar,并将其复制到 WAR 的 .ebextensions 目录中。 编辑 context.xml,并将其复制到 WAR 的 .ebextensions 目录中。代码如下: 在 .ebextensions 目录中(记住它必须在 /WEB-INF 目录或 Grails 应用程序的 /web-app 中),创建一个 .config 文件,以编写执行替换 context.xml 并将 jar 复制到 Beanstalk 实例中的命令。
container_commands:
  01-copy-aws-library:
    command: "cp WEB-INF/.ebextensions/AmazonDynamoDBSessionManagerForTomcat-2.0.4.jar.jar /usr/share/tomcat8/lib/"
  02-replace-tomcat-context:
    command: "cp WEB-INF/.ebextensions/context.xml /etc/tomcat8/context.xml"

现在,只需上传并部署带有更改的war文件。尝试登录并进入AWS控制台->服务->DynamoDB,查找名称为Tomcat_SessionState的表格,就可以实现亲和性和持久性了!

1

从个人经验来看,我建议将会话移动到数据库(RDS|DynamoDB|SimpleDB)或缓存服务器(AWS 最近开始支持 Redis)。这样做可以避免应用程序在扩展或因失败的健康检查而终止时带来很多麻烦。


0

为了存储会话,使用Redis在弹性缓存上是更好的选择。免费层级中有一个t1.micro节点可供使用,并由Amazon维护,因此您可以获得稳定、便宜和快速的会话存储,这些存储在自动扩展环境中的节点之间共享。如何配置PHP以在Redis中保留会话,我想您可以在互联网上找到。

使用DynamoDB的选项可能会很昂贵,因为您将为每次调用DynamoDB服务付费,此外,您需要考虑AWS通过HTTP(S)公开的服务可能会限制请求。


0
我认为管理这个问题的唯一方法是将会话存储在DynamoDB或类似的数据库中。 当我们在弹性Bean环境中部署基于Java的应用程序时,遇到了完全相同的问题。 当负载均衡器缩减实例时,任何连接到该实例的用户都会自动注销。 将会话移动到DynamoDB为我们解决了这个问题。

0

当使用典型的Java Web应用程序与Elastic Beanstalk时,我认为您一定会想要启用会话粘滞。否则,用户浏览器的每个HTTP请求都可能被路由到不同的服务器。

为了解决用户会话在他们所“粘附”的服务器关闭时被销毁的问题,您需要研究Tomcat会话复制。不幸的是,这不是Elastic Beanstalk默认提供的功能,因此为了设置会话复制,您需要为应用程序创建自定义的Elastic Beanstalk AMI。此外,您必须使用一个不依赖于组播的Tomcat会话复制实现,因为组播在AWS或我所知道的任何其他云环境中都不可用。一个不依赖于组播的实现示例是使用数据库(如Amazon RDS)或memcached服务器(如Amazon Elastic Cache)使会话在多个Tomcat实例之间可用。

还要注意的是,Elastic Beanstalk UI仅允许您启用负载均衡器生成的HTTP cookie。但是,在Elastic Beanstalk创建负载均衡器后,您可以进入EC2控制台并修改负载均衡器的设置,将其切换为应用程序生成的HTTP cookie,然后告诉它使用“JSESSIONID” cookie。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接