【问题标题】:Rails image not loading in Nginx passenger serverRails 图像未在 Nginx 乘客服务器中加载
【发布时间】:2018-07-11 15:09:19
【问题描述】:

我已经安装了 Nginx Passenger 来部署我的 rails 应用程序。我已经完美地完成了一切,我的网站正在使用 CSS 和 Java 脚本在服务器中运行,但我无法在服务器中看到任何图像。我所有的图片都位于 /app/assets/images/

Production.rb

    Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # Code is not reloaded between requests.
  config.cache_classes = true

  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both threaded web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true

  # Full error reports are disabled and caching is turned on.
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # Attempt to read encrypted secrets from `config/secrets.yml.enc`.
  # Requires an encryption key in `ENV["RAILS_MASTER_KEY"]` or
  # `config/secrets.yml.key`.
  config.read_encrypted_secrets = true

  # 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?

  # Compress JavaScripts and CSS.
  config.assets.js_compressor = :uglifier
  #config.assets.css_compressor = :sass

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = true
  config.public_file_server.enabled = true
  # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb

  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
  #config.action_controller.asset_host = 'http://10.200.101.227'

  # Specifies the header that your server uses for sending files.
  # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
  config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX

  # Mount Action Cable outside main process or domain
  # config.action_cable.mount_path = nil
  # config.action_cable.url = 'wss://example.com/cable'
  # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]

  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  # config.force_ssl = true

  # Use the lowest log level to ensure availability of diagnostic information
  # when problems arise.
  config.log_level = :debug

  # Prepend all log lines with the following tags.
  config.log_tags = [ :request_id ]

  # Use a different cache store in production.
  # config.cache_store = :mem_cache_store

  # Use a real queuing backend for Active Job (and separate queues per environment)
  # config.active_job.queue_adapter     = :resque
  # config.active_job.queue_name_prefix = "pyraMID_#{Rails.env}"
  config.action_mailer.perform_caching = false

  # Ignore bad email addresses and do not raise email delivery errors.
  # Set this to true and configure the email server for immediate delivery to raise delivery errors.
  # config.action_mailer.raise_delivery_errors = false

  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
  # the I18n.default_locale when a translation cannot be found).
  config.i18n.fallbacks = true

  # Send deprecation notices to registered listeners.
  config.active_support.deprecation = :notify

  # Use default logging formatter so that PID and timestamp are not suppressed.
  config.log_formatter = ::Logger::Formatter.new

  # Use a different logger for distributed setups.
  # require 'syslog/logger'
  # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')

  if ENV["RAILS_LOG_TO_STDOUT"].present?
    logger           = ActiveSupport::Logger.new(STDOUT)
    logger.formatter = config.log_formatter
    config.logger    = ActiveSupport::TaggedLogging.new(logger)
  end

  ENV["APPLICATION_URL"] = "http://ip_address"
  # Do not dump schema after migrations.
  config.active_record.dump_schema_after_migration = false
end

/etc/nginx/sites-enable/default

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

  server_name ip_address;
  passenger_enabled on;
  rails_env    production;
  root         /var/www/test-site/public;

  location ~ ^/(assets)/  {
    root /var/www/test-site/public;
    gzip_static on; # to serve pre-gzipped version
    expires max;
    add_header  Cache-Control public;
   }
}

【问题讨论】:

  • 不要使用资产的实时编译而不是这样做config.assets.compile = true
  • @AjayBarot 我更改了 config.assets.compile = true 但仍然没有加载图像。提前致谢。
  • 这是控制台中出现的错误 - 4-1600x1000.jpg 加载资源失败:服务器响应状态为 500(内部服务器错误)
  • 您必须在production.rb 中添加config.assets.digest = true。我假设您正在清理资产并再次进行专业编译以查看结果。
  • @AjayBarot 我按照你说的尝试过,但图像仍然没有加载:-(

标签: ruby-on-rails nginx asset-pipeline


【解决方案1】:

对我有用的解决方法是清除缓存

rake tmp:cache:clear

谢谢大家的回复。

【讨论】:

    【解决方案2】:

    默认情况下,公共资产在 Rails 中为 false。

    有两种方式:

    1. production.rb 中的以下行从 false 更改为 true,如下所示

      config.public_file_server.enabled = true

    2. 如果您有.env.env.production 文件,则在同一文件中写入以下内容

      RAILS_SERVE_STATIC_FILES = true

      重启服务器。

    【讨论】:

    • 我需要从设置方面进行任何更改吗?
    • 只需要在 production.rb 中更改
    • 我已经更新了我的 production.rb 和 Nginx /sites-enables/default 文件,请查找它并提供您的反馈,如果您需要任何进一步的帮助,请告知。提前致谢。
    【解决方案3】:

    请在你的 .conf 文件中试试这个

    location ~ ^public/assets/ {
     add_header Last-Modified "";
     gzip_static on;
     expires 1M;
     access_log off;
     add_header Cache-Control "public";
    }
    

    保持位置为^public/assets/,我之前也遇到过同样的问题

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多