我即将在 Amazon Opsworks 上部署一个简单的 Rails 应用程序 - 使用运行 Phusion Passenger 的 EC2 实例和数据库服务器的 RDS 实例(它运行 mySQL)。应用程序代码是从我的 Git Repo 中获取的。
问题就在这里。
EC2 实例将提供我的静态 ROR 主页 - public/index.html 文件,所以我知道应用程序在那里,并且正在被提供服务。
当我尝试执行 HTTP GET 从数据库获取资源表示时,出现了问题。
以下是确切的错误代码:
“无法通过套接字‘/var/lib/mysql/mysql.sock’连接到本地 MySQL 服务器 (2) (Mysql2::Error)”
我猜测它正尝试通过套接字连接到我笔记本电脑上的本地 MySQL 服务器,而不是尝试连接到我在 database.yml 中指定的 Amazon RDS 实例(MySQL 数据库服务器)。
这是我的数据库.yml:
development:
adapter: mysql2
encoding: utf8
database: *********_development
pool: 5
username: ****
password: ****
socket: /tmp/mysql.sock
host: localhost
test:
adapter: mysql2
encoding: utf8
database: ********_test
pool: 5
username: ********
password: ****
socket: /tmp/mysql.sock
host: localhost
production:
adapter: mysql2
encoding: utf8
database: *****
username: ******
password: *****
host: ***dbinstance.*********.us-west-2.rds.amazonaws.com
port: 3306
如何让 rails 应用程序使用我在 database.yml 中指定的生产数据库,而不是始终尝试连接到本地数据库?
答案1
Opsworks 不使用您在应用程序中使用的 database.yml。要使其正常工作,您需要为 Opsworks 脚本提供正确的凭据。您可以将自定义 JSON 添加到堆栈中。请参阅此处了解其工作原理:
https://forums.aws.amazon.com/thread.jspa?threadID=119823
我在堆栈设置中添加了一个自定义 JSON,如下所示:
{
"deploy": {
"yourappname": {
"database": {
"adapter": "mysql2",
"encoding": "unicode",
"host": "yourdbonrds.rds.amazonaws.com",
"port": "3306",
"database": "yourdb",
"pool": "5",
"username": "yourusername",
"password": "yourpassword"
}
}
}
}
所有“您的”字段都需要通过您的自定义值进行交换。
还有一个提示。在 RDS 控制台中,您需要将 Opswork Rails 服务器的安全组添加到您的 RDS 实例,以便允许该实例连接到 RDS。请在此处查看如何操作:
您可以尝试一下是否可以从 Opsworks 实例连接到 RDS 实例,方法是通过 ssh 连接到该实例,然后通过 telnet 连接到您的 RDS 实例,例如 telnet Your-RDS-Instance 3306