Rails:SQLite3 :: CantOpenException:无法打开数据库文件

时间:2012-10-10 05:47:31

标签: sql ruby-on-rails ruby-on-rails-3 sqlite amazon-ec2

我正在尝试使用delayed_job来安排使用Sqlite3的任务,看起来apache无法读取我的production.sqlite3文件。

这是我的database.yml

production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000

这是我得到的错误(在log / production.log中):

ActiveRecord::StatementInvalid (SQLite3::CantOpenException: unable to open database file:) 

我已经RAILS_ENV=production rake db:createRAILS_ENV=production rake db:migrate了。 db/production.sqlite3文件存在,db目录及其所有子文件夹归apache:apache所有,这是apache运行的对象。我在Amazon EC2上使用Phusion Passenger。

3 个答案:

答案 0 :(得分:9)

SQLLite的工作原理是让Rails进程写入Rails目录树中的系统文件。 Rails进程由Apache拥有,它默认设置用户“apache”和组“apache”。要使其工作,您需要为/db目录上的apache用户或组授予写入权限。

OR

将apache配置为对已具有write目录权限的组运行。一个好的策略是创建一组可能需要访问各个位置的各种进程 - 例如,我有一个“deployer”组,用户执行发布将与apache实例一起成为其中的一部分。我通常发现,拥有各个进程和登录用户所属的组可以使生活更轻松(例如查看服务器日志),编写上传文件或缓存文件等。

和/或

使用像PostgreSQL或MySQL这样的真实数据库服务器 - 它们可以工作,因为它们是管理自己文件的自己的进程。 Rails进程(在您的情况下为apache)连接到Unix端口上的数据库服务器进程。每个服务器进程只安全地管理它知道的文件。

SQLLite很适合入门 - 超级简单且开销低,但很快你就需要在生产中运行常规数据库服务器。然后你很快就会发现SQLLite和其他产品之间的情况并不完全相同,此时你应该在你的开发机器上安装相同的数据库服务器。

答案 1 :(得分:3)

这是因为nginx创建了www-data用户,而且这个用户没有优先阅读sqlite3文件和你的app ...

您需要运行命令:

1。sudo chown -R www-data:www-data rails_project/

2。sudo chmod -R 777 rails_project/

并检查您是否以生产模式启动了应用。

答案 2 :(得分:-1)

在应用程序中遇到此问题,其中所有内容都由root拥有。

以下是我如何解决的问题。

root@se785fall16:/var/www/auth_whateveryousay# chmod -R 0777 db/


root@se785fall16:/var/www/auth_whateveryousay# ls -lad *
drwxr-xr-x 11 root root  4096 Nov 27 17:23 app
drwxr-xr-x  2 root root  4096 Nov 27 17:23 bin
drwxr-xr-x  5 root root  4096 Nov 27 17:23 config
-rw-r--r--  1 root root   130 Nov 27 17:23 config.ru
drwxrwxrwx  3 root root  4096 Nov 27 17:33 db
-rw-r--r--  1 root root   879 Nov 27 17:23 Gemfile
-rw-r--r--  1 root root  6367 Nov 27 17:24 Gemfile.lock
drwxr-xr-x  4 root root  4096 Nov 27 17:23 lib
drwxr-xr-x  2 root root  4096 Nov 27 17:25 log
drwxr-xr-x  2 root root  4096 Nov 27 17:23 public
-rw-r--r--  1 root root   227 Nov 27 17:23 Rakefile
-rw-r--r--  1 root root   898 Nov 27 17:23 README
-rw-r--r--  1 root root 26632 Nov 27 17:23 README.textile
drwxr-xr-x  6 root root  4096 Nov 27 17:23 spec
drwxrwxrwx  5 root root  4096 Nov 27 17:25 tmp
drwxr-xr-x  3 root root  4096 Nov 27 17:23 vendor

底线是:这是前提问题,您需要确保拥有该应用程序的任何人是root用户还是非root用户,您只需要为该用户提供对正在使用的数据库的读写权限{ {1}}。调整此选项以适合您自己的安全级别。