В настоящее время у меня есть приложение php в разработке на экземпляре AWS EC2, но я решил переместить его в 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? Я хотел бы, чтобы мое приложение запускалось на экземплярах EC2 по умолчанию для Elan Beanstalk без использования пользовательских AMI. Я надеюсь, что такое простое использование php-сессий должно быть разрешено по умолчанию!
Перемещение вашего приложения в Elastic Beanstalk означает, что с этого момента ваше приложение будет запускаться на нескольких физических веб-серверах. (Это то, за что вы платите.) Это означает, что запрос с допустимым идентификатором сеанса может быть перенаправлен на сервер, который не имеет этого файла сеанса на диске (вы, похоже, используете обработчик сеанса на основе файлов, как показано в вопрос).
Раствор А (предпочтительный)
Вам необходимо хранить сеансы в общем месте, где они могут быть доступны для всех экземпляров вашего веб-сервера. Amazon обычно рекомендует DynamoDB для этого , но также может быть MySQL или Redis или даже Elastic Cache, предоставляемый AWS.
Решение B (более медленное, ненадежное, требует завершения SSL при балансировке нагрузки)
Настройте балансировщик нагрузки так, чтобы он использовал «липкие» сеансы. Это означает, что LB разворачивает пакеты HTTP (S), ищет файл cookie сеанса, а затем перенаправляет запрос на правильный веб-сервер, на котором работает сеанс.
На самом деле я нашел очень простое решение с двумя строками 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); ?>
Вы также можете добавить это в свой эластичный beanstalk файл project.config:
"/etc/httpd/conf.d/php.conf" : content: | php_value session.save_path "/tmp"
который просто установит путь сохранения сеанса для вас