【问题标题】:AWS Elastic Beanstalk and PHP sessionsAWS Elastic Beanstalk 和 PHP 会话
【发布时间】:2013-12-27 01:04:22
【问题描述】:

我目前在 AWS EC2 实例上开发了一个 php 应用程序,但我决定将其移至 Elastic Beanstalk 以利用自动缩放功能。

虽然大部分应用程序完美地迁移到了新的 Elastic Beanstalk EC2 实例,但我遇到了关于 php 会话的问题。好像是php session保存路径不可写,根据php生成的如下信息:

 Warning: Unknown: open(/var/lib/php/5.5/session/sess_uc1dpvmoq5fikcv0q2kogker15, O_RDWR)
 failed: Permission denied (13) in Unknown on line 0 Warning: Unknown: Failed to write
 session data (files). Please verify that the current setting of session.save_path is
 correct (/var/lib/php/5.5/session) in Unknown on line 0

有什么办法可以在不修改 PHP.ini 或 CHMODing 的情况下解决这个问题?我想让我的应用程序在默认的 Elastic Beanstalk EC2 实例上运行,而不使用自定义 AMI。我希望默认情况下应该允许如此简单地使用php会话!

【问题讨论】:

  • 默认情况下,php.ini 将会话目录设置为 /tmp,但 Elastic Beanstalk 上的最新 PHP 容器开始将其指向上面提到的 /var...,但没有适当的权限。这是 AWS 表示他们将在未来更新中修复的已知错误。目前,您最好的选择(对于本地会话)是使用 session_save_path() 在您的应用程序中尽早设置它,但您会遇到下面@hek2mgl 提到的多个服务器的问题。
  • 是否有指向 AWS 承认此问题的链接?

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


【解决方案1】:

将您的应用程序迁移到 Elastic Beanstalk 意味着从现在开始,您的应用程序可能会在多个物理 Web 服务器实例上运行。 (这就是您要支付的费用。)这意味着可以将具有有效会话 ID 的请求转发到磁盘上不拥有该会话文件的服务器(您似乎正在使用基于文件的会话处理程序,如问题)。

解决方案 A(首选)
您需要将会话存储在一个共享位置,您的所有 Web 服务器实例都可以访问它们。 Amazon typically recommends DynamoDB for this,但也可以是 MySQL 或 Redis,甚至是 AWS 提供的 Elastic Cache。

解决方案 B(速度较慢、不可靠,需要在负载平衡器处终止 SSL)
以使用“粘性”会话的方式配置负载均衡器。这意味着 L.B.将打开 HTTP(S) 数据包,查找会话 cookie,然后将请求转发到会话所在的正确 Web 服务器。

【讨论】:

  • @RyanParman 嘿! :) 很高兴看到我的回答下面的 AWS 人员之一。请问是否最好使用 dynamo db 实例而不是弹性缓存实例? (如果是,为什么?)
  • 这绝对取决于用例,所以很难说总体上哪个会更好。不过,Ryan 提供的链接确实包含了 DynamoDB 会话处理程序的一部分最佳实践。如果您的应用程序不允许您遵循这些,那么使用 ElastiCache 可能是更好的选择。
  • @JeremyLindblom 谢谢,将通过该文档。我对 AWS 比较陌生,仍然很难从所有可用的服务中选择最好的.. :)
【解决方案2】:

您也可以将其添加到弹性 beanstalk project.config 文件中:

"/etc/httpd/conf.d/php.conf" :
   content: |
     php_value session.save_path "/tmp"

这将为您设置会话保存路径

【讨论】:

  • 在 beanstalk 中仍然不是一个有效的解决方案,因为实例可以被销毁/可能有多个实例。
【解决方案3】:

实际上,我找到了一个非常简单的解决方案,只有 2 行 PHP 代码对我有用:

http://technosophos.com/2013/10/09/getting-php-sessions-work-aws-elastic-beanstalk.html

添加你的 php 就完成了。

<?php
$dir = sys_get_temp_dir();
session_save_path($dir);
?>

【讨论】:

  • 澄清一下,虽然这在您只有一台服务器时有效,但一旦您的服务扩大,它可能会失败 - 对吧??
  • 是的,这将使用 /tmp 目录中的文件基础会话(默认情况下)。如果用户在没有该文件的情况下访问另一台服务器,则不会有会话。我目前在我拥有的设置中看到了这一点 - 有 4 个服务器,我可以重新加载并在每次重新加载时登录/注销,具体取决于加载页面的服务器。
猜你喜欢
  • 2015-12-20
  • 2017-01-17
  • 2015-04-17
  • 2015-10-29
  • 2013-07-05
  • 2017-11-08
  • 2017-10-01
  • 2013-05-29
  • 2017-01-17
相关资源
最近更新 更多