10

我正在尝试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,这是 apache 的运行对象。我在 Amazon EC2 上使用 Phusion Passenger。

4

3 回答 3

9

SQLLite 通过让 Rails 进程写入 Rails 目录树中的系统文件来工作。Rails 进程归 Apache 所有,它默认设置一个用户“apache”和一个组“apache”。要使其工作,您需要向/db目录上的 apache 用户或组授予写权限。

或者

将 apache 配置为与已经拥有write该目录权限的组一起运行。一个好的策略是创建一组可能需要访问不同位置的各种进程——例如,我有一个“部署者”组,用户执行发布将是该组的一部分,以及 apache 实例。我通常发现拥有一个包含各种进程和登录用户的组可以让生活更轻松(例如查看服务器日志)、编写上传或缓存文件等。

和/或

使用真正的数据库服务器,如 PostgreSQL 或 MySQL——它们之所以有效,是因为它们是管理自己文件的自己的进程。Rails 进程(在您的情况下为 apache)连接到 Unix 端口上的数据库服务器进程。每个服务器进程只安全地管理它知道的文件。

SQLLite 很好上手 - 超级简单且开销低,但很快您就需要在生产环境中运行常规数据库服务器。然后你很快就会发现 SQLLite 和其他的东西并不完全相同,此时你应该在你的开发机器上安装相同的数据库服务器。

于 2012-11-07T21:48:30.313 回答
2

这是因为 nginx 创建 www-data 用户,并且该用户没有读取 sqlite3 文件和您的应用程序的权限...

您需要运行命令:

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

2.sudo chmod -R 777 rails_project/

并检查您是否在生产模式下启动了您的应用程序。

于 2014-07-22T22:04:04.717 回答
-1

在所有内容都归根用户所有的应用程序中遇到了这个问题。

这就是我如何解决的。

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

底线是:这是premssions问题,您需要确保拥有该应用程序的人无论是root用户还是非root用户,您只需要授予该用户对正在使用的数据库的读写访问权限chmod -R 0777 db/。调整它以适合您自己的安全级别。

于 2016-11-27T17:52:31.053 回答