実稼働環境でテストしようとしているRailsアプリがあります。/public/assetsですべてのアセットを生成するRails_ENV=production rake assets:precompile
を実行しました。問題は、Rails_ENV=production Rails s thin
でアプリを起動すると、次のようになることです:
ActionController::RoutingError (No route matches [GET] "/assets/application-eff78fd67423795a7be3aa21512f0bd2.css"):
このファイルは、/public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css
にも存在します。
RoutingError
を取得している理由についての考え
実稼働モードでは、Railsは静的アセットの提供を担当しません。したがって、このエラーが発生します。 ThinはRailsの単なるラッパーであるため、これも行いません。
これは、アプリケーションのconfig/environments/production.rb
の次の設定によって制御されます。
config.serve_static_files = false
またはRails 5で:
# config/environments/production.rb
config.public_file_server.enabled = true
または、ENV['Rails_SERVE_STATIC_FILES']
をtrueに設定します。
そのtrue
に設定するか、ApacheやNginxのような静的アセットを提供する実サーバーを使用できます。 Powもそれをするかもしれないと思う。
Herokuを使用している場合、デフォルトでこの設定を有効にするRails_12factor
gemの使用を推奨しています。このように、宝石をproduction
のGemfile
グループに配置します。
group :production do
gem 'Rails_12factor'
end
ライアンが上記に述べたことに加えて、Railsアセットパイプラインガイドでは、Apacheまたはnginxをセットアップして静的アセットを提供する方法について説明しています。
http://guides.rubyonrails.org/asset_pipeline.html
これらのタスクはmongrel/thin/Unicornよりも最適化されているため、nginxまたはApacheを設定して静的アセットを提供する必要があります。
同じ問題を解決しました。私の場合、ライアンの答えは役に立たなかった。 BratscheはRails Guidesを指摘しましたが、残念ながらこれは私にとってもうまくいきませんでした。しかし、リソースは役に立ちました。そこで、そこからNginxの設定を取得し、パブリックディレクトリを指すrootディレクティブを追加しました。これがないと機能しません。
# serve static assets
location ~ ^/assets/ {
expires 1y;
root /path/to/my/cool_project/public;
add_header Cache-Control public;
add_header ETag "";
break;
}
Nginxを再起動してください。
実際、デフォルトの設定を変更する必要はありませんでした。 アセットファイルを再コンパイルするだけです。
1.rakeアセット:clobber Rails_ENV = production
2. rakeアセット:プリコンパイルRails_ENV = production
3.サーバーの再起動、例(nginx)
Rails 4.2では、config/environments/staging.rbおよびproduction.rbファイルに次の行が追加/変更されています。
config.serve_static_files = ENV['Rails_SERVE_STATIC_FILES'].present?
Rails_SERVE_STATIC_FILESが設定されておらず、あなたがRailsサーバーのサービス資産である場合(Unicornなど)、デフォルトで「false」になり、RoutingErrorが発生します。
これは簡単な修正です。
config.serve_static_files = true
以下のコードを試してください:
config.assets.compile = true
次にコマンドを実行します:
Rails_ENV=production rake assets:precompile
次に、すべてのコンパイルファイルとマニフェストファイルをサーバーにプッシュします。
Rails 5では、config.serve_static_files
オプションが変更されたため、次が必要です。
config.public_file_server.enabled = true
アセットをローカルで提供します。
テスト環境で私と同じエラーで誰かがここに来た場合、私が助けたのは次のとおりです:
Rails assets:clobber assets:precompile Rails_ENV=test
その後:
ps axu | grep your-username
spring server
プロセスと彼のPIDを見つけて、次の方法で強制終了します。
kill <spring-server-PID>
mina+puma+nginxを使用して、Rails 5アプリケーション、私は得た
ActionController::RoutingError (No route matches [GET] "/assets/application-658cf2ab3ac93aa5cb41a762b52cf49d7184509c307922cd3fbb61b237a59c1a.css")
config/environments/production.rbを確認してください
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV['Rails_SERVE_STATIC_FILES'].present?
NGINXはすでにこれを処理しています、正しく設定します
upstream puma {
server unix:///home/deploy/apps/appname/shared/tmp/sockets/appname-puma.sock;
}
server {
listen 80 default_server deferred;
# server_name example.com;
root /home/deploy/apps/appname/current/public;
access_log /home/deploy/apps/appname/current/log/nginx.access.log;
error_log /home/deploy/apps/appname/current/log/nginx.error.log info;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
try_files $uri/index.html $uri @puma;
location @puma {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_Host;
proxy_redirect off;
proxy_pass http://puma;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 10M;
keepalive_timeout 10;
}
物事はうまくいきます。