2009-10-06 3 views
14

Ich habe ein sehr seltsames Problem, wenn meine Sitzung in Memcached zu speichern. Von Zeit zu Zeit nehmen einige Benutzer die Sitzung von anderen. Z.B. John, wird eingeloggt als Maria, Maria als Chris und so weiter.Benutzer nehmen Sitzungen anderer Benutzer, wenn Sitzungen in Memcached (Rails) gespeichert sind

Ich benutze Rails 2.3.4, aber das gleiche Problem mit früheren Versionen von Rails ist passiert. Ich benutze nur einen Memcache-Server und läuft auf demselben Rechner. Das Problem mit dem Debuggen ist, dass ich es nicht reproduzieren kann.

Ich werde sehr froh sein, wenn mir jemand helfen kann, dieses Problem zu lösen oder es zu debuggen. Ich freue mich auch, wenn Sie Memcached für Sitzungen verwenden und Ihre Beispiel-Conflgs freigeben.

Dies sind meine Konfigurationen:

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

Danke im Voraus, Stan

Antwort

5

Ich habe dies gesehen und fand es sehr schwierig zu debuggen.

Wenn Sie Passagier verwenden, möchten Sie vielleicht die konservative Methode zum Erstellen neuer Server verwenden.

Die Standardmethode hat Server, die Memcache einen einzelnen Socket teilen.

Die Dokumente besprechen es ausführlicher. http://www.modrails.com/documentation/Users%20guide%20Apache.html#_example_1_memcached_connection_sharing_harmful

+0

Ja, ich benutze Passagier. Ich werde es auf beiden Anwendungen testen und werde die Ergebnisse hier teilen. Vielen Dank für Ihre Hilfe. Ich kann "riechen", dass das Problem hier ist. –

+0

Ich beneide deine Nase, aber ich würde die Antwort nicht als korrekt markieren, bis das Ergebnis verifiziert ist – zvolkov

3

Dies ist ein Problem mit dem Session-Cookie-Flipping zwischen zwei Werten sein könnte. Beispiel: Sie haben möglicherweise eine Instanz von example.com und eine andere von www.example.com zugewiesen. Dies ist eine häufige Situation, in der einige Websites auf beide reagieren, ohne dass sie weitergeleitet werden, um eine Kanonisierung vorzunehmen.

Das Verhalten einiger Browser besteht darin, das Cookie mit der längsten Subdomäne zu senden, während andere tatsächlich beide Werte senden, und sie können sich unterscheiden. Dies kann dazu führen, dass eine Sitzung zu unvorhersehbaren Zeiten zwischen zwei verschiedenen Werten umgeschaltet wird.

Eine Möglichkeit, dies zu beheben, besteht darin, Ihre Cookies an .domain.com zu sperren, anstatt sie in der www- oder www-less-Version übernehmen zu lassen, oder um die Verwendung einer einzigen zu erzwingen.

Eine andere Möglichkeit, die Art der Sitzungssituation zu diagnostizieren, besteht darin, eine Debugging-Seite mit der Sitzungs-ID zu erstellen oder sie in die Seitenausgabe einzubetten, damit jemand bei der Diagnose helfen kann. Etwas wie/session_info ist einfach zu erstellen.

+0

OK, ich habe diese Konfigurationsoption: Action :: Base.session_options [: session_domain] = ‚.mysite.com‘ Ich denke, diese Konfigurationsoption bedeutet, dass die Anwendung einer Sitzung für alle Sub-Domains einschließlich verwenden müssen das Haupt (mysite.com). Kannst du auch einen weiteren Rat geben, was ich tun könnte, wenn ich die session_id eines problematischen Benutzers sehe? –

+0

Das ist der Weg, um den Cookie richtig einzustellen, so dass viel funktionieren sollte. Wenn Sie abenteuerlustig werden möchten, können Sie in der Datei production.log nachlesen, für welche session_id-Werte verwendet wird. Normalerweise, wenn ein Benutzer zu einem anderen wechselt, liegt es daran, dass Sitzungen durcheinander geraten. Wenn das nicht der Fall ist, können Sie Ihre Suche zumindest auf andere Bereiche konzentrieren. – tadman

+0

Ja, ich denke, dass die Sitzungen durcheinander geraten und ich suche nach einer Lösung für dieses Problem. –

2

Ich habe noch nie ein solches Problem erlebt, ich kann mir einfach nicht vorstellen, dass es überhaupt passiert. Das ist mein 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

Nun, wie Sie sehen können, der einzige Unterschied zu meinen memcache_options ist, dass ich nicht verwende: Komprimierung. Ich denke jedoch nicht, dass es ein Problem sein sollte. In beiden Apps, die Probleme mit der Sitzung haben, habe ich solche Weiterleitungen konfiguriert: http://www.mysite.com => http://mysite.com. Haben Sie Domain/Subdomain-Redirects mit Ihren? –

3

Hier ist es der Code, der das Problem für mich löst:

ich diese Zeilen am Ende der

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

Funktioniert nicht für mich auf Ruby 2.3 Rails 4.2.5 –

0

hinzugefügt Die Dalli Gem helfen könnte. Eine recent commit feste Socket-Freigabe, so dass Sie ihren Code ansehen und sehen konnten, wie sie es gemacht haben.

+0

Dies geschieht immer noch für mich in Ruby 2.3 Rails 4.2.5 mit dem Dalli Juwel. –

Verwandte Themen