AWS elastic beanstalk Nginx PHP 会话丢失

mpo*_*ozd 6 php nginx amazon-elastic-beanstalk

我最近开始使用新的 AWS Elasticbeanstalk Nginx (Amazon Linux 2)。我注意到在 Elasticbeanstalk 上进行任何部署或重新启动后,PHP 会话丢失(如果用户已登录,他将被注销)。之前我使用的是在 Apache 上运行的 Amazon Linux 1 版本,但没有遇到此问题,有什么方法可以在之后保持 PHP 会话吗?

Das*_*tic 3

这是由于 Amazon Linux 2 中的更改所致,其中 PHP 现在由 PHP-FPM systemd 服务托管(之前的 Amazon Linux 版本不使用 PHP-FPM 或 systemd)。ElasticBeanstalk 提供的默认 PHP 配置中跟踪会话的方法是使用目录中的文件/tmp。然而,systemd 的“PrivateTmp”默认是启用的,它会创建一个唯一的目录供 PHP-FPM 服务运行时使用。一旦 PHP-FPM 服务停止,systemd 就会删除这个特殊的“private” /tmp,从而删除所有会话文件。

每当 PHP ElasticBeanstalk 部署新版本时,此 PHP-FPM 服务就会停止并重新启动,从而导致会话丢失。

有几个选项可以解决这个问题:

-> 配置 PHP 使用 memcached/redis/etc 之类的东西来管理会话,而不是使用文件系统。这可能是最安全的解决方案。

或者,

-> 配置您的 Amazon Linux 2 ElasticBeanstalk 实例以处理/tmp正确目录中的这些会话文件,而不是/tmpsystemd 提供的“私有”目录。

通过将以下部署后配置脚本添加到项目的路径下可以轻松完成此操作:.platform/hooks/postdeploy/phpfpm_noprivatetmp.sh

#!/bin/bash -e

# change PrivateTmp from true to false, then reload/restart the systemd service
sed -i 's/PrivateTmp=true/PrivateTmp=false/' /usr/lib/systemd/system/php-fpm.service

# wait a moment...
sleep 2
sudo systemctl daemon-reload

# wait a moment...
sleep 2
sudo systemctl restart php-fpm.service
Run Code Online (Sandbox Code Playgroud)

这将禁用“PrivateTmp”功能,导致会话文件存储在“真实”/tmp目录中,并且部署站点的新版本将不再导致每个人都注销。