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