即使Capistrano和MySQL Workbench可以,Rails也无法连接到MySQL

时间:2014-12-28 03:37:01

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

我刚刚部署了我的rails应用程序,创建了MySQL架构并通过capistrano复制了database.yml。我在MySQL Workbench中看到了DB表(它通过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确实被复制了。它也已正确符号链接。可能是什么问题呢?我该如何调试这个案例?我检查了生产日志,没有什么我能看到的可以解释这种情况。你能提出任何建议吗?

Fyi:我正在使用nginx和乘客。

1 个答案:

答案 0 :(得分:0)

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

所以这个谜团得到了解决 - 似乎rails应用程序在开发环境中的生产服务器上运行,而不是在生产中,尽管我使用cap production deploy进行部署。我写了一篇关于它的详细博客文章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地址)。很明显,我正在询问一个在开发模式下运行的应用程序。