Thariq Shihipar
Thariq Shihipar

Reputation: 1082

Heroku & Rails - Varnish HTTP Cache Not Working

My heroku website's root page is essentially static, it has some ruby code in the view when its generated, but there's nothing specific to a single user, so I'd like to have it cached by Varnish and served up without hitting my dyno (note that there are other pages that are dynamic in the application).

Heroku makes it seem very simple here. Just add response.headers['Cache-Control'] = 'public, max-age=300' and it'll cache for 5 minutes before regenerating.

To test this I made the changed and outputted the date (Time.now) to the page, to see if it would remain the same for 5 minutes, but every time I access the page on a new browser it updates. Refreshing on the same browser works fine, but I think that's because of the browser caching, not Heroku.

If it's any help, when I do a curl -i to get the HTTP headers, I get this:

HTTP/1.1 200 OK^M
Server: nginx/0.7.67^M
Date: Thu, 29 Dec 2011 02:03:33 GMT^M
Content-Type: text/html; charset=utf-8^M
Connection: keep-alive^M
Cache-Control: public, max-age=300^M
X-Ua-Compatible: IE=Edge^M
Etag: "8a1b58f048968803980417a2914764d0"^M
X-Runtime: 0.038393^M
Content-Length: 8310^M
X-Varnish: 1040651825^M
Age: 0^M
Via: 1.1 varnish^M

Basically, I'd like to make sure that it's generated once and then cached in Varnish, am I missing any options, do I have to configure something more? If you have other suggestions for serving a fast static page I'd love those as well.

Thanks!

Upvotes: 2

Views: 1673

Answers (3)

Thariq Shihipar
Thariq Shihipar

Reputation: 1082

The problem turned out to be that Heroku has a number of Varnish servers, so it takes about 10-15 page refreshes until the page was cached on all of the servers, after that it would stay cached. It was working all along, I just gave up after a few refreshes didn't work.

I also increased the max_age so that I could see it more clearly, a 5 minute cache has almost no effect.

Upvotes: 0

Neil Middleton
Neil Middleton

Reputation: 22238

I beleive that there is something in your application causing this issue (possibly the headers aren't being set correctly?).

To test this I put up an application that contains one cached, and one un-cached page (nothing other than rendering the text to the output.

http://morning-earth-1972.heroku.com/base/cache

http://morning-earth-1972.heroku.com/base/no_cache

Notice that the cache version will not change within five minutes of the time printed.

The source can be found here: https://github.com/neilmiddleton/heroku_varnish_test_SO_8663326

Therefore, Heroku is working as you would expect. I would initially look at your auth system to check that that isn't doing something, as this is quite a common scenario (to ensure that cached pages are fully secured)

Upvotes: 3

Jérôme R
Jérôme R

Reputation: 1257

Maybe you are sending cookies when testing with your browser ? What are your request headers ?

What do you get if your run curl -I http://host.com/ twice ?

Upvotes: 1

Related Questions