NGINX + phpFPM负载均衡器和会话

4

我有一个问题,我正在使用 nginxPHPFPM

我正在使用 2个PHPFPM服务器的负载均衡器,为了保持来自两个phpfpm服务器的会话同步,我使用了memcached。

但是当我使用memcached时,我发现页面速度变慢

当我使用文件作为会话保存类型时,网站运行得更快,但是会话不会立即同步(我猜测文件被覆盖了)。我正在使用NFS共享会话。

请问有什么想法吗?如何在使用nginx负载均衡器为phpfpm服务器时同步会话?


“page is slowing down”是什么意思?这是一种视觉效果还是你进行了一些测量? - Andrej
1个回答

2
您在使用NFS覆盖memcached时可能看到的速度提升是一种本质上具有欺骗性的提升。PHP会话存储默认采用先来先服务的锁获取方式。这意味着对于同一个会话发送的两个并发请求将导致第一个请求锁定会话,直到PHP完成或您从代码中显式调用session_write_close()以释放锁为止。
但是,在基于文件的会话存储中,PHP依赖flock,而flock在NFS中无法工作。

NFS(版本2和3)协议不支持文件锁定

请参阅Unix StackExchange上的此答案

对于分布式会话存储,你很少需要慢的基于文件系统的锁定。大多数内存存储都更快。由于NFS通常无法处理flock调用,如果两个并发请求尝试写入同一个会话文件,则会导致会话损坏。换句话说,你看到的“更快”基本上是因为请求可能更快地破坏它们的会话,因为没有针对并发性的会话锁。
如果你的请求花费很长时间并且不需要会话,则最好在代码尽早完成会话后立即显式调用session_write_close,以便任何其他并发请求可以访问会话。这通常是当你正在执行大量长轮询请求到PHP(例如通过AJAX)时的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接