Um servidor, duas aplicações
Um servidor com um endereço IP público tem uma porta 443, e duas aplicações querem essa porta. Como esse conflito se resolve é o assunto inteiro deste curso.
Por que você ia querer isso
Os casos comuns são um site de marketing ao lado do produto, um ambiente de staging ao lado da produção e um projeto paralelo que não justifica uma máquina própria.
O VPS desta aplicação roda um serviço hoje, o newbieonrails, mais o acessório de Postgres, e a máquina não está ocupada. Uma segunda aplicação pequena caberia.
As abordagens ingênuas e por que falham
Portas diferentes: example.com:3000 funciona, e ninguém vai aceitar isso. Portas não são um conceito que o usuário enxerga, e os certificados TLS são emitidos por hostname, não por porta.
Endereços IP diferentes: funciona, e custa dinheiro por endereço. Num VPS pequeno, você normalmente tem um.
Um contêiner servindo as duas: agora elas dividem o deploy, a versão do Ruby e as falhas. Elas deixaram de ser duas aplicações.
flowchart TB
I["um IP, uma porta 443"] --> Q{"como duas apps dividem?"}
Q --> A["portas diferentes: usuários não aceitam"]
Q --> B["IPs diferentes: custa dinheiro, geralmente indisponível"]
Q --> C["um contêiner: não são mais duas aplicações"]
Q --> D["um proxy roteando por hostname"]
D --> Y["esta é a resposta"]
A resposta
Um processo é dono da porta 443 e roteia pelo hostname.
O navegador envia o hostname em dois lugares: no handshake TLS, como Server Name Indication, antes de qualquer dado cifrado, e depois no cabeçalho Host.
O Server Name Indication é o importante, porque é ele que deixa o proxy escolher o certificado certo antes que seja possível decifrar qualquer coisa. Sem ele, um endereço só conseguiria servir um certificado, e era assim que funcionava antes de o SNI existir.
O que isso pede do Kamal
O kamal-proxy já faz isso. Rotear por hostname é como o proxy funciona, e um deploy de uma aplicação só é o caso em que a tabela de roteamento tem uma entrada.
A configuração deste repositório lista newbieonrails.com,www.newbieonrails.com, dois hostnames que já apontam para um contêiner. Adicionar uma segunda aplicação usa o mesmo mecanismo com outro destino, e essa continuidade é o motivo de este curso ser curto.
Pontos-chave
- Um servidor tem uma porta 443, e duas aplicações a querem.
- Portas separadas e endereços IP extras não são respostas viáveis.
- Um processo é dono da 443 e roteia por hostname para contêineres diferentes.
- O Server Name Indication leva o hostname antes da decifragem, e assim o certificado certo é escolhido.
- O
kamal-proxyjá roteia por hostname, e uma aplicação só é o caso de uma entrada.
Continue com a aula 2
Como o roteamento funciona
Como o kamal-proxy roda separado das aplicações, atualiza entradas de roteamento a cada deploy e valida certificados na porta 80.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.