我正在尝试使用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:create
和RAILS_ENV=production rake db:migrate
了。 db/production.sqlite3
文件存在,db目录及其所有子文件夹归apache:apache
所有,这是apache运行的对象。我在Amazon EC2上使用Phusion Passenger。
答案 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}}。调整此选项以适合您自己的安全级别。