将RestfulAuthentication和Rails 2.3中的Rails应用程序更新为Devise和Rails 5.0后,我们变得很奇怪" 401 Unauthorized"错误,并且rails应用程序在第一次请求时挂起:
Completed 401 Unauthorized in x ms
其中x是一个非常高的数字。仅在第一次启动服务器(长时间不活动后)时才会发生此错误。应用程序挂起并拒绝启动,如果我们中断服务器,则会出现401 Unauthorized错误。如果我们使用Webrick,Puma,Thin或Unicorn似乎并不重要。 ApplicationController
看起来像
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :set_http_headers
alias login_required authenticate_user!
...
(添加了别名以保证平稳过渡到Devise)。 database.yml配置文件看起来像
development:
adapter: mysql2
encoding: utf8
database: db_name
pool: 5
timeout: 5000
username: db_user
passwort:
应用程序运行后,错误消失,但如果我们在几小时后或第二天重新启动计算机,则会再次出现错误。
偶尔也会出现超时错误,例如
ActiveRecord::ConnectionTimeoutError: could not obtain a connection from the pool within 5.000 seconds (waited 5.003 seconds); all pooled connections were in use
或
No live threads left. Deadlock? (fatal)
相关的设计问题(here和here)没有帮助,没有任何相关问题提供了解决方案,ActiveRecord::Base.clear_active_connections!
也没有提供here也没有帮助Session.delete_all
(会话存储在ActiveRecord中)。救命!有任何想法吗?
答案 0 :(得分:3)
我同意这是一个特别讨厌的错误。对我来说,最终解决的是改变:
config.eager_load = false
到
config.eager_load = true
在config / environments / development.rb 中
答案 1 :(得分:0)
我不知道这个问题耗费了多少时间,这真的很烦人。在过去的8年里,我没有遇到一个让我花了很长时间才弄明白的错误。它只发生在开发环境中。 Gemfile说
group :development do
# Spring speeds up development by keeping your application running in the background.
# Read more: https://github.com/rails/spring
gem 'spring'
end
Gemfile.lock
说捆绑包安装了spring 1.7.2
版本。有些人建议stop spring if a rails command hangs。我在Gemfile中注释掉了spring gem,用gem uninstall spring
卸载了gem并更新了我仍然使用的RVM ruby版本管理器,并且rails在第一次启动时挂起的问题似乎不那么频繁(但它并不完全)消失)
# gem 'spring'
所以它似乎部分是spring问题,可能与this issue有关。相当悖论,一个应该加速应用程序的宝石会减慢速度直到它挂起: - (