Ruby on rails Rails应用程序不服务于生产环境中的资产
我的应用程序在开发环境中运行时运行良好。在产品(Ruby on rails Rails应用程序不服务于生产环境中的资产,ruby-on-rails,asset-pipeline,Ruby On Rails,Asset Pipeline,我的应用程序在开发环境中运行时运行良好。在产品(rails server-e产品)中,浏览器无法访问css和js文件,并且在控制台上有如下消息: I, [2013-07-27T21:00:59.105459 #11449] INFO -- : Started GET "/javascripts/application.js" for 99.102.22.124 at 2013-07-27 21:00:59 +0000 F, [2013-07-27T21:00:59.108302 #11449]
rails server-e产品
)中,浏览器无法访问css和js文件,并且在控制台上有如下消息:
I, [2013-07-27T21:00:59.105459 #11449] INFO -- : Started GET "/javascripts/application.js" for 99.102.22.124 at 2013-07-27 21:00:59 +0000
F, [2013-07-27T21:00:59.108302 #11449] FATAL -- :
ActionController::RoutingError (No route matches [GET] "/javascripts/application.js"):
在生产环境中时,html源的标题部分:
<head>
<title>a Social Server</title>
<link data-turbolinks-track="true" href="/stylesheets/application.css" media="all" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet">
<script data-turbolinks-track="true" src="/javascripts/application.js"></script>
<meta content="authenticity_token" name="csrf-param">
<meta content="jYM4IAXTXAuKWeD4FEVrXgXRNFeB6EazU68ZBQfRqNY=" name="csrf-token">
</head>
档案:
source 'https://rubygems.org'
gem 'rails', '4.0.0'
gem 'sass-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'jquery-rails'
gem 'jquery-ui-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.2'
group :doc do
gem 'sdoc', require: false
end
group :twitter do
gem 'twitter', '4.8.1'
end
group :instagram do
gem 'instagram', '0.10.0'
end
group :tumblr do
gem 'tumblr_client'
end
gem 'twitter-bootstrap-rails'
gem 'therubyracer' #needed for runtime js on amazon ec2.
我很抱歉发布了这么多信息。我觉得这些信息可能是相关的
p、 在美国,我对rails的了解还不全面,所以请容忍我。谢谢~在production.rb中更改设置: rails 3.x
config.serve_static_assets = true
rails 4.x
config.serve_static_files = true
在本地测试生产环境时,必须在本地编译资产。只需运行以下命令:
RAILS_ENV=production bundle exec rake assets:precompile
它将生成public/assets
下的所有资产
接下来,您必须告诉Rails为资产本身提供服务。服务器软件(如Nginx或Apache)可以在Heroku这样的环境中为您做这件事,但在本地,您应该让Rails来做。在您的production.rb中更改此选项:
config.serve_static_assets = true
但在将代码推送到生产环境之前,请确保将其设置回false
这听上去像是在说
我发现了一个提示这是Rails 4.0.0资产管道中的一个bug,通过设置
config.assets.compile = true
。。。在config/environments/production.rb中
除了以某种方式将资产管道引入实际工作之外,该设置还将启用资产的实时编译。这通常对生产中的性能是一件坏事,但如果在部署时仍然手动预编译资产,则
rake assets:precompile
。。。实时编译不应该发生(因为必要的资产已经预编译)
我希望这有帮助:)以下命令在本地对我有效
rails server -e production
在运行“rails s”时,我遇到了相同的错误“ActionController::RoutingError(没有与[GET]“/assets/application.css”匹配的路由)。即使在预编译源代码之后,也要更改config precompile true。它仍然无法正确加载
选项“-e production”使这些RoutingError消失。我认为对于Rails 4.x,您必须将资产预编译到production或使用config.assets.compile,即使需要也可以
生产环境的默认Rails行为是“如果缺少预编译的资源,则不要回退到资源管道。”因此,不要。
习惯于不compi
config.assets.compile = false
如果使用此选项,则不需要使用:
config.serve_static_files = true
因为如果资产没有预编译,Rails将在服务请求之前编译
但是,如果您在生产之前预编译了资产,那么您不需要config.assets.compile=true
,但是如果您没有http\u服务器来服务预编译的资产,您需要config.service\u static\u files=true
来为请求提供Rails服务
不推荐使用设置config.service\u static\u assets
DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role (it merely enables serving everything in the `public` folder and is unrelated to the asset pipeline). The `serve_static_assets` alias will be removed in Rails 5.0. Please migrate your configuration files accordingly.
我希望这个答案能帮助你(读者)理解真正发生的事情检查这样一个文件:
public/assets/.sprockets-manifest-3f7771d777ceb581d754e4fad88aa69c.json
<script data-turbolinks-track="true" src="/javascripts/application.js"></script>
如果要将预编译的资产推送到生产服务器,则有可能会阻止推送到隐藏的“点”文件,而此基本文件将无法进入生产
在我的环境中,我需要在集成环境中预编译资产并将其推送到生产环境中,这样就不需要在生产机器上编译资产。我错误地阻止了所有隐藏文件被推送到生产机器中
若要查看此答案是否适用于您,请从生产服务器在浏览器中检查生成的HTML源,以查看是否已生成资产路径。如果您看到脚本标记,如下所示:
public/assets/.sprockets-manifest-3f7771d777ceb581d754e4fad88aa69c.json
<script data-turbolinks-track="true" src="/javascripts/application.js"></script>
检查src属性。它应该以/assets/javascript
开头。在这种情况下,它以/javascript
开头,这表明Rails不认为任何资产已经预编译
我通过更新push to production(当前为rsync)来纠正这一问题,确保在集成服务器上预编译后推送.sprockets manifest*
文件
另外,我使用standalone Passenger作为我的集成测试服务器,而不是Webrick,因为它处理更现实的静态文件服务。如前所述config.serve\u static\u assets
已被弃用,取而代之的是config.serve\u static\u files
Rails-4.2然后我们会发现:
# 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?
这意味着设置和导出(在BASH中)环境变量export RAILS\u SERVE\u STATIC\u FILES=“到任何值”
在运行rails s-e production之前的会话中,将在本地测试时提供所需的结果,也将避免在推送到生产主机之前必须记住重新编码production.rb
。在rails 5.x中,设置为
config/initializers/assets.rb:
Rails.application.config.public_file_server.enabled = true
我正在尝试自己在ec2机器上部署此应用程序。在ec2上,我安装了ruby、rails,然后进行了“rails服务器-e生产”。因此,我想简单地告诉rails服务器命令env是production不会导致它编译资产?顺便说一句,如果我在production.rb中设置config.assets.compile=true,事情会再次正常工作。那么,如果你想自己部署应用程序,最好的方法是什么?如果我使用unicorn而不是webrick,这会有什么不同吗?告诉Rails环境是生产环境,实际上并不编译资产。您需要在本地预编译它们。您可能想看看这篇文章,它展示了如何使用gem asset\u sync将资产推送到S3和Cloudfront:If服务器软件(例如Nginx或Apache)为我做这件事。在我的理解中,这意味着在服务器端,它被设置为TRUE
(config.service\u static\u assets=TRUE
),但为什么我要在将其推送到服务器之前将其设置回FALSE
# 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?
Rails.application.config.public_file_server.enabled = true