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/