Rails应用程序挂起:已完成401未经授权的x ms

时间:2016-09-06 08:46:49

标签: ruby-on-rails authentication devise hang http-status-code-401

将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)

相关的设计问题(herehere)没有帮助,没有任何相关问题提供了解决方案,ActiveRecord::Base.clear_active_connections!也没有提供here也没有帮助Session.delete_all(会话存储在ActiveRecord中)。救命!有任何想法吗?

2 个答案:

答案 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有关。相当悖论,一个应该加速应用程序的宝石会减慢速度直到它挂起: - (