首页 > 解决方案 > ¿ 如何使用负载均衡器在 PHP 中共享会话?

问题描述

我正在尝试制作一个包含一些用户会话的网络应用程序。我使用的技术是:Linux Debian 10 buster。PHP 7.3。玛丽亚数据库。阿帕奇 2.4。有一台服务器充当负载均衡器,两台主机拥有 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);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

echo "User logged: ";

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

?>

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

标签: phpdatabaseapachesessioncluster-computing

解决方案


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

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

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


推荐阅读