Se você está rodando um site ou uma API, é bem provável que precise lidar com domínios, subdomínios e aquele incômodo problema de CORS. Vamos desmembrar isso passo a passo e deixar tudo configurado de forma tranquila.
Configurando Domínios e Subdomínios no Nginx
O Nginx torna super fácil configurar múltiplos domínios e subdomínios. Você só precisa configurar blocos de servidor (também conhecidos como hosts virtuais) para informar ao Nginx qual domínio deve apontar para onde.
Neste caso, estamos usando o Nginx como um proxy reverso. Isso significa que o Nginx receberá as requisições de entrada e as encaminhará para os servidores backend apropriados com base no subdomínio. Essa configuração é útil para balanceamento de carga, segurança e centralização do manuseio de requisições.
Para garantir que todo o tráfego seja roteado de forma segura através do HTTPS, configure um redirecionamento da porta 80 para a 443:
server {
listen 80;
server_name example.com *.example.com;
return 301 https://$host$request_uri;
}
Se você quiser lidar tanto com o domínio principal (example.com
) quanto com múltiplos subdomínios (api.example.com
, blog.example.com
, etc.) de forma dinâmica, você pode extrair o subdomínio e encaminhar as requisições de acordo:
server {
listen 443 ssl;
server_name *.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
set $subdomain "default";
if ($host ~* ^(.+?)\.example\.com$) {
set $subdomain $1;
}
location / {
proxy_pass http://backend.$subdomain.example.com;
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 $scheme;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Authorization $http_authorization;
}
}
Essa configuração extrai dinamicamente o subdomínio da requisição e encaminha a requisição para um servidor backend correspondente (backend.<subdomínio>.example.com
). Além disso, garante que todos os cabeçalhos necessários sejam encaminhados corretamente.
Agora, basta habilitar a configuração e reiniciar o Nginx:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Pronto! Seu domínio e todos os subdomínios agora devem estar funcionando com HTTPS e proxy dinâmico.
Lidando com CORS (Cross-Origin Resource Sharing) no Nginx
CORS é aquela coisa que bloqueia seu frontend de chamar uma API hospedada em outro domínio. Se seu frontend está em app.example.com
e sua API está em api.example.com
, você precisará permitir requisições entre origens.
Para permitir que sua API aceite requisições de outro domínio, você precisa adicionar os cabeçalhos corretos no Nginx.
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/api.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/api.example.com.key;
location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';
if ($request_method = OPTIONS) {
return 204;
}
}
}
Isso permite que qualquer um acesse sua API, o que é aceitável para APIs públicas, mas arriscado para privadas.
Quer limitar o acesso a app.example.com
? Faça isso em vez disso:
add_header 'Access-Control-Allow-Origin' 'https://app.example.com';
Os navegadores às vezes enviam uma OPTIONS
antes de fazer uma chamada real à API. Se você não lidar com isso, as coisas vão quebrar. Aqui está como permitir requisições preflight:
location / {
if ($request_method = OPTIONS) {
add_header 'Access-Control-Allow-Origin' 'https://app.example.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';
return 204;
}
}
Finalizando
Acertar domínios, subdomínios e CORS no Nginx não é tão complicado uma vez que você sabe o que ajustar. Com a configuração certa, você pode evitar dores de cabeça e manter seus aplicativos funcionando sem problemas. Boa codificação!