この投稿は下記ページの転載です。
https://teratail.com/questions/61778


Rails3で稼働しているアプリケーションをRails5にアップデートしようと思っています。

Rails5のプロジェクトを新規作成し、現状のアプリケーションと同じサーバー内で2つを並行稼動させ、Nginx側でURLによるルーティングをすることで徐々に5へ移行していくような計画をたてています。

静的なページはこれでうまく動いているのですが、ログインが必要なページでセッションが共有されず困っています。

Rails3とRails4以降ではセッション暗号化の仕組みが変わっているようなので、下記の記事を参考に設定を行いました。

https://medium.com/ruby-on-rails/3-steps-to-share-a-session-between-rails-3-and-rails-4-applications-9618766e6c2a#.udvo3a58p

  1. 新旧Railsでセッションストアの設定を統一
# config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store, key: 'example.net_session'
  1. Rails5のcookie形式をjsonからmarshalに変更
Rails.application.config.action_dispatch.cookies_serializer = :marshal # default: :json
  1. Rails5のsecret_key_baseの設定を消し、代わりにsecret_tokenを設定

secret_tokenはRails3のconfig.secret_token と同じ値です

development:
  # secret_key_base: abc123...
  secret_token: 123abc...
  1. Deviseのsecret_keyを設定

これも新旧Railsで共通の値を入れています

Devise.setup do |config| 
  config.secret_key = "xyz123"
  ~~~
end

設定は以上です。

ローカルで2つのRails(WEBrickとPuma)をdocker内で立ち上げ、本番と同じようにNginxでURLによってproxy_passを振り分けるという方法でテストしています。

Rails3側でログインし、次にRails5側で実装済みのページに移動するとcookieが書き換えられてしまい、非ログイン状態に戻ってしまいます。

他に試すべきこと、確認事項などあれば些細な事でも結構ですので、助言を頂けると幸いです。よろしくお願いします。