10

Sqlite3を使用してタスクをスケジュールしようとしていますが、Apache がファイルdelayed_jobを読み取れないようです。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 ディレクトリとそのすべてのサブフォルダーはapache の実行者であるdb/production.sqlite3によって所有されています。apache:apacheAmazon EC2 で Phusion Passenger を使用しています。

4

3 に答える 3

9

SQLLiteは、RailsプロセスにRailsディレクトリツリー内のシステムファイルに書き込むことで機能します。RailsプロセスはApacheが所有しており、デフォルトでユーザー「apache」とグループ「apache」を設定します。/dbこれを機能させるには、ディレクトリ上のapacheユーザーまたはグループに書き込み権限を付与する必要があります。

また

writeディレクトリへのアクセス許可をすでに持っているグループで実行するようにapacheを構成します。優れた戦略は、さまざまな場所へのアクセスが必要になる可能性のあるさまざまなプロセスのグループを作成することです。たとえば、リリースを行うユーザーが参加する「デプロイヤー」グループと、apacheインスタンスがあります。私は通常、さまざまなプロセスとログインユーザーが参加しているグループを作成すると、(サーバーログの確認など)作業が楽になり、アップロードやキャッシュファイルの書き込みなどが容易になることがわかります。

および/または

PostgreSQLやMySQLのような実際のデータベースサーバーを使用します。これらは、独自のファイルを管理する独自のプロセスであるため、機能します。Railsプロセス(この場合はApache)は、Unixポートでデータベースサーバープロセスに接続します。各サーバープロセスは、認識しているファイルのみを安全に管理します。

SQLLiteを開始するのは問題ありません。非常に簡単でオーバーヘッドが少ないですが、すぐに本番環境で通常のデータベースサーバーを実行する必要があります。そしてすぐに、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

要するに、これは前提条件の問題であり、アプリの所有者がルートであるか非ルートであるかを確認する必要があります。使用されているデータベースに対する読み取りおよび書き込みアクセスをそのユーザーに付与するだけで済みchmod -R 0777 db/ます。これを微調整して、独自のセキュリティ レベルに合わせます。

于 2016-11-27T17:52:31.053 に答える