Пользователи берут сеансы других пользователей, когда сеансы хранятся в memcached (Rails)
У меня очень странная проблема при хранении моей сессии в Memcached. Время от времени некоторые пользователи берут сеанс других. Например. Джон, входит в систему как Мария, Мария как Крис и т.д.
Я использую Rails 2.3.4, но та же проблема случается с более ранними версиями Rails. Я использую только один сервер Memcache, и он работает на одном компьютере. Проблема с отладкой в том, что я не могу воспроизвести ее.
Я буду очень рад, если кто-нибудь поможет мне решить эту проблему или отладить ее. Я также буду рад, если вы используете Memcached для сеансов, и вы сообщаете свой пример confgs.
Это мои настройки:
# memcache options
memcache_options = {
:c_threshold => 10_000,
:compression => false,
:debug => false,
:namespace => 'app_prod',
:readonly => false,
:urlencode => false,
}
memcache_servers = ['localhost:11211']
CACHE = MemCache.new(memcache_options)
CACHE.servers = memcache_servers
config.cache_store = :mem_cache_store, memcache_servers, memcache_options
config.action_controller.session_store = :mem_cache_store
config.action_controller.session = {
:session_key => '_appname',
:cache => CACHE,
# :expires => 10,
# :session_expires => 10,
:secret => '5391aaaaaaaaaa56f8e8234beb638b97b32bbbbbbbbbbcc9dcae2beccccccccc89e8b508328def001a368da0678b061eb0e9d5a82a5ac94c8d35bd31a9a49e1'
}
Заранее спасибо,
Стан
Ответы
Ответ 1
Я видел это и считал его очень трудным для отладки.
Если вы используете пассажира, вам может потребоваться использовать консервативный метод для создания новых серверов.
Метод по умолчанию имеет серверы, совместно использующие один сокет в memcache.
Документы обсуждают это более подробно.
http://www.modrails.com/documentation/Users%20guide%20Apache.html#_example_1_memcached_connection_sharing_harmful
Ответ 2
Это может быть проблемой с переводом файла cookie сеанса между двумя значениями. Например, у вас может быть один, назначенный example.com, а другой - на www.example.com, обычная ситуация с некоторыми сайтами, которые отвечают на оба без перенаправления, чтобы сделать один канонический.
Поведение некоторых браузеров - отправить cookie, соответствующий самому длинному субдомену, тогда как другие действительно отправляют оба значения, и они могут отличаться. Это может привести к переключению сеанса между двумя разными значениями в непредсказуемое время.
Один из способов исправить это - заблокировать свои файлы cookie на .domain.com вместо того, чтобы позволить ему предполагать версию www или www-less, если это так, или перенаправление, чтобы принудительно использовать только один.
Другим способом диагностики характера сеанса является наличие страницы отладки, которая отображает идентификатор сеанса или встраивает ее в вывод страницы так, чтобы кто-то, столкнувшийся с проблемой, мог помочь в ее диагностике. Что-то вроде /session _info легко создать.
Ответ 3
Вот код, который решает проблему для меня:
Я добавил эти строки в конце
environment.rb
if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
if forked
CACHE.reset
if Rails.cache.class == ActiveSupport::Cache::MemCacheStore
Rails.cache.instance_variable_get(:@data).reset
end
end
end
end
Ответ 4
Я никогда раньше не сталкивался с такой проблемой, я просто не могу представить, что это происходит. Это мой conf:
require 'memcache'
memcache_options = {
:c_threshold => 10_000,
:compression => true,
:debug => false,
:namespace => "app-me",
:readonly => false,
:urlencode => false
}
memcache_servers = [ "#{MEMCACHED_HOST}:#{MEMCACHED_PORT}" ]
CACHE = MemCache.new memcache_options
CACHE.servers = memcache_servers
ActionController::Base.session_options[:expires] = 1800
ActionController::Base.session_options[:cache] = CACHE
# Inside the Rails initializer
config.action_controller.session_store = :mem_cache_store
Ответ 5
Dalli Gem может помочь. A недавний commit фиксированный совлокальный доступ к сокетам, чтобы вы могли посмотреть на их код и посмотреть, как они это сделали.