Varnish wird als Reverse Proxy direkt vor den Webserver geschaltet, auf dem sich die Website-Inhalte befinden. Kommt es nun zu einem Seitenaufruf, wird dieser zunächst noch vom ursprünglichen Server verarbeitet, der Varnish Proxy speichert jedoch die Anfrage und erforderliche Inhalte. Bei einem erneuten Aufruf dieser Art können die Daten dann direkt aus dem Varnish Cache geladen werden. Die Software legt dabei sämtliche Daten im Arbeitsspeicher ab und lässt das Betriebssystem entscheiden, was auf die Festplatte des Servers ausgelagert werden soll. So wird vermieden, dass das System gleichzeitig Daten im Cache und auf der Festplatte speichert.
Varnish fungiert zudem als Load Balancer. Nach dem Round-Robin-Verfahren werden die eingehenden Anfragen der Clients jeweils als separate Arbeits-Threads (Arbeitsschritte) gewertet, die nacheinander vom Varnish Cache abgehandelt werden. Ein festgelegtes Limit bestimmt, wie viele gleichzeitig aktive Threads bearbeitet werden können. Ist dieses erreicht, gelangen alle weiteren Anfragen in eine Warteschlange. Erst wenn auch das Limit der Warteschlange erreicht ist, werden eingehende Verbindungen blockiert.
Die Konfiguration des Varnish-Reverse-Proxys wird hauptsächlich über die Varnish Configuration Language (VCL) gesteuert. Diese ermöglicht es, Hooks (Schnittstellen) zu schreiben, mit deren Hilfe sich fremder Code in die Anwendung integrieren lässt. Lädt ein solches VCL-Skript, wird es in die Programmiersprache C übersetzt und in eine Programmbibliothek kompiliert; die VCL-Anweisungen werden mit dem Varnish Cache verknüpft. Wenn das verwendete CMS, die eingesetzte Shop-Software oder die zugrundeliegende Webapplikation die Auszeichnungssprache ESI (Edge Side Includes) beherrschen, kann Varnish außerdem als Ganzes zwischengespeicherte Seiten ausliefern. Die Auszeichnungssprache erzeugt in den HTML-Dateien der Seiten sogenannte ESI-Tags, die dynamische Inhalte auszeichnen. Bei einer Client-Anfrage erkennt der Varnish Cache diese Tags und lädt die entsprechenden Inhalte nach.