【问题标题】:Rails can't connect to MySQL even though Capistrano and MySQL Workbench can即使 Capistrano 和 MySQL Workbench 可以,Rails 也无法连接到 MySQL
【发布时间】:2015-02-24 17:33:37
【问题描述】:

我刚刚部署了我的 rails 应用程序,创建了 MySQL 架构并通过 capistrano 复制了 database.yml。我在 MySQL Workbench 中看到了数据库表(它通过 SSH 隧道记录到我的 VPS 主机)。

当我尝试通过网络访问我的 rails 应用程序时,我得到了

Action Controller Exception: Mysql2::Error Can't connect to MySQL server on '127.0.0.1' (111)

我很困惑。 database.yml 中的设置与 MySQL Workbench 中的设置相同。如果他们有任何问题,Capistrano 将无法创建模式。我检查了服务器上的 database.yml 确实已被复制。它也已正确符号链接。可能是什么问题呢?我该如何调试这种情况?我检查了生产日志,没有任何东西可以解释这种情况。能给点建议吗?

仅供参考:我正在使用 nginx 和乘客。

【问题讨论】:

  • MySQL 是否在监听 127.0.0.1?也许您应该尝试使用“locahost”?
  • 确保您尝试启动的环境,例如您上传了生产数据库设置,但您尝试启动开发会话,因此它没有 mysql 配置。

标签: mysql ruby-on-rails-4 nginx passenger


【解决方案1】:

@Mohammad AbuShady:你是对的。这就是问题所在。谢谢!如果您输入它作为答案,我会接受它。

所以谜团解开了 - 尽管我使用 cap production deploy 部署它,但似乎 Rails 应用程序在我的开发环境中的生产服务器上运行,而不是在生产环境中运行。我写了一篇关于它的详细博客文章here。小故事:

问题在于 rails 堆栈的设置有些混乱。环境可以设置在多个地方。在这种特殊情况下,我相信问题是 /etc/nginx/nginx.conf 中的以下行:

server {
    rack_env           development;

显然,它胜过我将环境设置为“生产”的其他地方(例如 deploy.rb)。

问题是 database.yml 中的开发设置不包含正确的数据库设置(它们应该只在我的笔记本电脑上工作),因此应用程序在建立与 MySQL 的连接时遇到问题也就不足为奇了。

如果有人偶然发现同样的问题,我建议使用以下调试策略:在生产服务器上的应用程序根目录中调用 rails console(类似于 /home/deploy_user/my_app/current)并在那里运行 Rails.env .它将显示应用程序在什么环境中运行。另一种检查方法是查看日志目录(例如/home/deploy_user/my_app/shared/log)。在我的例子中,文件 development.log 的时间戳比文件 production.log 更新得多。当我打开它时,我可以清楚地看到产生 MySQL 错误的 HTTP 请求的日志(时间相同,IP 地址是我的测试机器的 IP 地址)。所以很明显我正在询问一个在开发模式下运行的应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2018-03-29
    • 2015-02-15
    相关资源
    最近更新 更多