在Elastic Beanstalk中维护会话

时间:2013-09-07 10:51:51

标签: php linux session amazon-web-services elastic-beanstalk

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

7 个答案:

答案 0 :(得分:9)

AWS博客上的这篇文章描述了如何使用DynamoDB使用AWS SDK for PHP进行会话状态处理。

http://aws.typepad.com/aws/2012/04/scalable-session-handling-in-php-using-amazon-dynamodb.html

答案 1 :(得分:3)

  

如果应用程序是用PHP构建的,那么会话将如何维护   在几个实例中?

没有。 Elastic Beanstalk不会在多个实例之间维护会话。您必须自己在多个实例之间维护会话。如果启用Elastic Load Balancing会话粘性,则只能确保将用户转发到同一实例。

  

我们如何确保不删除Parent实例(第一个   应用程序启动时的实例

Elastic Beanstalk Auto Scaling使用Default Termination Policy,它将首先终止最旧的实例。您可以修改Elastic Beanstalk Auto Scaling终止策略,以避免首先终止最旧的实例。

答案 2 :(得分:1)

根据个人经验,我建议将会话移动到数据库(RDS | DynamoDB | SimpleDB)或缓存服务器(AWS最近开始支持Redis)。当应用程序开始扩展或因不成功的健康检查而终止时,将会非常头痛。

答案 3 :(得分:1)

这是一个如何使用DynamoDB和Tomcat配置持久会话的教程。 https://packageprogrammer.wordpress.com/2014/01/13/aws-elastic-beanstalk-and-dynamodb-session-manager-for-tomcat/

AWS Project: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

以上链接的摘录摘录。请注意,您可能有更改版本号,因为本教程使用的是aws-dynamodb-session-tomcat的Tomcat 7和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>

Elastic Beanstalk的配置

aws-dynamodb-session-tomcat下载AmazonDynamoDBSessionManagerForTomcat-2.0.4.jar并释放并复制到WAR的.ebextensions目录中 使用下面的代码编辑context.xml并复制到WAR的.ebextensions目录中 在.ebextensions目录中(记住它必须在/ WEB-INF目录下,/ web-app用于grails应用程序),创建一个.config文件来编写命令以执行context.xml的替换并复制Beanstalk实例中的jar

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"

现在,只需使用更改上传和部署战争。尝试登录并进入AWS Console-&gt; Services-&gt; DynamoDB,查找名为Tomcat_SessionState和voilà的表格!你有亲和力和坚持!

答案 4 :(得分:0)

更好的选择在Elastic Cache上使用Redis来存储会话。一个t1.micro节点可在免费层上使用并可由亚马逊维护,因此您可以获得稳定,快速和快速的会话存储,在自动调节环境中的节点之间共享。如何配置PHP以保持Redis中的会话我想你可以在互联网上找到。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

将Elastic Beanstalk与典型的Java webapp一起使用时,我认为您肯定希望启用会话粘性。否则,来自用户浏览器的每个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。