如何在Elastic Beanstalk容器中提供Rails应用程序的Webpack资产?

6

我正在使用Rails5应用程序,并成功地将其部署到EB容器中。

但是,在生产环境中,直接在public/packs中提供的webpack打包后的资源会返回404错误。

在当前情况下,我设置了RAILS_SKIP_ASSET_COMPILATION = false,因此我每次部署应用程序之前都需要预编译资产。

我曾经在Heroku上作为生产环境使用过,那时一切都很顺利。

这是我的config/webpacker.yml

source_path: app/frontend/javascripts
  source_entry_path: packs
  public_output_path: packs # public/packs/filename-[hash].js
  cache_path: tmp/cache/webpacker

  # Additional paths webpack should lookup modules
  # ['app/assets', 'engine/foo/app/assets']
  resolved_paths: []

  # Reload manifest.json on all requests so we reload latest compiled packs
  cache_manifest: false

  extensions:
    - .js
    - .sass
    - .scss
    - .css
    - .png
    - .svg
    - .gif
    - .jpeg
    - .jpg

我的尝试...

我尝试将public_output_path从packs更改为assets,但仍出现相同的错误...

4个回答

4

我也遇到了这个问题。不确定你是否在使用Nginx或Passenger,但如果是Nginx的话,你可能需要将以下location块添加到/etc/nginx/conf.d/webapp_healthd.conf中:

location /packs {
  alias /var/app/current/public/packs;
  gzip_static on;
  gzip on;
  expires max;
  add_header Cache-Control public;
}

然后运行sudo /etc/init.d/nginx restart。这应该足以使其正常工作。但您需要在项目中创建一个.ebextensions/文件,其中包含这些自定义设置,以便它不被Elastic Beanstalk默认配置覆盖。请参阅Maria Luisa Carrion D.的此篇文章以查看如何自动化nginx配置。

如果您使用Amazon Linux 2 EB平台,则此处的推荐方法是:https://dev59.com/2anka4cB1Zd3GeqPPYWI#69103413 - stwr667

0

不用修改Elasticbeanstalk的情况下,绕过所有这些的最快方法是更改您的webpacker.yml文件,将其使用assets/packs而不是已经正确提供服务的packs。

production:
  <<: *default

  # Production requires the packs folder to be in assets for nginx
  public_output_path: assets/packs


0

有了Amazon Linux 2 Elastic Beanstalk平台,这现在变得更加容易了。

nginx的默认配置文件位于/etc/nginx/nginx.conf,您可以通过eb ssh连接到服务器后查看。

server {...}块中有一行代码:

# Include the Elastic Beanstalk generated locations
include conf.d/elasticbeanstalk/*.conf;

这个包含文件的作用是让您可以轻松地为您的服务器包含其他位置规则。如果您还没有在应用程序中创建一个.platform文件夹,请在根目录下创建一个,并创建一个配置文件,路径为:.platform/nginx/conf.d/elasticbeanstalk/10_packs_location.conf("10_packs_location"可以是任何名称)。

将以下内容放入这些文件中:

location /packs {
  alias /var/app/current/public/packs;
  gzip_static on;
  gzip on;
  expires max;
  add_header Cache-Control public;
}

然后在您的下一次部署时,您将在/etc/nginx/conf.d/elasticbeanstalk/下看到您的新的“10_packs_location.conf”文件,该文件将被/etc/nginx/nginx.conf包含。

完成后,新的位置规则将已应用。

有关更多详细信息,请参见此处的文档:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html


0
另一种解决方案是让Rails本身提供资产服务,而不是NGINX。
在您的config/environments/production.rb中,您可能有以下内容:
# 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?

如果在AWS EB中设置RAILS_SERVE_STATIC_FILES = enabled,Rails将提供资产服务。
这是Heroku的默认行为: https://devcenter.heroku.com/changelog-items/617 这是一个很好的帖子: https://acuments.com/rails-serve-static-files-with-nginx.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接