Newrelic导致在每个请求上生成更新的etags

dha*_*mit 2 etag rack middleware ruby-on-rails newrelic

由于newrelic注入的javascript会在每个请求上发生变化,因此页面内容会发生变化,从而迫使每次都生成新的etag.

我知道Rack :: Etag中间件需要在新的中间件之前,但我找不到新的中间件.根据newrelic_rpm的文档,它说对于rails,gem将包含中间件,但是在运行rake中间件时,我没有看到任何新的中间件.

我可以自己添加中间件,但有更好的方法吗?

小智 9

我在New Relic工作.

New Relic的中间件在运行时没有出现的原因rake middleware是它们有条件地插入到中间件堆栈中.仅当代理配置为在当前环境中运行时,才会插入这些中间件.您可以在运行时强制插入New Relic的中间件rake middleware,以便NEW_RELIC_AGENT_ENABLED=true在启动rake任务时通过在命令行上进行设置来检查中间件堆栈.

添加以下代码config/application.rb应确保Rack :: ETag中间件有机会在浏览器监视中间件注入其动态内容之前计算并注入ETag:

 config.after_initialize do
      config.middleware.delete "Rack::ETag"
      config.middleware.insert_after "NewRelic::Rack::BrowserMonitoring", "Rack::ETag"
    end
Run Code Online (Sandbox Code Playgroud)

NewRelic::Rack::BrowserMonitoring中间件注入响应的JavaScript代码是动态的原因是它包含响应在服务器端生成多长时间的时间,以及(如果适用)在到达Rails堆栈之前排队多长时间.这些时间将随每个传入请求而变化.如果在插入动态信息之前基于散列页面内容生成ETag,则在从高速缓存服务响应时可能会使用过时的服务器端定时.您可以在此处阅读有关New Relic如何处理此问题的详细信息:https://newrelic.com/docs/features/how-does-real-user-monitoring-work#cached-pages

这也是正确订购中间件的一个很好的概述:http://verboselogging.com/2010/01/20/proper-rack-middleware-ordering

如果您需要更深入的帮助,请发送电子邮件至support@newrelic.com与我们联系