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

Среда => Общий => Недавние файлы

24 объекта, показанные в объектах Меню окна

24, показанных в недавно используемых списках

Среда => Общий

Выставочная строка состояния НА

Анимационные инструменты среды ПРОЧЬ

14
задан Jeremy Stein 27 October 2009 в 19:52
поделиться

4 ответа

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

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

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

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

5
ответ дан 1 December 2019 в 14:33
поделиться

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

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

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

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

3
ответ дан 1 December 2019 в 14:33
поделиться

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

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
2
ответ дан 1 December 2019 в 14:33
поделиться

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

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

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
3
ответ дан 1 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: