¿如何使用负载均衡器在 PHP 中共享会话?

问题描述

我正在尝试使用一些用户会话制作一个网络应用程序。 我正在使用的技术是这些: Linux Debian 10 破坏者。 PHP 7.3。 玛丽亚数据库。 阿帕奇 2.4。 一台服务器充当负载平衡器,两台主机具有 Web 应用程序。 这里的问题是我无法将登录用户的实际会话获取到 Web 中,因为负载均衡器向另一台主机创建了一个新请求,用户需要再次登录到 Web 中。 我尝试使用数据库服务器上的 NFS 共享文件夹来存储会话,但它有点不起作用。 使用来自具有 NFS 文件夹的数据库服务器的命令 watch ls /var/sessions_share 我可以看到在目录上创建的新会话文件,但 PHP 无法获取会话。 这是来自一台主机的脚本:

<?PHP
    session_start();

ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(E_ALL);

    $_SESSION['user'] = "User";

 ?>

这个脚本来自另一个主机:

<?PHP

session_start();

ini_set('display_errors',1);
error_reporting(E_ALL);

echo "User logged: ";

if(isset($_SESSION['user'])){
    echo $_SESSION['user'];
}

?>

执行此操作的最佳方法是什么? 我应该使用 NFS 还是更好更安全的另一种方式? 我试图找到其他方法来做到这一点,但不幸的是,大多数信息都已过时。 感谢您的帮助。

解决方法

你能做的最好的事情是使用一些东西来处理和存储会话:如果你使用的是 php7,你可以使用 redis,如果你使用的是 php5,你可以使用 memcache,如果你使用的是 oncloud,你可以使用一种解决方案,例如 elasticache 或您的提供商建议的解决方案。

这样,当服务器收到请求时,它会查询缓存服务并检索它需要的所有数据。您可以有 1、10 或 1000 个前端,但会话将始终保持一致,因为它由缓存服务处理。

不要在负载平衡器上使用粘性会话,因为如果您有很多人共享相同的公共 IP 地址(例如因为他们使用代理),您最终可能会在您的 Web 服务器之间共享不均匀的流量。