Сессии пересекаются. Ruby on Rails

У меня есть приложение, использующее devise для аутентификации. Rails 3 на ruby ​​1.9.2 с пассажиром поверх nginx.

Вот моя проблема: я заметил, что иногда мои сеансы пересекаются. Войдя в систему как один пользователь, я иногда становлюсь другим пользователем. Это действительно ужасная проблема. Мне удалось остановить его, используя хранилище сессий active_record. Но я не понимаю, где это могло произойти. Это происходит как при использовании хранилища cookie, так и хранилища memcached. Я не уверен, с чего начать отладку. Я просмотрел весь свой код и читаю только из 'current_user' не пишу. У меня нет кода для хранения элементов в сеансе.

Кто-нибудь может подсказать мне, где и как это могло происходить?

Обновление:

Я устанавливаю div вверху страницы, чтобы выгружать содержимое сеанса при каждом запросе. Это не просто переключение пользователя, это весь сеанс. Есть несколько фиктивных переменных, которые я установил в сеансе, чтобы посмотреть, что произойдет. Когда сеансы пересекаются, (пользователь A становится пользователем B) пользователь A теперь видит фиктивные переменные, которые были у пользователя B. И пользователь B вышел из системы.

ОБНОВЛЕНИЕ 2

Я нашел здесь еще один вопрос о переполнении стека, который описывает ту же самую проблему: В Rails, что может привести к тому, что у пользователя будет сеанс другого пользователя?

Похоже, это проблема пассажиров? Но что еще важнее, как это вообще происходит? Это НАСТОЯЩАЯ большая проблема. Как мне положить этому конец?

ОБНОВЛЕНИЕ 3

Теперь я использую Unicorn для обслуживания своего приложения. Ставлю config.threadsafe! и начал использовать исключительно сессии с активной записью. Больше никаких сессий memcached. Проблема ушла. По крайней мере, я могу перестать выдергивать волосы, потому что дыра в безопасности закрыта.

Я все еще хотел бы знать, что именно было причиной этого. В большинстве учебных пособий показано, как настроить пассажира с методом нереста по умолчанию. Естественно, я думаю, что memcached будет работать лучше других методов для управления сеансами. Особенно в среде с несколькими серверами приложений.

Обновление 4

Хорошо, последнее и последнее обновление. Это была проблема с разветвленными процессами, использующими одно и то же соединение memcached. Я исправил это с помощью клиента dalli memcached, и сброс соединения в обратном вызове after_fork единорога или пассажира.

17
задан Community 23 May 2017 в 12:11
поделиться