【问题标题】:Rails app on Nginx/Passenger/Capistrano: assets not workingNginx/Passenger/Capistrano 上的 Rails 应用程序:资产不工作
【发布时间】:2014-12-10 05:06:40
【问题描述】:

好的,我知道有一些关于类似问题的帖子已打开,但我已经花了两三天的时间试图解决这个问题,但我一无所知。我在 Rails 3.2.8 上开发了一个应用程序,并使用本教程将其部署到 Digital Ocean 服务器:https://gorails.com/deploy/ubuntu/12.04

这涉及在安装了 Nginx 和 Passenger 的服务器上使用 Capistrano 3.1.0 进行部署。 Ruby 是 rvm 的经理。

会发生什么: - css 不加载,除了 application.css (仅在此文件上编码的基本 css 工作) - js没有加载 - 销毁/删除路由不起作用(可能是由于未加载主 js) - 该应用程序在开发环境中运行良好

我尝试过的: - 在生产环境中预编译资产,通过 ssh 连接 - 在开发环境中预编译资产,然后将它们推送到生产环境 - 之后检查资产是否已生成并位于 /current/public - 尝试几个 nginx 的配置选项 - 尝试 production.rb 的几个配置选项 - 每次尝试后重新启动 nginx:sudo service nginx restart

我认为这一定是配置问题,但我自己找到它的机会非常低(这是我自己部署的第一个应用程序),因此我们将不胜感激。 提前致谢。

config/environment/production.rb:

  config.serve_static_assets = false
  config.assets.compress = true
  config.assets.compile = false
  config.assets.digest = true

  config.assets.precompile += ['grid.css']
  config.assets.precompile += ['anything-slider.css']
  config.assets.precompile += ['nivo-slider.css']
  config.assets.precompile += ['jPlayer.css']
  config.assets.precompile += ['lightbox.css']
  config.assets.precompile += ['reset.css']
  config.assets.precompile += ['anything-slider.js']
  config.assets.precompile += ['jplayer.playlist.min.js']
  config.assets.precompile += ['jquery-1.11.0.min.js']
  config.assets.precompile += ['jquery-ui.js']
  config.assets.precompile += ['jquery.jplayer.min.js']
  config.assets.precompile += ['jquery.js']
  config.assets.precompile += ['jquery.mousewheel.js']
  config.assets.precompile += ['jquery.nivo.slider.pack.js']
  config.assets.precompile += ['lightbox.min.js']
  config.assets.precompile += ['nivo-slider.js']
  config.assets.precompile += ['populate_jplayer.js']
  config.assets.precompile += ['quickstand.js']
  config.assets.precompile += ['script.js']
  config.assets.precompile += ['tooltipsy.js']

config/application.rb:

config.assets.enabled = true
config.assets.initialize_on_precompile = false

Capfile:

# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'

# Includes tasks from other gems included in your Gemfile
#
require 'capistrano/bundler'
require 'capistrano/rails'
# require 'capistrano/rails/assets'
# require 'capistrano/rails/migrations'

require 'capistrano/rvm'
set :rvm_type, :user
set :rvm_ruby_version, '2.1.3'

# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

/etc/nginx/sites-enabled/default

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        server_name porinstinto.com;
        passenger_enabled on;
        rails_env    production;
        root         /home/deploy/porinstinto/current/public;

        location ~* ^/assets/ {
        # Per RFC2616 - 1 year maximum expiry
        # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
            expires 1y;
            add_header Cache-Control public;

        # Some browsers still send conditional-GET requests if there's a
        # Last-Modified header or an ETag header even if they haven't
        # reached the expiry date sent in the Expires header.
            add_header Last-Modified "";
            add_header ETag "";
            break;
        }

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

application.js

//
//= require jquery
//= require jquery_ujs
//= require anything-slider
//= require jplayer.playlist.min
//= require jquery-ui
//= require jquery.jplayer.min
//= require jquery.mousewheel
//= require jquery.nivo.slider.pack
//= require lightbox.min
//= require nivo-slider
//= require populate_jplayer
//= require quickstand
//= require script
//= require tooltipsy
//= require_tree .

application.css

 *
 *= require anything-slider
 *= require grid
 *= require jPlayer
 *= require lightbox
 *= require nivo-slider
 *= require reset 
 *= require_self
 *= require_tree .
 */

更新: 我发现 Capistrano 预编译正在生成空的应用程序 .css 和 .js 文件。我尝试在开发时预编译资产并上传它们,但似乎 Capistrano 在部署和资产被覆盖为空文件后再次预编译。

有什么线索吗?

【问题讨论】:

  • 检查 Nginx 日志。你能看到传入的资产请求吗?这些请求是否正确(拼写、路径)? Nginx 是否返回 404?
  • /var/log/nginx/error.log 似乎为空。 tail -f log/production.log 似乎不是在请求资产...
  • Started GET "/entries" for 213.27.137.58 at 2014-10-15 07:07:41 -0400 Processing by EntriesController#index as HTML Rendered layouts/_next_concert.html.haml (1.0ms) Rendered layouts/_social_network.html.haml (2.1ms) . . . Rendered layouts/_notices.html.haml (0.3ms) Rendered layouts/_copyright.html.haml (1.0ms) Completed 200 OK in 59ms (Views: 45.2ms | ActiveRecord: 5.8ms)
  • 所以你说所有的预编译资产都在那里?查看您的 HTML 输出 - 资产文件名是什么样的?它们与预编译的相同还是不同?完整的请求 URL 是什么样的?
  • 网页加载完毕后,头部会出现一些请求的.css文件,例如:href="/assets/anything-slider-dd5dc923ac634c7fa6d7b143be5670cd.css"这些文件是在application.html.haml上请求的:= stylesheet_link_tag "anything-slider"

标签: ruby-on-rails ruby-on-rails-3 nginx capistrano assets


【解决方案1】:

经过仔细研究并得到question的帮助,我终于解决了这个问题。

总是,在使用 Capistrano 部署应用程序时,在编译资产时会间接引用 RVM,因此开始对此进行调查。

找到ruby版本的开发环境:

$ ruby -v
ruby 1.9.3p545 (2014-02-24 revision 45159) [x86_64-linux]

在生产服务器上找到 RVM 使用的 ruby​​ 版本:

$ rvm use
Using /home/deploy/.rvm/gems/ruby-2.1.3

那么,我觉得这可能是一些 ruby​​ 版本冲突? RVM 的更改 Ruby 版本:

$ rvm install 1.9.3
$ rvm use 1.9.3
$ rvm --default 1.9.3

然后,需要安装所有 gem 并使用新设置预编译资产:

$ bundle Install
$ RAILS_ENV=production bundle exec rake assets:precompile

资产文件 application.js 和 application.css 成功创建了所有内容,当重新启动网络应用程序时,一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-22
    • 2020-04-30
    • 2018-04-24
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2016-06-21
    • 2017-08-14
    相关资源
    最近更新 更多