Phusion Passenger 通过分叉现有进程来生成新服务器。之后,不同的进程共享代码。一方面,与例如 mongrel 服务器相比,这节省了大量内存。另一方面,如果未正确重置共享连接,这可能会使 memcached 感到困惑。
当用户会话混淆时,我曾经有过类似的经历。真的很吓人。
这个问题有两种解决方案:
1)配置Passenger使用“Conservative Spawning”而不是“Smart Spawning”。但是,您将完全失去共享内存的优势。或者
2) 确保在乘客产生新的服务器进程时重置 memcached 连接。我使用以下代码来执行此操作。把它放入config/initializers/memcached_reset.rb
if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
if forked
# Close duplicated memcached connections - they will open themselves
Rails.cache.instance_variable_get(:"@data").try(:reset) if Rails.cache.instance_variable_get(:"@data").respond_to?(:reset)
end
end
end
在此博客文章中找到一个稍微不同的示例。