【问题标题】:How to properly diagnose a 500 error (Rails, Passenger, Nginx, Postgres)如何正确诊断 500 错误(Rails、Passenger、Nginx、Postgres)
【发布时间】:2012-04-15 17:39:11
【问题描述】:

我很难从生产中运行的应用程序中诊断出 500 错误。我以前可以使用它,但是通过 Capastrano 重新部署后,我无法继续使用它。

以下是事实:

  1. 服务器是用 nginx + 乘客设置的,我正在使用 PostgreSQL。
  2. 静态资产工作正常,因为我可以在浏览器中正常访问它们。
  3. 我可以通过RAILS_ENV=production bundle exec rails console 访问 Rails 控制台并执行 Active Record 操作(例如 从数据库中检索数据)。
  4. 在控制台中,我可以运行app.get("/"),它也会返回 500 错误(在首先显示运行加载的查询之后 模型)。
  5. 永远不会写入 production.log 文件。我已经设置了权限 777 只是为了它的地狱。我还将日志级别设置为 :debug 没有什么可显示的。
  6. nginx 日志(乘客也使用该日志)没有显示错误指示,它只是通知缓存未命中。

因为没有记录任何使用,我不知道在这里做什么。我尝试在没有帮助的情况下对整个应用程序目录设置完全权限。多次重启服务器,没有。数据库就在那里,rails 可以清楚地与之通信。我不确定我做了什么让它第一次运行。我只是不知道为什么 rails 没有将任何东西输出到日志中。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 nginx passenger capistrano


    【解决方案1】:

    好的,我想通了。该应用程序在开发模式下运行良好,所以我知道某些特定于生产的东西把它搞砸了。我进入 config/environments/production.rb 并更改了这些设置:

    # Full error reports are disabled and caching is turned on
    config.consider_all_requests_local       = false # changed from true
    config.action_controller.perform_caching = true # changed from false
    

    然后在重新启动乘客后,rails 向我显示了带有堆栈跟踪的错误。原来我忘记预编译资产管道!

    【讨论】:

      【解决方案2】:

      检查事项

      1) 你确定你在生产环境中运行吗? 检查 development.log 文件中是否有任何条目

      2) 将您的应用设置为在发生 500 错误时通过完整的堆栈跟踪向您发送电子邮件。我使用 Exception Notifier gem,但还有很多其他解决方案。

      3) 在控制台中检查您的应用时,您确定要在生产模式下启动控制台吗?应用程序可能根本没有启动,而您只是忘记设置生产参数,从而认为应用程序在没有启动时运行良好。

      4) 您遇到的是 nginx 500 错误还是 Rails 500 错误?如果是 nginx,那么很可能您的应用程序根本没有启动,并且极不可能在日志文件中出现任何 rails 错误。资产是静态文件,导航到它们只能证明它们存在。

      5) 您确定您正在检查服务器上的正确文件夹吗?听起来很愚蠢,但 capistrano 可能会将应用程序部署到与 nginx 正在寻找您的应用程序的文件夹不同的文件夹中,因此请仔细检查 capistrano 部署到的文件夹和 nginx 正在寻找的文件夹是否相同。

      只是一个建议,我会使用 puma 而不是乘客。使用 nginx 真是太棒了。

      【讨论】:

      • 感谢所有建议!我肯定它在生产模式下运行(我已在 nginx 配置中将其指定为乘客选项)。我确定我在 Rails 中收到了 500 错误,因为 nginx 错误日志没有显示 500 错误的指示。是的,我仔细检查了 nginx 正在查看的文件夹。
      【解决方案3】:

      我的问题是乘客的日志文件 (error.log) 没有任何内容。然后是轮换日志问题。运行

       passenger-config reopen-logs
      

      解决了我的问题。 More.

      【讨论】:

        【解决方案4】:

        您是否尝试在开发模式下运行以查看错误是否自行报告?

        【讨论】:

        • 我试过这个,它首先抱怨对 tmp 目录的写访问,我修复了它,然后它就正常了。我使用相同的数据库进行了设置。所以它只是在生产模式下失败。
        猜你喜欢
        • 2019-03-23
        • 2022-12-01
        • 1970-01-01
        • 2015-01-16
        • 1970-01-01
        • 2016-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多