Andreas Bergman

Icon

Konfigurera Nginx och Varnish

I mitt lilla projekt om att sätta upp ett eget CDN, Content Delivery Network så har jag nu konfigurerat om Nginx samt installerat Varnish. Det funkar så att Varnish ligger som gateway på port 80 och går igenom alla inkommande requests, om någon request matchar konfigurationen i Varnish så hanterar den det enligt gällande regler. För att uppnå det måste Nginx konfigureras om för att lyssna på en annan port, jag valde för enkelhetens skull port 8080.

 Om du inte redan har installerat Nginx, så finns en guide här

Konfiguration av Nginx, ändra nedan i alla dina vhostar:

Listen 8080

Det gör att Nginx kommer att lyssna på port 8080 istället för 80, det är viktigt att ställa om det på alla vhostar, annars kommer nginx eller varnish inte starta om ordentligt. vill du kan du även skriva 127.0.0.1:8080 så kommer Nginx att bara lyssna på requests som kommer internt på maskinen och inte externt, jag väljer att inte skriva det då jag vill kunna komma åt webbservern direkt externt också, i testsyften.

Installation av Varnish

Varnish finns i Debian stabels paketförråd och installeras med:

apt-get install varnish

Sedan så är det mer eller mindre klart, varnish startas med /etc/init.d/varnish och loggdemonen med /etc/varnishlog start, med största sannolikhet är de redan startade. 

Nu börjar det roliga, men samtidigt besvärliga, vad är det jag vill cacha? Jag har ett enkelt exempel där jag bara cachar statiska filer på en viss domän:

backend default {
        set backend.host = “127.0.0.1″;
        set backend.port = “8080″;
}

sub vcl_recv {
           if (req.http.host ~ “http://cdn.sngw.se“) {
             pass;
           } else {
             if (req.request != “GET” && req.request != “HEAD”) {
                 pipe;
             }
             if (req.request == “POST”) {
                 pass;
             }
             if (req.request == “GET” && req.url ~ “\.(jpg|jpeg|gif|ico|png)$”) {
                 lookup;
             }
             if (req.request == “GET” && req.url ~ “\.(css|js)$”) {

 lookup;
             }

             if (req.request == “GET”) {
                 lookup;
             }
             lookup;
          }
        }
         sub vcl_pipe {
             pipe;
         }

         sub vcl_pass {
             pass;
         }

         sub vcl_hit {
             if (!obj.cacheable) {
                 pass;
             }
             if (req.http.Cookie) {
                pass;
             }
             deliver;
         }

         sub vcl_miss {

fetch;
         }

         sub vcl_fetch {
             if (!obj.valid) {
                 error;
             }
             if (!obj.cacheable) {
                 pass;
             }
             insert;
         }

         sub vcl_deliver {
             deliver;
         }

         sub vcl_timeout {
             discard;
         }

         sub vcl_discard {

     discard;

         }

 

De här reglerna  cache:ar bara statiska filer och gör ingenting konstigt med dem. Nu är du redo att fortsätta upptäcka mer fantastiska grejer med Varnish ocg nginx, lycka till!

Den här bloggen

skriver jag, Andreas Bergman, vilket i sig inte bör vara så förvånande. Jag driver en SMS tjänst och jobbar som tekniker/allt i allo på SEA där jag bland annat driftar en stor bloggportal och ett webbhotell. Vi håller även på att bygga ett datacenter.


Jag har några microsoft titlar, ett gäng DELL certifikat och jobbar dagligen med hårt belastade webbservrar. Utöver det jobbar jag också med virtualisering och server/storage. Någon gång ibland säljer jag även server och storagelösningar.

Maila mig gärna om något av ovan, eller annat, jag är ganska trevlig sägs det. andreas@abergman.se.