Подтвердить что ты не робот

Пользователи берут сеансы других пользователей, когда сеансы хранятся в 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'
}

Заранее спасибо, Стан

4b9b3361

Ответ 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 фиксированный совлокальный доступ к сокетам, чтобы вы могли посмотреть на их код и посмотреть, как они это сделали.