Drupal 7 med Varnish

Det finns ganska mycket skrivet om hur man kör Drupal 7 tillsammans med Varnish, men jag saknade en del information i de guider jag hittade.

Första intrycket är att det fungerar väldigt smidigt. Man behöver inte längre installera Pressflow för att bli av med Drupals sessions-kaka för anonyma användare. Det räcker med att lägga till följande i settings.php:

$conf['reverse_proxy'] = TRUE;
$conf['reverse_proxy_addresses'] = array('127.0.0.1');

Lägger man sedan till följande direktiv kan man styra livslängden på sidorna i Varnish under Drupals prestandsinställningar (/admin/config/development/performance):

$conf['page_cache_invoke_hooks'] = FALSE;

Problemet man nu får är att förändringar på sidor inte slår igenom för besökarna förrän innehållet i Varnish blivit för gammalt och hämtas på nytt från Drupal.

För Drupal 6 finns en modul som heter varnish som tar hand om detta.

http://drupal.org/project/varnish

Tyvärr finns inte den för Drupal 7 ännu, men Bryan Shelton har lagt upp en patchad version på github som fungerar:

https://github.com/bshelton229/varnish

Det ser ut som att man ännu så länge är tvungen att tömma hela cachen samtidigt om man kör Drupal 7, men i kombination med grace-funktionen i Varnish bör det normalt sett inte vara några problem.

Trots att jag läst på flera ställen att Varnish ska lägga till headern X-Forwarded-For i requesten till backend gjorde inte min Varnish 2.1.0 på Ubuntu 10.04.2 det. Headern är viktig för att Drupal ska få rätt klient-ip, så att man t.ex. inte får [detta fel](/om-cloudnet/blogg/problem-med-låst-drupalkonto).

Se till att ha med följande rader i Varnish-konfigurationen, överst i sub vcl_recv:

remove req.http.X-Forwarded-For;
set req.http.X-Forwarded-For = client.ip;

Det kan även vara trevligt att ändra loggningen i apache så att man får med klientens IP. Här har jag även passat på att lägga till användarens kakor vilket kan vara användbart vid felsökning av cachningen:

LogFormat "%v:%p %h "%{X-Forwarded-For}i" %l %u %t "%r" %>s %O "%{User-Agent}i" "%{Cookie}i"" vhost_combined

I övrigt är det bara att följa någon av guiderna, t.ex. denna:

http://yoodey.com/install-varnish-drupal-7-ubuntu-maverick-amazon-ec2