使用 AWS Ubuntu 和 RDS 部署时出现 mysql.sock 错误

使用 AWS Ubuntu 和 RDS 部署时出现 mysql.sock 错误
 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

相关内容