アプリを本番環境にしようとしていますが、画像とCSSアセットパスが機能しません。
私が現在していることは次のとおりです。
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
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
パスに注意してください)。
/config/environments/production.rb
にこれを追加する必要がありました。
Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )
.jsは既にプリコンパイルされていましたが、とにかく追加しました。 .cssと.css.erbは明らかに自動的には発生しません。 ^[^_]
はコンパイルからパーシャルを除外します-これは正規表現です。
ドキュメントがアセットパイプラインISがデフォルトで有効になっていることを明確に述べているが、javascriptにのみ適用される事実を明確にしていないのは少しイライラします。
Rails 4では、以下の変更を行う必要があります。
config.assets.compile = true
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
これは私と一緒に動作します。次のコマンドを使用してアセットをプリコンパイルします
Rails_ENV=production bundle exec rake assets:precompile
幸運を祈ります!
私はちょうど同じ問題を抱えていて、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?
環境変数を設定できます。
次のように変更することでこの問題を解決できました: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より
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に設定する必要があります。
本番環境でアセットを提供するには、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;
}
Rails 4では、指紋のないバージョンのアセットは生成されなくなりました。stylesheets/ style.cssは生成されません。
stylesheet_link_tag
を使用すると、スタイルシートへの正しいリンクが生成されます
さらに、styles.css
は、プリコンパイルされるもののリストであるconfig.assets.precompile
にある必要があります
production.rbファイルの行を変更します
config.assets.compile = false
に
config.assets.compile = true
また、追加します
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
上記の私の同僚の何人かはあなたにこれをすることを勧めています:
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
私はUbuntu Server 14.04、Ruby 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を再起動するだけです。わたしにはできる!
それが他の誰かに役立つことを願っています!
プリコンパイルが設定されている場合は必要ありません
config.assets.compile = true
これはアセットをライブで提供するためです。
私たちの問題は、config/secrets.yml
に設定された開発秘密鍵ベースしか持っていなかったことです
development:
secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'
実稼働環境へのエントリが必要
これを見つけました:
構成オプション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
の追加は引き続き機能しますが、将来削除されます。
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 )
ファイルをコンパイルするためのデフォルトのマッチャーには、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
まず、アセットを確認してください。アセットのプリコンパイルにエラーがある可能性があります。
実稼働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']
Rails_ENV=production bundle exec rake assets:precompile
は成功したが、期待どおりに機能しないという同じ問題に直面しました。
ユニコーンが主犯であることがわかりました。
あなたの場合と同じように、アセットをコンパイルした後にUnicornを再起動しました。 Unicornを再起動すると、そのワーカープロセスのみが再起動され、マスタープロセスは再起動されないことがわかりました。
これが正しいアセットが配信されない主な理由です。
その後、アセットをコンパイルした後、Unicornマスタープロセスも再起動し、正しいアセットが提供されるように、Unicornを停止して起動しました。
Unicornを停止して起動すると、Unicornの再起動と比較して、ダウンタイムが約10秒かかります。これは、長期的な解決策がUnicornからPumaに移行する場合に使用できる回避策です。
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
}
これにより、本番環境での問題が修正されました。それをnginx設定に入れてください。
私は間違っているかもしれませんが、変更を推奨する人
config.assets.compile = true
この行のコメントは次のとおりです。#プリコンパイル済みのアセットが欠落している場合、アセットパイプラインにフォールバックしないでください。
これは、これをtrueに設定することで、問題を修正するのではなく、毎回問題を回避してパイプラインを実行することを示唆しています。これは確かにあなたのパフォーマンスを殺し、パイプラインの目的を無効にする必要がありますか?
これと同じエラーが発生しましたが、Railsが知らなかったサブフォルダーで実行されているアプリケーションが原因でした。
したがって、cssファイルはhome/subfolder/app/public/....にありますが、Railsはhome/app/public/...にあります。
アプリをサブフォルダーから移動するか、Railsにサブフォルダー内にあることを伝えてください。