2009-10-06 11 views
14

Memcachedにセッションを保存するときに非常に奇妙な問題があります。時々、一部のユーザーが他のユーザーのセッションに参加します。例えば。ジョンは、マリア、マリア、クリスなどとしてログインします。セッションがmemcached(Rails)に保存されているときにユーザーが他のユーザーのセッションを取る

私はRails 2.3.4を使用しますが、以前のバージョンのRailsでも同じ問題が発生しています。私は1つのMemcacheサーバーしか使用せず、同じマシン上で実行しています。これをデバッグする際の問題は、私がそれを再現できないことです。

この問題の解決方法やデバッグ方法を教えてもらえれば幸いです。セッション用にMemcachedを使用していて、あなたのサンプルconfgを共有しているなら、私はまたうれしいでしょう。

これらは私の設定です:

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

は、この2つの値の間でセッションクッキーフリッピングに問題がある可能性があり、事前に スタン

答えて

5

私はこれを見て、非常にデバッグが困難であることがわかりました。

乗客を使用している場合は、新しいサーバーを作成するための控えめな方法を使用してください。

デフォルトの方法では、1つのソケットをmemcacheに共有するサーバーがあります。

ドキュメントで詳しく説明します。 http://www.modrails.com/documentation/Users%20guide%20Apache.html#_example_1_memcached_connection_sharing_harmful

+0

はい、私は旅客を使用します。 私は両方のアプリケーションでテストし、ここで結果を共有します。 ありがとうございました。私は問題がここにあることを「嗅ぐ」ことができます。 –

+0

私はあなたの鼻を羨望しますが、結果が確認されるまで正しい答えにフラグを付けません。 – zvolkov

3

、ありがとうございました。たとえば、example.comに割り当てられているサイトとwww.example.comに割り当てられているサイトがあります。これらのサイトでは、リダイレクトせずに両方に応答するサイトがあります。

一部のブラウザの動作は、最も長いサブドメインに一致するCookieを送信することですが、他のブラウザは実際に両方の値を送信し、異なる場合があります。これにより、予測できない時間に2つの異なる値間でセッションが切り替わることがあります。

これを修正する方法の1つは、wwwまたはwwwのないバージョンを想定する代わりに、.domain.comにクッキーをロックすることです。そうでない場合は、強制的にリダイレクトしてください。

セッション状況の性質を診断するもう1つの方法は、セッションIDを表示するデバッグページを用意することです。または、問題に遭遇した人がそれを診断するのに役立つようにページ出力に埋め込むことです。/session_infoのようなものは簡単に作成できます。

+0

OK、私は、この設定オプションを持っている: ActionController :: Base.session_optionsを[:session_domain] =「.mysite.com」 私は、この設定オプションは、アプリケーションがすべてのサブドメインを含むために一つのセッションを使用する必要がありますことを意味だと思いますメイン(mysite.com)。 また、問題のあるユーザーのsession_idが表示されたら、私は何ができるでしょうか? –

+0

それはクッキーを適切に設定する方法なので、多くのことが機能するはずです。 冒険をしたい場合は、session_id値が使用されているproduction.logファイルを調べることができます。通常、あるユーザーが別のユーザーに切り替わると、セッションが混ざり合っているためです。そうでない場合は、少なくとも他の分野に絞って検索することができます。 – tadman

+0

はい、セッションが混在していると思いますが、私はこの問題の解決策を探しています。 –

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 あなたのドメイン/サブドメインのリダイレクトはありますか? –

3

ここで、それは私のために問題を解決するコードです:

私はDalli Gemが役立つかもしれない

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

Ruby 2.3では動作しません。Rails 4.2.5 –

0

の最後にこれらの行を追加しました。 A recent commit固定ソケット共有なので、コードを見てどのようにしたのか見ることができます。

+0

これは、Ruby 2.3 Rails 4.2.5でDalli宝石。 –

関連する問題