CSS 无法在生产中加载 - 开发中一切正常(Rails 4.1、Capistrano 3;bootstrap),更新:nginx 配置问题

rub*_*y24 2 deployment ruby-on-rails nginx twitter-bootstrap capistrano3

问题如下:在开发中一切正常,但是当我将 Rails 应用程序部署到生产环境时,该网站以纯 html 格式运行,但 CSS(引导程序)未加载(JS 可能也未加载)。

抱歉,我花了 2 天时间寻找了大约 15 种可能的解决方案,但无法使其发挥作用......

更新:按照@rich-peck的建议后,看起来这是一个服务器问题。更新了 nginx 配置

我的设置:

  • 红宝石 2.1.2、Rails 4.1
  • 雷本夫
  • mysql2 作为数据库
  • 引导程序3
  • 服务器上的 Ubuntu 14.04,带有 nginx 和乘客
  • 用于部署的 Capistrano 3

配置如下 - Production.rb:

config.cache_classes = true
config.eager_load = true
config.consider_all_requests_local       = false
config.action_controller.perform_caching = true
config.serve_static_assets = true
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true
config.assets.version = '1.0'
config.log_level = :info
config.assets.precompile << /(^[^_\/]|\/[^_])[^\/]*$/
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
config.log_formatter = ::Logger::Formatter.new
config.active_record.dump_schema_after_migration = false
Run Code Online (Sandbox Code Playgroud)

上限文件:

require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/bundler'
require 'capistrano/rails'
require 'capistrano/rbenv'
set :rbenv_type, :user
set :rbenv_custom_path, '/home/deploy/.rbenv/'
set :rbenv_ruby, '2.1.2'
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
Run Code Online (Sandbox Code Playgroud)

在应用程序.rb中:

...
# Enable the asset pipeline
config.assets.enabled = true
...
Run Code Online (Sandbox Code Playgroud)

应用程序.css.scss:

/* ...
*= require_self
*= require_tree .
*/

@import "bootstrap";
@import "custom";
@import "exchange_rates";
@import "contacts";
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的(以及其他许多尝试):

# on dev machine and server /current:
RAILS_ENV=production bundle exec rake assets:precompile
Run Code Online (Sandbox Code Playgroud)

请参阅部署后将自定义 CSS 和 Javascript 链接到 Rails

在配置中:

config.serve_static_assets = true # tried false
config.assets.compile = false     # tried true
Run Code Online (Sandbox Code Playgroud)

查看Rails 应用程序未在生产环境中加载 css/js/images

Production.log不会抛出任何错误,除了带有js的页面。

还阅读了很多有关 Rails Asset Pipeline 和 nginx 服务器设置的内容,但无法弄清楚......任何帮助将不胜感激!

更新:nginx 服务器配置

最初,我遵循了 gorails 上非常有用且清晰的部署教程:https://gorails.com/deploy/ubuntu/14.04

然而,nginx 没有正确启动,所以我更新了配置文件(在 SO 的帮助下)如下:

/etc/nginx/nginx.conf:

events {
  worker_connections  4096;  ## Default: 1024
}

http {
    ##
    # Phusion Passenger
    ##
    # Uncomment it if you installed ruby-passenger or ruby-passenger-enterprise
    ##
    passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
    passenger_ruby /home/deploy/.rbenv/shims/ruby;
    passenger_nodejs /usr/bin/nodejs;
    server {
            listen 80 default_server;
            listen [::]:80 default_server ipv6only=on;

            server_name <URL>;
            passenger_enabled on;
            rails_env    production;
            root         /home/deploy/<PROJECT_NAME>/current/public;

            # redirect server error pages to the static page /50x.html
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

(相关网址和 PROJECT_NAME 已被编辑)

/etc/nginx/sites-enabled/default 我可以保留为空,这样我就可以让 nginx 顺利运行 - 除了资产的问题。有人有建议吗?

Ric*_*eck 5

要测试的几件事:

  • 当您预编译资产时,所需的文件是否出现在您的public目录中?

当您precompile创建资产时,您基本上是告诉 Rails 资产管道合并并编译public目录中的所有资产。这意味着如果您尝试在生产资产管道中包含特定文件,则应该对其进行预编译

我将运行该rake assets:precompile RAILS_ENV=production命令,然后查看public文件夹中的所有资产以检查它们是否在那里

--

  • 如果资产存在于您的public文件夹中,它们是否会被推送到服务器?

您应该SSH进入您的服务器并浏览到public您的应用程序的目录(在 中/current)。这将允许您查看您的资产是否已根据需要上传到您的服务器

如果它们不存在,则问题出在 Capistrano 的部署过程上;如果它们那里,则意味着您的 Rails 服务器有问题

--

  • 如果资产位于您服务器上的文件夹中public,则意味着服务器出现某种故障

确保这不是服务器问题的最佳方法可能是重新加载服务器。对于apache,您通常会使用service reload apache2,但我不确定nginx

这应该伴随着查看您的 Rails 安装 - 它是否调用文件assets中定义的正确内容config