如何通过 ebextensions 配置文件添加 nginx 缓存控制标头?

Posted

技术标签:

【中文标题】如何通过 ebextensions 配置文件添加 nginx 缓存控制标头?【英文标题】:How to add nginx cache-control headers via an ebextensions config file? 【发布时间】:2013-11-07 10:20:36 【问题描述】:

首先,我很困惑。我已经 ssh'ed 到我们的弹性 beanstalk 实例以仔细阅读 nginx 所在的位置等,但似乎我找不到它。

显然,执行 curl 命令会产生如下标题:

Content-Encoding: gzip
Content-Type: text/css
Date: Wed, 23 Oct 2013 20:33:53 GMT
Last-Modified: Wed, 23 Oct 2013 18:59:04 GMT
Server: nginx/1.2.3
transfer-encoding: chunked
Connection: keep-alive

所以我假设 nginx 就在某个地方。我试图找到正确的位置,以便可以通过 ebextensions 注入配置文件。

基本上,我试图确保我在遥远的将来设置缓存控制,这似乎不起作用:

  03-nginx.config:
    files:
      "/etc/nginx/conf.d/custom.conf" :
        mode: "000777"
        owner: ec2-user
        owner: ec2-user
        content: |
            location ~ ^/assets/ 
              expires 1y;
              add_header Cache-Control public;

              add_header ETag "";
              break;
            

看来nginx 正在通过passenger-standalone 运行。

[ec2-user@ip-10-196-221-244 support]$ pwd
/var/app/support
[ec2-user@ip-10-196-221-244 support]$ ls pids
passenger.pid  passenger.pid.lock
[ec2-user@ip-10-196-221-244 support]$ cat pids/passenger.pid
1781
[ec2-user@ip-10-196-221-244 support]$ ps -eaf | grep 1781
root      1781     1  0 Sep25 ?        00:00:00 nginx: master process /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.6.2-1002/nginx-1.2.3/sbin/nginx -c /tmp/passenger-standalone.1704/config -p /tmp/passenger-standalone.1704/
webapp    1782  1781  0 Sep25 ?        00:00:57 nginx: worker process                                                                                                                                                       
ec2-user 26387 25743  0 10:53 pts/0    00:00:00 grep 1781

更新 我在配置了 cloudfront 的 rails 端使用这个配置。尽管标题与理想的推荐不符,但总比没有好。

  #--------------------------------------------------------------------------------
  # CDN
  #   Enable serving of images, stylesheets, and javascripts from an asset server
  #   http://thediscoblog.com/blog/2013/05/01/the-rails-cloudfront-and-heroku-performance-hat-trick/
  #   http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html
  #   http://www.mnot.net/cache_docs/
  #   Check with http://redbot.org/
  #   - set asset host
  #--------------------------------------------------------------------------------
  config.action_controller.asset_host = "http://cdn.staging.acme.com"
  config.assets.compress = true # Compress JavaScripts and CSS
  config.assets.compile = false # Don't fallback to assets pipeline if a precompiled asset is missed
  config.assets.digest = true # Generate digests for assets URLs
  # must do this so we can inject the proper cache-control headers for cloudfront, served very few times anyways...
  #config.serve_static_assets = true
  config.static_cache_control = "public, max-age=#1.year.to_i"

仍有待解决的问题: 我错过了什么?我应该使用什么位置为独立乘客注入额外的nginx 配置?

【问题讨论】:

看来nginx 包含在passenger-standalone 中是不可配置的……但我仍然需要提供这些标头以进行正确的cloudfront cdn 缓存。 不确定乘客,但这个答案可能会帮助***.com/questions/18908426/… @kross 你有没有找到解决这个问题的方法?我正在从 passgenger gem 创建原始配置(并存储在 /tmp 中),但我不知道我是否只需要推送整个配置,或者是否可以放入覆盖 sn -p/包括。 @jacobsd - 我从未找到解决方案。我使用redbot.org 设置了云端实例并测试了资产。我将在原始帖子中更新我的配置。 这是我知道您必须编辑的文件(通过 .ebextensions):/usr/share/ruby/1.9/gems/1.9.1/gems/passenger-4.0.20/resources/templates /standalone/config.erb 我不知道如何强制乘客重新创建“/tmp/passenger-standalone.*/config 【参考方案1】:

您可以通过修改“$(passenger-config --root)/resources/templates/standalone”中的 config.erb 来更改为带有乘客独立的 nginx 生成的配置。请参阅第 4.3 节http://www.modrails.com/documentation/Users%20guide%20Standalone.html。

修改它的选项是:

    完全替换为 .ebextensions/.config 文件:调用 尝试使用命令和一些 perl 正则表达式就地更改它

其中任何一个都应该在应用服务器第一次通过 hooks/preinit 启动之前执行。尝试将其应用于正在运行的实例可能不起作用。您可以终止现有的 EC2 实例,然后自动缩放将生成另一个实例。

【讨论】:

您能否进一步解释您的最终陈述?我可以使用 .ebextensions 和 file: 指令来编辑配置。我找不到让乘客从模板重写其配置的方法。 (我的意思是自动......我可以 ssh 并手动完成,但这很难看。) 如果您在 EC2 中终止实例,它应该重新启动它们,并且重新启动的实例应该具有正确构建的配置(就像新环境或任何新实例一样)。

以上是关于如何通过 ebextensions 配置文件添加 nginx 缓存控制标头?的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 .ebextensions 文件更改 AWS 中的 tomcat 配置

Beanstalk 部署忽略了我在 .ebextensions 中的 nginx 配置文件

从 .ebextensions 配置文件访问 Elastic Beanstalk 环境属性

如何使用配置文件 (.ebextensions) 在 AWS Elastic Beanstalk 上安装 PHP IMAP 扩展?

您可以通过 .ebextensions 文件配置 Elastic Beanstalk 负载平衡 SSL 证书吗?

如何在 .ebextensions 配置中使用条件(AWS Elastic Beanstalk)