【问题标题】:rails + nginx + passenger not finding my gemified precompiled assets in productionrails + nginx + 乘客在生产中找不到我的 gemified 预编译资产
【发布时间】:2020-03-01 11:01:04
【问题描述】:

我的应用程序在我的本地 Mac 上使用 config.serve_static_assets = true 在开发和生产中运行良好。但是,在 Ubuntu 18.04 服务器上的生产中,我在 NGINX 中收到以下错误:

No such file to load -- opal_ujs.rb (LoadError)

当我执行find . | grep opal_ujs 时,我看到以下内容

./vendor/bundle/ruby/2.5.0/gems/opal-rails-0.9.5/lib/assets/javascripts/opal_ujs.js.rb
./public/assets/opal_ujs-a633a78701574b25c28a62e6892b2a6f2cb93afcd9b71edc9bf5eea75a296481.js.gz
./public/assets/opal_ujs-a633a78701574b25c28a62e6892b2a6f2cb93afcd9b71edc9bf5eea75a296481.js

好的,它就在那里。为什么不送达。 相关production.rb sn -p如下:

  config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
  config.assets.compile = true
  config.serve_static_assets = false
  config.assets.digest = true

我的设置是 Phusion Passenger + NGINX。我的应用程序的 NGINX 服务器配置经过了多次试验,但目前如下,另一次尝试将其注释掉:

server {
        listen 80;
        listen [::]:80;

        server_name myapp.domain;
        passenger_enabled on;
        rails_env    production;
        root         /home/deploy/myapp/current/public;

        # Allow uploads up to 100MB in size
        client_max_body_size 100m;

        #location ~ ^/(assets|packs) {
        # expires max;
        # gzip_static on;
        #}

        # Rails asset pipeline support.

        location ~ ^/assets/ {
          root         /home/deploy/myapp/current/public;
          gzip_static on; # to serve pre-gzipped version
          expires max;
          add_header Cache-Control public;

          # add_header ETag "";
          break;
        }
        # Rails asset pipeline support.
#       location ~ "^/assets/.+-([0-9a-f]{32}|[0-9a-f]{64})\..+" {
#           error_page 490 = @static_asset;
#           error_page 491 = @dynamic_request;
#           recursive_error_pages on;

#           if (-f $request_filename) {
#               return 490;
#           }
#           if (!-f $request_filename) {
#               return 491;
#           }
#       }
#       location @static_asset {
#           gzip_static on;
#           expires max;
#           add_header Cache-Control public;
#           add_header ETag "";
#       }
#       location @dynamic_request {
#           passenger_enabled on;
#       }
}

我在这里做错了什么?

【问题讨论】:

  • 您能否显示 opal_ujs 包含在源代码中的哪个位置,或者如果直接请求它,直接路径是什么样的?另外,在您的服务器中弹出 open rails 控制台并检查此 Rails.application.assets 的输出,您是否看到那里的蛋白石文件?
  • 这是一组被大量使用的 gemified 资产,我在其他地方没有问题。它们是通过常规要求加载的。尽管需要蛋白石红宝石。问题似乎实际上是蛋白石。有两件事消除了这个问题。更新到 Rails 6 清单加载资产与过滤器的方式以及竞争性删除 Opal 的方式真是太糟糕了。我将补充一点,例如删除第一个列出的要求,即 opal_ujs 将有助于投诉下一个文件。 Opal 出于某种原因没有编写资产指纹,即使我已将摘要设置为 true 等。

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


【解决方案1】:

你尝试加载一个名为

的文件
opal_ujs.rb

你有这些文件:

opal_ujs.js.rb

在资产中

opal_ujs-xxxxx.js

可能不是同一个文件。

【讨论】:

  • 它是通过资产管道,否则为什么它会在本地工作?即使在本地生产模式下。而且。它对 application.js 中的需求感到不满。这不像我可以为需求指定asset_path。如果我从 require 中删除 opal_ujs ,它就会出现在列表中。
猜你喜欢
  • 1970-01-01
  • 2016-10-14
  • 2013-05-08
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多