2009-10-06 11 views
14

Tengo un problema muy extraño cuando guardo mi sesión en Memcached. De vez en cuando, algunos usuarios toman la sesión de otros. P.ej. John, se registra como Maria, Maria como Chris, etc.Los usuarios toman sesiones de otros usuarios cuando las sesiones se almacenan en memcached (Rails)

Uso Rails 2.3.4, pero el mismo problema ha estado sucediendo con las versiones anteriores de Rails. Uso solo un servidor Memcache y se ejecuta en la misma máquina. El problema con la depuración es que no puedo reproducirlo.

Estaré muy contento de que alguien me pueda guiar para resolver este problema o depurarlo. También seré feliz si está utilizando Memcached para sesiones y comparte sus archivos de ejemplo.

Estos son mis configuraciones:

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

gracias de antemano, Stan

Respuesta

5

He visto esto y me pareció muy difícil de depurar.

Si está utilizando pasajeros, puede utilizar el método conservador para generar nuevos servidores.

El método predeterminado tiene servidores que comparten un solo socket a Memcache.

Los documentos lo discuten con más detalle. http://www.modrails.com/documentation/Users%20guide%20Apache.html#_example_1_memcached_connection_sharing_harmful

+0

Sí, uso Passenger. Lo probaré en ambas aplicaciones y compartiré los resultados aquí. Muchas gracias por su ayuda. Puedo "oler" que el problema está aquí. –

+0

Envidio tu nariz pero no marcaría la respuesta como correcta hasta que se verifique el resultado – zvolkov

3

Esto podría ser un problema con el volteo cookie de sesión entre dos valores. Por ejemplo, puede tener uno asignado a example.com y otro a www.example.com, una situación común con algunos sitios que responden a ambos sin redireccionar para hacer uno canónico.

El comportamiento de algunos navegadores es enviar la cookie que coincida con el subdominio más largo, mientras que otros realmente envían a través de ambos valores, y pueden diferir. Esto podría llevar a una sesión alternar entre dos valores diferentes en momentos impredecibles.

Una forma de solucionar esto es bloquear las cookies en .domain.com en lugar de dejar que asuma la versión www o www-less, si este es el caso, o redirigir para forzar el uso de una sola.

Otra forma de diagnosticar la naturaleza de la sesión es tener una página de depuración que muestre la ID de la sesión o incrustarla en el resultado de la página para que alguien que encuentre el problema pueda ayudar a diagnosticarla. Algo como/session_info es fácil de crear.

+0

bien, tengo esta opción de configuración: ActionController :: [Base.session_options: session_domain] = '.mysite.com' Creo que esta opción de configuración significa que la aplicación tendrá que utilizar una sesión para todos los subdominios incluidos el principal (mysite.com). Además, ¿me puede dar otro consejo sobre lo que podría hacer si veo el session_id de un usuario problemático? –

+0

Esa es la forma de configurar la cookie correctamente, por lo que mucho debería estar funcionando. Si quiere ser aventurero, puede consultar el archivo production.log para el que se utilizan los valores de session_id. Por lo general, cuando un usuario cambia a otro es porque las sesiones se mezclan. Si ese no es el caso, al menos puede enfocar su búsqueda en otras áreas. – tadman

+0

Sí, creo que las sesiones se están confundiendo y estoy buscando una solución a este problema. –

2

Nunca me encontré con un problema así, simplemente no puedo imaginar que esté sucediendo. Esta es mi 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 
+0

Bueno, como puede ver, la única diferencia con mis opciones de memcache es que no uso: compresión. Sin embargo, no creo que deba ser un problema. En ambas aplicaciones que tienen problemas con la sesión, he configurado dichos redireccionamientos: http://www.misitio.com => http://misitio.com. ¿Tiene redirecciones de dominio/subdominio con las suyas? –

3

aquí está el código que resuelve el problema para mí:

que añade estas líneas al final de

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 
+0

No funciona para mí en ruby ​​2.3 Rails 4.2.5 –

0

El Dalli Gem podría ayudar. Una conexión de socket fijo recent commit, para que pueda ver su código y ver cómo lo hicieron.

+0

Esto todavía me está sucediendo en Ruby 2.3 Rails 4.2.5 con Dalli joya. –

Cuestiones relacionadas