繁体   English   中英

AWS Elastic Beanstalk 和 PHP 会话

[英]AWS Elastic Beanstalk and PHP sessions

我目前在 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 会话!

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

解决方案A (首选)
您需要将会话存储在共享位置,以便所有Web服务器实例都可以访问它们。 亚马逊通常会为此推荐DynamoDB ,但也可能是MySQL或Redis,甚至是AWS提供的Elastic Cache。

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

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

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

这只会为你设置会话保存路径

如果您打算使用自动缩放,则意味着应用程序将被复制到不同的机器/实例,负载均衡器将在它们之间分布。

因此,您将无法使用 PHP 的默认会话功能或任何写入本地磁盘的解决方案。

检查您的 PHP 框架是否具有内置数据库会话。 CakePHP具有此功能并且效果很好。

https://book.cakephp.org/4/en/development/sessions.html#database-sessions

但根据我自己的经验,我可以说,如果每个 session 中有很多内容,或者如果您有很多打开的会话,则此数据库解决方案效果不佳。 对数据库的请求数量和数量可能会变得非常高,以至于超过 RDS 磁盘的 IOPS 限制。

实际上我找到了一个非常简单的解决方案,只有两行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);
?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM