问题描述
我制作了一个简单的应用,该应用在响应标题中设置了Cache-Control: public,immutable,max-age=3600
。此应用故意过慢(睡眠2)来重现该问题。
我的目标是了解我是否可以使用Heroku从我的慢速(与缓存服务器相比)起源的Heroku应用程序对API响应进行短期HTTP缓存。
从我所见,Heroku在我的Heroku应用程序之前没有任何HTTP缓存。
实际行为:
每个请求都点击来源/ Heroku应用:
$ curl https://cachecontroltest123.herokuapp.com/ --head
HTTP/1.1 200 OK
Connection: keep-alive
Cache-Control: public,max-age=3600
Content-Type: text/html;charset=utf-8
Content-Length: 12
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
x-frame-options: SAMEORIGIN
Server: WEBrick/1.4.2 (Ruby/2.6.6/2020-03-31)
Date: Sat,24 Oct 2020 09:28:51 GMT
Via: 1.1 vegur
预期的行为:
在发出第一个请求后,Heroku必须缓存响应,并在接下来的一个小时内投放响应,而不会遇到(缓慢的)起源。
我可以在Stackoverflow上找到一些相关的问题,每个问题都说Heroku在每个应用程序的前面都有一簇Varnish HTTP缓存服务器,但是答案很旧。 从那以后有什么改变吗?
解决方法
Heroku不执行任何HTTP缓存。
此任务可以在您的应用程序中完成(在dyno中,通过您的框架或Varnish / Nginx之类的东西), 或更重的负载,您可以将CDN放在Heroku应用程序的前面(Fastly,CloudFront,Cloudflare)。
还有Edge Heroku add-on可以简化AWS Cloudfront配置。