2009-10-06 83 views
14

將會話存儲在Memcached中時,我有一個非常奇怪的問題。有時用戶會參加其他會話。例如。 John,以Maria身份登錄,Maria以Chris身份登錄等等。當會話存儲在memcached中時,用戶將其他用戶的會話(Rails)

我使用的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' 
} 

謝謝你在前進, 斯坦

回答

5

我見過這個,發現它很難調試。

如果您使用的是乘客,您可能需要考慮使用保守的方法來產生新的服務器。

缺省方法的服務器共享單個套接字到memcache。

該文檔更詳細地討論它。 http://www.modrails.com/documentation/Users%20guide%20Apache.html#_example_1_memcached_connection_sharing_harmful

+0

是的,我使用Passenger。 我會在我的兩個應用程序上測試它,並在這裏分享結果。 非常感謝您的幫助。我可以「聞到」問題出在這裏。 – 2009-10-15 11:07:54

+0

我羨慕你的鼻子,但我不會標記答案爲正確的,直到結果得到驗證 – zvolkov 2009-10-27 20:01:15

3

這可能是兩個值之間的會話cookie翻轉的問題。例如,您可能會將一個分配給example.com,另一個分配給www.example.com,這是一些常見的情況,即某些網站會對這兩個網站做出響應,而無需將其重定向到一個規範。

某些瀏覽器的行爲是發送匹配最長子域的cookie,而其他瀏覽器實際上是通過這兩個值發送的,並且它們可能會有所不同。這可能會導致會話在不可預知的時間在兩個不同的值之間切換。

修復此問題的一種方法是將您的Cookie鎖定到.domain.com,而不是讓它假定爲www或www-less版本(如果是這種情況)或重定向以強制只使用一個。

另一種診斷會話狀態性質的方法是有一個顯示會話ID的調試頁面,或者以某種方式將其嵌入到頁面輸出中,以便遇到問題的人可以幫助診斷它。像/ session_info這樣的東西很容易創建。

+0

OK,我有這樣的配置選項: 的ActionController :: Base.session_options [:session_domain] =「.mysite.com」 我覺得這個配置選項意味着應用程序將不得不使用一個會話的所有子域,包括主要(mysite.com)。 另外,如果我看到有問題的用戶的session_id,可以給出進一步的建議嗎? – 2009-10-07 14:17:31

+0

這就是正確設置cookie的方式,所以應該有很多工作。 如果您想獲得冒險精神,可以查看使用session_id值的production.log文件。通常當一個用戶翻到另一個時,這是因爲會話混淆了。如果不是這樣,至少你可以把你的搜索關注於其他領域。 – tadman 2009-10-07 15:15:37

+0

是的,我認爲會議越來越混亂,我正在尋找這個問題的解決方案。 – 2009-10-07 15:25:48

2

我從未遇到過這樣的問題,我無法想象它甚至發生了。這是我的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

就像你所看到的,與我的memcache_options唯一的區別是我不使用:壓縮。但我不認爲這應該是一個問題。 在這兩個有會話問題的應用程序中,我配置了這樣的重定向:http://www.mysite.com => http://mysite.com。 你有域名/子域名重定向嗎? – 2009-10-07 14:21:28

3

這能解決問題,我的代碼:

我添加了這些線在

的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

不適用於我的紅寶石2.3 Rails 4.2.5 – 2017-01-21 19:04:39

0

Dalli Gem可能有助於結束。 A recent commit固定套接字共享,所以你可以看看他們的代碼,看看他們是如何做到的。

+0

這仍然發生在我的Ruby 2.3 Rails 4.2.5與Dalli寶石。 – 2017-01-31 04:32:53