Varnish caching com HTTPS usando Nginx e Let’s Encrypt

O Varnish é ótimo para servir páginas para usuários anônimos em alta velocidade, mas não fala HTTPS, se você quiser usar o Varnish e fornecer seu site por HTTPS, então você precisa usar algo para fazer HTTPS funcionar fazendo o proxy do tráfego para o Varnish.
Nesta postagem do blog, vou detalhar uma maneira de fazer isso usando Nginx para fazer o encerramento HTTPS e proxy das solicitações para Varnish.

Visão Geral

Na configuração a seguir, o Varnish escuta as solicitações HTTP na porta 80. Apache escuta a porta 8080, ou seja, as solicitações de proxy Varnish da porta 80 para o Apache na porta 8080. Para lidar com HTTPS, o Nginx escuta na porta 443 e solicitações de proxies para varnish na porta 80. O Let’s Encrypt fornece um certificado SSL gratuito para uso pelo Nginx.
Simples não? uma tarefa bem complicara aparentemente, mas estou aqui para descomplicar.

Os comandos a seguir funcionam no Ubuntu 18.04. A configuração geralmente funciona para diferentes versões do Ubuntu ou Debian, embora as versões de alguns pacotes de software variem; PHP e Varnish em particular mudaram das versões anteriores de suporte de longo prazo do Ubuntu.

Instalação do Apache

Começamos instalando o Apache e o PHP e configurando o Apache para escutar na porta 8080.

sudo aptt install -y apache2 apache2-utils php7.2 php7.2-cli php7.2-common php7.2-curl php7.2-json php7.2-gd php7.2-mysql php7.2-opcache php7.2-xml libapache2-mod-php7.2
sudo a2enmod expires headers rewrite php7.2

Crie um arquivo de host virtual Apache em /etc/apache2/sites-available/
Usaremos o exemplo.conf
/etc/apache2/sites-available/exemplo.conf

<VirtualHost *:8080>

    ServerName exemplo.com
    ServerAdmin [email protected]
    DocumentRoot /var/www/html

    ErrorLog /var/log/apache2/exemplo-error.log
    CustomLog /var/log/apache2/exemplo-access.log combined

    <Directory /var/www/html>
        Allow from all
        Options +Includes -Indexes +FollowSymLinks
        AllowOverride all
    </Directory>

</VirtualHost>

Edite o /etc/apache2/ports.conf para que contenha porta 8080

Listen 8080

Em seguida, reconfigure o Apache

sudo a2ensite exemplo.conf
sudo systemctl restart apache2

Suponto que seu site esteja instalado em /var/www/html, então, ele estará disponível em http://example.com:8080/

Instalação do Varnish

Agora instalamos o Varnish e o configuramos para lidar com solicitações HTTP na porta 80.

sudo apt install -y varnish

Se o pacote de software varnish não for encontrado, você precisará habilitar o repositório Ubuntu universe.

sudo add-apt-repository universe

Edite o arquivo /lib/systemd/system/varnish.service
Os argumentos do varnish podem ser alterados de acordo com seus requisitos. (Tenha atenção)

[Unit]
Description=Varnish HTTP accelerator
Documentation=https://www.varnish-cache.org/docs/5.2/ man:varnishd

[Service]
Type=simple
LimitNOFILE=131072
LimitMEMLOCK=82000
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T :6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m -p vcc_allow_inline_c=on
ExecReload=/usr/share/varnish/reload-vcl
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
PrivateDevices=true

[Install]
WantedBy=multi-user.target

Edite o arquivo /etc/varnish/default.vcl para seus requisitos específicos. O principal é adicionar um back-end que aponte para a porta 8080, como:

# Default backend definition. Points to Apache on port 8080.
backend default {
  .host = "127.0.0.1";
  .port = "8080";
  .first_byte_timeout     = 300s;
  .connect_timeout        = 5s;
  .between_bytes_timeout  = 2s;
}

Em seguida, reconfigure o Varnish

sudo systemctl daemon-reload
sudo systemctl restart varnish.service

O site agora será armazenado em cache pelo Varnish e estará disponível em http://exemplo.com/.

Instlação do Let’s Encrypt

Para o HTTPS funcionar corretamente, precisamos de um certificado SSL. Para isso, podemos usar o certbot para obter um certificado do Let’s Encrypt usando o plugin webroot.
PS: Não esqueça de alterar a posta web do seu site, neste exemplo estou usando /var/www/html

sudo apt-get install -y certbot
sudo certbot -m [email protected] --agree-tos -n certonly --webroot -w /var/www/html -d exemplo.com

Este é um exemplo muito simples, mas você pode usar o plug-in webroot com quantos domínios forem necessários e com mais sites, especificando as opções -w e -d extras. Uma coisa a se notar é que o DNS deve estar em vigor para que isso funcione, cada domínio será verificado, portanto, se um domínio não resolver para o endereço IP do servidor, o comando falhará. Mais informações sobre o plug-in webroot podem ser encontradas aqui: https://certbot.eff.org/docs/using.html#webroot

Instalação do Nginx

Agora que temos um certificado SSL, podemos instalar e configurar o Nginx para lidar com solicitações HTTPS na porta 443.

sudo apt-get install -y nginx
sudo rm /etc/nginx/sites-enabled/default

Crie um arquivo de configuração Nginx para solicitações HTTPS proxy para Varnish em /etc/nginx/sites-available/https-proxy com a seguinte configuração

# Proxy all HTTPS requests to Varnish
server {
    listen 443 ssl default_server;

    ssl  on;
    ssl_certificate     /etc/letsencrypt/live/exemplo.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/exemplo.com/privkey.pem;

   client_max_body_size 64M;

    location / {
        proxy_pass       http://127.0.0.1:80/;
        proxy_redirect   off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 443;
    }
}

Reconfigure o nginx

sudo ln -s /etc/nginx/sites-available/https-proxy /etc/nginx/sites-enabled/
sudo systemctl restart nginx.service

O site agora estará disponível em https://exemplo.com/

Deixe uma resposta