Pular para o conteúdo principal

Configuração do Nginx + proxy reverso Let's Encrypt na frente do Yucca

Introdução

Neste guia, vou descrever como configurar o Nginx e emitir um certificado SSL Let's Encrypt, que será renovado automaticamente. O Nginx atuará como um servidor web simples na frente do Yucca para a terminação da sessão SSL e o redirecionamento da porta 80 para a 443.
Por que instalar o Nginx, afinal, se o próprio Yucca pode terminar o SSL e até tem flags para isso? É verdade, mas, ao ocupar a porta 443, ela ficará indisponível para outro software, sendo necessário usar outra porta, além de não haver redirecionamento de HTTP para HTTPS – se isso não for um problema para você, pode pular sem receio a seção de instalação e configuração do Nginx (Etapa 1) e ir direto para a Etapa 2.
Vou realizar todas as ações no Ubuntu Server 22.04, mas tudo funcionará da mesma forma no SUSE, CentOS, Fedora, Debian e assim por diante. A única diferença é que cada um tem seu próprio gerenciador de pacotes, mas espero que você saiba diferenciar o apt do zypper 🙂

Etapa 0. Preparação

Então, vamos precisar de:

  1. Um host com IP público
  2. Um domínio ou subdomínio apontando para esse endereço
  3. Yucca instalado

Neste guia, vou usar o domínio foobar.yuccastream.com, o seu domínio será diferente.

nslookup foobar.yuccastream.com
Server: 127.0.0.53
Address: 127.0.0.53#53

Non-authoritative answer:
Name: foobar.yuccastream.com
Address: 128.140.2.103

nginx1

Então, tenho o Yucca disponível no endereço http://foobar.yuccastream.com:9910

Etapa 1. Instalação e configuração do Nginx

Instalamos o nginx:

sudo apt install nginx

Verificamos http://foobar.yuccastream.com

nginx2

Em seguida, criamos o arquivo de configuração para o Yucca:

sudo nano /etc/nginx/conf.d/yucca.conf
aviso

Você precisa substituir o domínio foobar.yuccastream.com pelo seu

upstream yucca_upstream {
server 127.0.0.1:9910 fail_timeout=0;
}

server {
listen 80;
server_name foobar.yuccastream.com;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://yucca_upstream;
}
}

Salve o arquivo e verifique se a configuração está correta:

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Se tudo estiver correto, você verá syntax is ok Recarregamos a configuração do nginx:

nginx -s reload

Atualizamos a página e já vemos a interface web do Yucca em http://foobar.yuccastream.com

nginx3

Etapa 2. Instalação do Certbot e emissão do certificado letsencrypt

Instalamos os pacotes:

sudo apt install certbot python3-certbot-nginx

Emitimos o certificado para o nosso domínio:

aviso

Você precisa substituir o domínio foobar.yuccastream.com pelo seu

sudo certbot --nginx -d foobar.yuccastream.com

nginx4

O Certbot vai pedir para inserir um E-mail (1); recomendo usar seu e-mail real, pois, caso o certificado esteja prestes a expirar e não seja renovado automaticamente, o Let's Encrypt enviará uma notificação sobre isso. Também será necessário aceitar os termos e condições (2), (3). Em seguida, o certbot encontrará automaticamente o arquivo de configuração correto com o domínio necessário, configurará a seção de SSL e o redirecionamento, e ao final exibirá um link. Você pode conferir o resultado final no arquivo /etc/nginx/conf.d/yucca.conf


upstream yucca_upstream {
server 127.0.0.1:9910 fail_timeout=0;
}

server {
server_name foobar.yuccastream.com;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://yucca_upstream;
}

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/foobar.yuccastream.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/foobar.yuccastream.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
if ($host = foobar.yuccastream.com) {
return 301 https://$host$request_uri;
} # managed by Certbot

listen 80;
server_name foobar.yuccastream.com;
return 404; # managed by Certbot
}

Recomendo verificar se o certbot criou um timer para a renovação do certificado; ele deve estar ativo:

sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Fri 2023-09-22 11:54:02 UTC; 7min ago
Trigger: Fri 2023-09-22 14:13:25 UTC; 2h 11min left
Triggers: ● certbot.service

Sep 22 11:54:02 foobar systemd[1]: Started Run certbot twice daily.

Atualizamos a página http://foobar.yuccastream.com e vemos que tudo já está funcionando via HTTPS, o redirecionamento também funciona.

nginx5

Etapa 3. Configuração de segurança

Configuramos o acesso via HTTPS pelo nginx, mas o Yucca ainda está disponível via HTTP no endereço http://foobar.yuccastream.com:9910. Isso está relacionado a esta configuração padrão:

listen_address = ":9910"

Vamos até o arquivo de configuração do Yucca e ajustamos esse parâmetro:

sudo nano /opt/yucca/yucca.toml

Fazemos com que o Yucca escute apenas em localhost:

listen_address = "127.0.0.1:9910"

E reiniciamos o servidor Yucca:

sudo systemctl restart yucca

Verificamos: agora não há nada no endereço http://foobar.yuccastream.com:9910, e em https://foobar.yuccastream.com tudo funciona.