代码之家  ›  专栏  ›  技术社区  ›  mipadi

我的Rails应用程序正在返回所有url的http500,但是日志文件中没有显示任何内容。如何诊断问题?

  •  10
  • mipadi  · 技术社区  · 16 年前

    我有一个Rails应用程序,它运行在带有Apache和Phusion的生产服务器上。当使用Mongrel时,该应用程序在本地运行良好,但是每当我尝试在生产服务器上加载URL时,它都返回http500。我知道服务器工作正常,因为我可以很好地获取应用程序的静态元素(例如JavaScript文件、样式表、图像)。我还检查了乘客状态,它正在加载应用程序(必须是这样,因为返回的是应用程序的500个内部服务器错误页,而不仅仅是默认的Apache错误页)。另外,当我通过 script/console production app.get("/") ,500也返回。

    问题是有 没有什么 在日志文件中显示问题。 production.log 是空的。Apache错误日志也显示Apache没有问题。我不知道发生了什么事,也不知道如何诊断这个问题。

    我知道我可能有点含糊不清,但有人能就问题所在提出建议吗?或者至少我可以用一种方法来诊断它?

    6 回复  |  直到 16 年前
        1
  •  6
  •   mipadi    16 年前

    这种情况的答案是我的应用程序有问题。其中一个模型类使用了与应用程序其余部分不同的数据库连接。此数据库连接配置不正确。我认为没有任何东西被写入日志文件的原因是Rails不知道该怎么做就退出了。

    因为这可能有助于其他人了解我是如何诊断这个问题的,所以我的思考过程如下:

    1. 问题不可能出在Apache上:Apache日志文件中没有写入任何错误。
    2. 问题可能不在Passenger上:Passenger没有向Apache日志文件写入任何错误,而且它似乎正确地加载了我的应用程序,因为 passenger-status 显示为已加载,并显示我的应用程序的500个内部服务器错误页(不是默认的Apache错误页)。

    post ,这表明错误可能是数据库连接问题。果然,删除这个错误配置的数据库和所有对它的引用使应用程序工作!

        2
  •  1
  •   John Topley    16 年前

    你试过用Passenger在本地运行应用程序吗?

        3
  •  1
  •   Community Mohan Dere    9 年前

    尝试在生产模式下在Mongrel上本地运行应用程序,以确保该特定环境没有奇怪的问题。如果这是可行的,那么你就知道这不是你的代码库的问题。由于您的静态组件得到了正确的服务,这就告诉我Apache工作得很好。系统中只剩下乘客档。在这一点上,我会说这是一个配置不当的乘客。你应该发布你的乘客配置文件,并在 ServerFault .

        4
  •  1
  •   macarthy    16 年前

    你看过以下文件了吗

    6.3.7. 我的Rails应用程序日志文件未写入

    应注意:

      By default, Phusion Passenger runs Rails applications in production
    

    模式,所以请务必检查 production.log代替 配置

      By default, Phusion Passenger runs Rails applications as the owner
    

    环境.rb。所以日志文件可以 仅当该用户 请修改你的日志文件 相应地。

      See User switching (security) for details.
    

    (CentOS)那么有可能 SELinux策略只允许Apache 具有 httpd\u sys\u content\t安全上下文。 在这种背景下:

    您检查过vhost或httpf.conf文件了吗?你有日志记录指令吗?

    http://www.modrails.com/documentation/Users%20guide.html#_passengerloglevel_lt_integer_gt

    你有安装任何机架应用程序吗?

        5
  •  0
  •   Fenton    16 年前

        6
  •  0
  •   Taryn East    16 年前

    这可能是一个愚蠢的建议,但我建议您在测试时从提高生产的日志记录级别开始。在里面做这个 config/environments/production.rb 使用方法:

    config.log_level = :debug