我目前在AWS EC2实例上开发了一个php应用程序,但我决定将其移至Elastic Beanstalk以利用自动扩展功能。
虽然大多数应用程序完美地迁移到新的Elastic Beanstalk EC2实例,但我遇到了关于php会话的问题。根据php生成的以下消息,似乎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会话使用!
答案 0 :(得分:18)
将应用程序移动到Elastic Beanstalk意味着从现在开始,您的应用程序可能会在多个物理Web服务器实例上运行。 (这就是你要付出的代价。)这意味着具有有效会话ID的请求可以转发到不在磁盘上拥有该会话文件的服务器(您似乎正在使用基于文件的会话处理程序,如图所示)问题)。
解决方案A (首选)
您需要将会话存储在共享位置,以便所有Web服务器实例都可以访问它们。 Amazon typically recommends DynamoDB for this,但也可能是MySQL或Redis,甚至是AWS提供的弹性缓存。
解决方案B (更慢,不可靠,需要在负载均衡器处终止SSL)
以使用“粘性”会话的方式配置负载均衡器。这意味着L.B.将解包HTTP(S)数据包,查找会话cookie,然后将请求转发到会话所在的正确Web服务器。
答案 1 :(得分:0)
您也可以将它添加到弹性beanstalk project.config文件中:
"/etc/httpd/conf.d/php.conf" :
content: |
php_value session.save_path "/tmp"
只会为你设置会话保存路径
答案 2 :(得分:-1)
实际上我找到了一个非常简单的解决方案,只有两行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);
?>