Пользователи берут сеансы других пользователей, когда сеансы хранятся в memcached (Rails).

У меня очень странная проблема при сохранении моей сессии в Memcached. Время от времени одни пользователи забирают сеанс у других. Например. Джон войдет в систему как Мария, Мария как Крис и так далее.

Я использую Rails 2.3.4, но та же проблема возникает и с более ранними версиями Rails. Я использую только один сервер Memcache, и он работает на той же машине. Проблема с отладкой в ​​том, что я не могу это воспроизвести.

Я буду очень рад, если кто-нибудь подскажет, как решить эту проблему или отладить ее. Я также буду рад, если вы используете Memcached для сеансов и поделитесь своими примерами конфигурации.

Это мои конфигурации:

# 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'
}

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


person Stan Bright    schedule 06.10.2009    source источник


Ответы (5)


Я видел это, и мне было очень трудно его отлаживать.

Если вы используете пассажира, вы можете рассмотреть использование консервативного метода для создания новых серверов.

По умолчанию серверы используют один сокет для memcache.

Документы обсуждают это более подробно. http://www.modrails.com/documentation/Users%20guide%20Apache.html#_example_1_memcached_connection_sharing_harmful

person AndyWatts    schedule 14.10.2009
comment
Да, пользуюсь Пассажиром. Я протестирую его на обоих своих приложениях и поделюсь результатами здесь. Большое спасибо за вашу помощь. Я чувствую, что проблема здесь. - person Stan Bright; 15.10.2009
comment
Я завидую твоему носу, но я бы не стал отмечать ответ как правильный, пока результат не будет проверен - person zvolkov; 27.10.2009

Это может быть проблема с переключением между двумя значениями файла cookie сеанса. Например, один из них может быть назначен для example.com, а другой — для www.example.com. Это обычная ситуация с некоторыми сайтами, которые отвечают на оба без перенаправления, чтобы сделать один из них каноническим.

Поведение некоторых браузеров заключается в отправке файла cookie, соответствующего самому длинному поддомену, в то время как другие фактически отправляют оба значения, и они могут отличаться. Это может привести к переключению сеанса между двумя разными значениями в непредсказуемое время.

Один из способов исправить это — заблокировать ваши файлы cookie для .domain.com вместо того, чтобы позволить им использовать версию с www или без www, если это так, или перенаправить, чтобы принудительно использовать только одну.

Еще один способ диагностировать характер ситуации сеанса — создать страницу отладки, на которой отображается идентификатор сеанса, или как-то внедрить его в выходные данные страницы, чтобы тот, кто столкнулся с проблемой, мог помочь в ее диагностике. Что-то вроде /session_info легко создать.

person tadman    schedule 06.10.2009
comment
ОК, у меня есть этот параметр конфигурации: ActionController::Base.session_options[:session_domain] = '.mysite.com' Я думаю, что этот параметр конфигурации означает, что приложение должно будет использовать один сеанс для всех поддоменов, включая основной (mysite.com ). Кроме того, можете ли вы дать дополнительный совет, что мне делать, если я увижу session_id проблемного пользователя? - person Stan Bright; 07.10.2009
comment
Это способ правильно установить файл cookie, так что многое должно работать. Если вы хотите приключений, вы можете просмотреть файл production.log, для которого используются значения session_id. Обычно, когда один пользователь переключается на другого, это происходит из-за того, что сеансы смешиваются. Если это не так, по крайней мере, вы можете сосредоточить свой поиск в других областях. - person tadman; 07.10.2009
comment
Да, я думаю, что сессии путаются, и я ищу решение этой проблемы. - person Stan Bright; 07.10.2009

Вот код, который решает проблему для меня:

Я добавил эти строки в конце

окружающая среда.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
person Stan Bright    schedule 03.11.2009

Я никогда раньше не сталкивался с такой проблемой, я просто не могу представить, что это вообще происходит. Это моя конфа:

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
person khelll    schedule 06.10.2009
comment
Как видите, единственное отличие моих memcache_options в том, что я не использую :compression. Однако я не думаю, что это должно быть проблемой. В обоих приложениях, у которых есть проблемы с сеансом, я настроил такие редиректы: mysite.com =› mysite.com . У вас есть переадресация домена/поддомена с вашим? - person Stan Bright; 07.10.2009

Может помочь Dalli Gem. недавняя фиксация исправлено совместное использование сокетов, чтобы вы могли посмотреть на их код и посмотреть, как они это сделали. Это.

person user1648421    schedule 05.09.2012
comment
Это все еще происходит для меня в Ruby 2.3 Rails 4.2.5 с драгоценным камнем Dalli. - person Nick M; 31.01.2017