web-dev-qa-db-ja.com

Rails 4:本番環境でアセットがロードされていません

アプリを本番環境にしようとしていますが、画像とCSSアセットパスが機能しません。

私が現在していることは次のとおりです。

  • 画像アセットは/app/assets/images/image.jpgにあります
  • スタイルシートは/app/assets/stylesheets/style.cssにあります
  • 私のレイアウトでは、次のようにcssファイルを参照しています:<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
  • Unicornを再起動する前に、Rails_ENV=production bundle exec rake assets:precompileを実行すると成功し、public/assetsディレクトリにフィンガープリントされたファイルが表示されます。

自分のサイトを閲覧すると、mysite.com/stylesheets/styles.cssに対して404 not foundエラーが表示されます。

何が間違っていますか?

更新:私のレイアウトでは、このように見えます:

<%= stylesheet_link_tag    "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag    "styles", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>

生成ソースは次のとおりです。

<link data-turbolinks-track="true" href="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>

Railsはコンパイルされたcssファイルを適切に検索していないようです。しかし、それは非常に混乱していますなぜjavascriptで正しく機能しています(/assets/****.jsパスに注意してください)。

113
emersonthis

/config/environments/production.rbにこれを追加する必要がありました。

Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )

.jsは既にプリコンパイルされていましたが、とにかく追加しました。 .cssと.css.erbは明らかに自動的には発生しません。 ^[^_]はコンパイルからパーシャルを除外します-これは正規表現です。

ドキュメントがアセットパイプラインISがデフォルトで有効になっていることを明確に述べているが、javascriptにのみ適用される事実を明確にしていないのは少しイライラします。

32
emersonthis

Rails 4では、以下の変更を行う必要があります。

config.assets.compile = true
config.assets.precompile =  ['*.js', '*.css', '*.css.erb'] 

これは私と一緒に動作します。次のコマンドを使用してアセットをプリコンパイルします

Rails_ENV=production bundle exec rake assets:precompile

幸運を祈ります!

102

私はちょうど同じ問題を抱えていて、config/environments/production.rbでこの設定を見つけました:

# Rails 4:
config.serve_static_assets = false

# Or for Rails 5:
config.public_file_server.enabled = false

それをtrueに変更すると動作しました。デフォルトでは、Railsは、Railsアプリにプロキシするのではなく、パブリックフォルダーからのファイルに対する要求を処理するようにフロントエンドWebサーバーを構成することを期待しているようです。おそらく、JavaScriptスタイルシートではなく、Javascriptファイルに対してこれを実行しましたか?

Rails 5ドキュメントを参照 )。コメントで述べたように、Rails 5を使用すると、デフォルト設定がRails_SERVE_STATIC_FILESであるため、config.public_file_server.enabled = ENV['Rails_SERVE_STATIC_FILES'].present?環境変数を設定できます。

82
davmac

次のように変更することでこの問題を解決できました:config.assets.compile = false
config.assets.compile = true in /config/environments/production.rb

更新(2018年6月24日):このメソッドは、使用しているスプロケットのバージョンが小さい場合、 セキュリティの脆弱性 を作成します2.12.5、3.7.2、または4.0.0.beta8より

22
Yanofsky

Rails 5の場合、次の構成コードを有効にする必要があります。

config.public_file_server.enabled = true

デフォルトでは、Rails 5には次の設定行が付属しています。

config.public_file_server.enabled = ENV['Rails_SERVE_STATIC_FILES'].present?

したがって、環境変数Rails_SERVE_STATIC_FILESをtrueに設定する必要があります。

12
ytbryan

本番環境でアセットを提供するには、2つのことを達成する必要があります。

  1. アセットをプリコンパイルします。
  2. サーバー上のアセットをブラウザに提供します。

1)アセットをプリコンパイルするには、いくつかの選択肢があります。

  • ローカルマシンでrake assets:precompileを実行し、ソースコード管理(git)にコミットしてから、capistranoなどの展開プログラムを実行できます。これは、プリコンパイル済みアセットをSCMにコミットするのに適した方法ではありません。

  • サーバーを再起動する前に、Railsアプリを運用環境に展開するたびに、ターゲットサーバーでRails_ENV=production rake assets:precompileを実行するrakeタスクを作成できます。

Capistranoのタスクのコードは次のようになります。

on roles(:app) do
  if DEPLOY_ENV == 'production'
    execute("cd #{DEPLOY_TO_DIR}/current && Rails_ENV=production rvm #{Ruby_string} do rake assets:precompile")
  end
end

2)これで、運用サーバーにアセットがありました。それらをブラウザーに提供する必要があります。

繰り返しますが、いくつかの選択肢があります。

  • config/environments/production.rbで提供されるRails静的ファイルをオンにします

    config.serve_static_assets = true # old
    
    or
    
    config.serve_static_files = true # new
    

    Railsを使用して静的ファイルを提供すると、Railsアプリのパフォーマンスが低下します。

  • 静的ファイルを提供するようにnginx(またはApache)を構成します。

    たとえば、Pumaで動作するように構成されたnginxは次のようになります。

    location ~ ^/(assets|images|fonts)/(.*)$ {
        alias /var/www/foster_care/current/public/$1/$2;
        gzip on;
        expires max;
        add_header Cache-Control public;
    }
    
10

Rails 4では、指紋のないバージョンのアセットは生成されなくなりました。stylesheets/ style.cssは生成されません。

stylesheet_link_tagを使用すると、スタイルシートへの正しいリンクが生成されます

さらに、styles.cssは、プリコンパイルされるもののリストであるconfig.assets.precompileにある必要があります

4

production.rbファイルの行を変更します

config.assets.compile = false

config.assets.compile = true

また、追加します

config.assets.precompile =  ['*.js', '*.css', '*.css.erb']
3
Jassa Mahal

すべきでないこと:

上記の私の同僚の何人かはあなたにこれをすることを勧めています:

config.serve_static_assets = true  ## DON”T DO THIS!! 
config.public_file_server.enabled = true ## DON”T DO THIS!!

Railsアセットパイプラインは、上記のアプローチについて述べています。

このモードはより多くのメモリを使用し、デフォルトよりもパフォーマンスが低下するため、お勧めしません。こちらをご覧ください:( http://edgeguides.rubyonrails.org/asset_pipeline.html#live-compilation

あなたがすべきこと:

1。アセットをプリコンパイルします。

Rails_ENV=production rake assets:precompile

2。これらのファイルをgitに追加します

git add –-all

3。マスターブランチに変更をプッシュして再デプロイします。

git Push Origin master

3
BKSpurgeon

私はUbuntu Server 14.04Ruby 2.2.1およびRails 4.2.4デプロイに従いました DigitalOceanからのTurorial とすべてが順調に進みましたが、ブラウザに移動してVPSのIPアドレスは、アプリはロードされていますが、スタイルとJavaScriptがありません。

アプリはUnicornおよびNginxで実行されています。この問題を修正するために、ユーザー'deployer'でSSHを使用してサーバーに入り、アプリパス'/ home/deployer/apps/blog'および次のコマンドを実行します。

Rails_ENV=production bin/rake assets:precompile

次に、VPSを再起動するだけです。わたしにはできる!

それが他の誰かに役立つことを願っています!

2
Alex Ventura

プリコンパイルが設定されている場合は必要ありません

config.assets.compile = true

これはアセットをライブで提供するためです。

私たちの問題は、config/secrets.ymlに設定された開発秘密鍵ベースしか持っていなかったことです

development:
    secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'

実稼働環境へのエントリが必要

2
xxjjnn

これを見つけました:

構成オプションconfig.serve_static_assetsは、役割を明確にするためにconfig.serve_static_filesに名前が変更されました。

config/environments/production.rbで:

# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.serve_static_files = ENV['Rails_SERVE_STATIC_FILES'].present?

したがって、env Rails_SERVE_STATIC_FILESを設定するか、Nginxを使用して静的ファイルを提供します。 config.serve_static_assets = trueの追加は引き続き機能しますが、将来削除されます。

1
Daniel Wei

capistranoにアセットをプリコンパイルさせることはお勧めしません。これは、時間がかかり、しばしばタイムアウトになる可能性があるためです。ローカルアセットのプリコンパイルを試みます。

最初に、config/application.rb config.assets.initialize_on_precompile = falseに設定し、ローカルRails_ENV=production bin/rake assets:precompileを実行して、それらのパブリック/アセットをgitに追加します。

config/environments/development.rbで、プリコンパイルされたアセットを使用しないようにアセットパスを変更します。

config.assets.prefix = '/dev-assets'

データベース接続の問題がある場合は、データベースを使用する初期化子があることを意味します。回避方法の1つは、production.rbをproduction2。rbとして複製して新しい環境を設定し、database.ymlにproduction2環境(developmentdb設定)。それから

Rails_ENV=production2 bin/rake assets:precompile

それでもckeditorなどのアセットに関する問題に直面している場合は、jsファイルをconfig/initializers/assets.rbに追加してください

Rails.application.config.assets.precompile += %w( ckeditor.js )

1
James Tan

ファイルをコンパイルするためのデフォルトのマッチャーには、gemを含むapp/assetsフォルダーのapplication.js、application.cssおよびすべての非JS/CSSファイル(これにはすべての画像アセットが自動的に含まれます)が含まれます。

他のマニフェストまたは個別のスタイルシートとJavaScriptファイルを含める場合は、それらをconfig/initializers/assets.rbのプリコンパイル配列に追加できます。

Rails.application.config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

1
FreePender

まず、アセットを確認してください。アセットのプリコンパイルにエラーがある可能性があります。

実稼働ENVでアセットをプリコンパイルするには、次のコマンドを実行します。

Rails_ENV=production rake assets:precompile

エラーが表示される場合は、まずそれを削除し、

「undefined variable」エラーの場合、別のファイルで使用する前にその変数ファイルをロードします。

例:

@import "variables";
@import "style";

application.rbファイルセットで、アセットの事前コンパイルのシーケンス

例:

config.assets.precompile += [ 'application.js', 'admin.js', 'admin/events.js', 'admin/gallery.js', 'frontendgallery.js']

config.assets.precompile += [ 'application.css', 'admin.css','admin/events.css', 'admin/gallery.css', 'frontendgallery.css']
1
Chitresh goyal

Rails_ENV=production bundle exec rake assets:precompileは成功したが、期待どおりに機能しないという同じ問題に直面しました。
ユニコーンが主犯であることがわかりました。

あなたの場合と同じように、アセットをコンパイルした後にUnicornを再起動しました。 Unicornを再起動すると、そのワーカープロセスのみが再起動され、マスタープロセスは再起動されないことがわかりました。
これが正しいアセットが配信されない主な理由です。

その後、アセットをコンパイルした後、Unicornマスタープロセスも再起動し、正しいアセットが提供されるように、Unicornを停止して起動しました。
Unicornを停止して起動すると、Unicornの再起動と比較して、ダウンタイムが約10秒かかります。これは、長期的な解決策がUnicornからPumaに移行する場合に使用できる回避策です。

0
Bhavya Keniya
location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;
  add_header ETag "";
}

これにより、本番環境での問題が修正されました。それをnginx設定に入れてください。

0

私は間違っているかもしれませんが、変更を推奨する人

config.assets.compile = true

この行のコメントは次のとおりです。#プリコンパイル済みのアセットが欠落している場合、アセットパイプラインにフォールバックしないでください。

これは、これをtrueに設定することで、問題を修正するのではなく、毎回問題を回避してパイプラインを実行することを示唆しています。これは確かにあなたのパフォーマンスを殺し、パイプラインの目的を無効にする必要がありますか?

これと同じエラーが発生しましたが、Railsが知らなかったサブフォルダーで実行されているアプリケーションが原因でした。

したがって、cssファイルはhome/subfolder/app/public/....にありますが、Railsはhome/app/public/...にあります。

アプリをサブフォルダーから移動するか、Railsにサブフォルダー内にあることを伝えてください。

0
Brad