Um servidor, duas aplicações

Prévia grátis 3 min de leitura

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-proxy já roteia por hostname, e uma aplicação só é o caso de uma entrada.
Aula 1 de 7 · grátis

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.

Digite para buscar...