2009-10-06 8 views
14

J'ai un problème très étrange lorsque je stocke ma session dans Memcached. De temps en temps, certains utilisateurs prennent la session des autres. Par exemple. John, devient connecté comme Maria, Maria comme Chris et ainsi de suite.Les utilisateurs prennent des sessions d'autres utilisateurs lorsque les sessions sont stockées dans memcached (Rails)

J'utilise Rails 2.3.4, mais le même problème s'est produit avec les versions antérieures de Rails. Je n'utilise qu'un seul serveur Memcache et fonctionne sur la même machine. Le problème avec le débogage est que je ne peux pas le reproduire.

Je serai très heureux si quelqu'un peut me guider comment résoudre ce problème ou le déboguer. Je serai également heureux si vous utilisez Memcached pour les sessions et que vous partagez vos exemples de confg.

Ce sont mes configurations:

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

Merci à l'avance, Stan

Répondre

5

J'ai vu cela et j'ai trouvé qu'il était très difficile de déboguer.

Si vous utilisez un passager, vous pouvez envisager d'utiliser la méthode conservatrice pour créer de nouveaux serveurs.

La méthode par défaut a des serveurs partageant un seul socket avec memcache.

Les docs en parlent plus en détail. http://www.modrails.com/documentation/Users%20guide%20Apache.html#_example_1_memcached_connection_sharing_harmful

+0

Oui, j'utilise Passenger. Je vais le tester sur mes deux applications et partagerai les résultats ici. Merci beaucoup pour votre aide. Je peux "sentir" que le problème est ici. –

+0

Je t'envie le nez mais je ne marquerais pas la réponse comme correcte jusqu'à ce que le résultat soit vérifié – zvolkov

3

Cela pourrait être un problème avec le retournement de cookie de session entre les deux valeurs. Par exemple, vous pouvez en avoir un affecté à example.com et un autre à www.example.com, une situation courante avec certains sites qui répondent aux deux sans rediriger pour en faire un canonique.

Le comportement de certains navigateurs est d'envoyer le cookie correspondant au sous-domaine le plus long, alors que d'autres envoient réellement les deux valeurs, et ils peuvent différer. Cela pourrait conduire à une session basculant entre deux valeurs différentes à des moments imprévisibles. Une façon de résoudre ce problème est de verrouiller vos cookies sur .domain.com au lieu de laisser supposer la version www ou www-less, si c'est le cas, ou de rediriger pour forcer l'utilisation d'un seul. Une autre façon de diagnostiquer la nature de la situation de session est d'avoir une page de débogage qui affiche l'ID de session, ou l'intégrer dans la sortie de la page de sorte que quelqu'un qui rencontre le problème peut aider à diagnostiquer. Quelque chose comme/session_info est facile à créer.

+0

OK, j'ai cette option de configuration: ActionController :: Base.session_options [: session_domain] = « .monsite.com » Je pense que cette option de configuration signifie que l'application devra utiliser une session pour tous les sous-domaines, y compris le principal (mysite.com). Aussi, pouvez-vous donner un autre conseil que je pourrais faire si je vois le session_id d'un utilisateur problématique? –

+0

C'est la façon de définir le cookie correctement, de sorte que beaucoup devrait fonctionner. Si vous voulez vous aventurer, vous pouvez regarder dans le fichier production.log pour lequel les valeurs de session_id sont utilisées. Habituellement, lorsqu'un utilisateur passe à un autre, c'est parce que les sessions sont mélangées. Si ce n'est pas le cas, au moins vous pouvez concentrer votre recherche dans d'autres domaines. – tadman

+0

Oui, je pense que les sessions se confondent et je cherche une solution à ce problème. –

2

Je n'ai jamais rencontré un tel problème avant, je ne peux pas imaginer que cela se produise même. Ceci est ma 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

Comme vous pouvez le voir, la seule différence avec mes options memcache est que je n'utilise pas: la compression. Cependant, je ne pense pas que cela devrait être un problème. Dans les deux applications qui ont des problèmes avec la session, j'ai configuré ces redirections: http://www.monsite.com => http://mysite.com. Avez-vous des redirections de domaine/sous-domaine avec les vôtres? –

3

Ici, il est le code qui résout le problème pour moi:

j'ajouté ces lignes à la fin 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

Ca ne marche pas pour moi sur ruby ​​2.3 Rails 4.2.5 –

0

Le Dalli Gem pourrait aider. Un partage de socket fixe recent commit, afin que vous puissiez regarder leur code et voir comment ils l'ont fait.

+0

Ca se passe encore pour moi en Ruby 2.3 Rails 4.2.5 avec le Dalli gemme. –

Questions connexes