Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Rails.root: /opt/deployment.myproject/releases/20140805050704
我花了三天多的时间试图找到这个问题的答案。也试图了解幕后发生的事情,但现在我觉得是时候向世界寻求帮助了!
我正在使用 AWS 在 Ubuntu AMI、EC2 和 RDS 上部署 Ruby on Rails 应用程序。我决定使用 MSQL 数据库,因为我用它构建了我的应用程序,并且使用了 RDS。
由于我使用的是 RDS,并且必须提供终端节点、用户名和密码,因此我认为错误中的提示“本地”可能告诉我它认为数据库是本地的。我相信事实并非如此,因为它与我的 EC2 位于不同的实例上并且被链接到。(对吗?)
我尝试使用多种不同类型的“find”和“grep”命令来搜索 mysql.sock 文件。实际搜索到的命令会返回一大串目录,其中显示“无权限”之类的信息。
我也在错误显示的路径中搜索过它,但是运行目录中没有mysql目录。
我认为以下几个问题可能有助于回答这个问题。
这个文件究竟是什么时候创建的?数据库是什么时候创建的?那么这个文件不应该在 RDS 实例上吗?还是在我运行“cap deploy:setup”或“cap deploy”时创建的?
由于它说的是“Rails.root”,我认为它正在从应用程序的根目录开始查找文件。因此,它应该是 app/var/run...etc,而不是实际的根目录。
哦,顺便说一下。当我通过 FTP 进入 EC2 实例时,我也收到了此消息。
Could not change directory to “var/run/mysqld/mysqld.sock' (2)
Rails.root:/opt/deployment.myproject/releases/20140803230821”.
还:我能够通过 Sequel Pro 连接到 RDS,并且我的迁移通过 Capistrano 完美运行,因为我的所有表都在那里!
我想我已经说得够多了。以下是一些可能相关的文件:
为简洁起见,缩短 my.cnf
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
数据库.yml
production:
adapter: mysql2
database: <censored db name>
host: <censored endpoint>
username: <censored username>
password: <censored password>
port: 3306
pool: 5
timeout: 5000
部署.rb
role :web, '<censored db name>'
role :app, '<censored db name>'
role :db, '<censored db name>', primary: true
set :rails_env, 'production'
set :webroot, '/opt/myproject' # specify directory symlink
set :deploy_to, '/opt/deployment.myproject'
set :user, 'ubuntu'
set :use_sudo, false
set :bundle_flags, '--deployment --quiet' # some bundler options
after 'deploy:update_code', 'deploy:symlink_shared'
after 'deploy:update_code', 'deploy:migrate'
load 'deploy/assets' # results in 'rake assets:precompile' during deploy
答案1
Capistrano 设置为使用生产环境,但无论您使用什么命令/脚本/等等来实际启动机器上的 Rails 应用程序都可能处于开发模式。
export RAILS_ENV=production
bin/rails s