Por que não os dois? Coloque o NginX na frente para manipular a compactação gzip e SSL e Varnish para lidar com o armazenamento em cache e o balanceamento de carga. O aplicativo back-end precisará de algum compartilhamento de sessão no banco de dados ou no Memcache, conforme sugerido por Kristaps e o Varnish não armazenará em cache nenhum conteúdo dinâmico que seja servido com cookies ou autenticação, mas todo o resto será ok.
A configuração recomendada é que você crie um nome de host estático separado (como static.example.com
e veicule todo o conteúdo estático de lá, sem cookies (o Varnish armazenará em cache muito bem, já que não há cookies), e outro para o conteúdo dinâmico que pode ser balanceado pelo NginX ou Varnish, usando um cookie para manipulação de sessão, e todos os back-ends que compartilham as informações da sessão, conforme indicado acima.