O problema
Eu tenho um servidor nginx que atende três subdomínios - por exemplo, a.example.com , b.example.com e c.example.com .
Os arquivos de configuração são a.example.com.conf , b.example.com.conf e c.example.com.conf , respectivamente. Eles são armazenados em /etc/nginx/sites-available e com link de /etc/nginx/sites-enabled .
Nos arquivos de configuração, cada cláusula server tem sua diretiva server_name apropriada. Se for importante, todos os três subdomínios usam os mesmos problemas de certificado SSL por meio do Let's Encrypt (o que funciona bem).
Quando b.example.com.conf é removido de sites-enabled , espero uma mensagem de erro ao tentar navegar até ele. Surpreendentemente, o nginx redireciona o tráfego para a.example.com . Na verdade, todas as conexões de entrada sem um nome de servidor correspondente em /etc/nginx/sites-enabled - incluindo apenas o IP da máquina - são roteadas para a.example.com .
Como configurar o nginx para tornar a diretiva server exclusiva, para que as solicitações para b.example.com nunca sejam atendidas por a.example.com ?
Configuração
a.example.com.conf
server {
listen 443 ssl;
server_name a.example.com;
ssl_certificate /etc/letsencrypt/live/a.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem;
location / {
proxy_pass http://localhost:8080;
}
}
b.example.com.conf
server {
listen 443 ssl;
server_name b.example.com;
# I'm using a multi-domain certificate called 'a.example.com', which is
# serving a.example.com, b.example.com and c.example.com - not an error
ssl_certificate /etc/letsencrypt/live/a.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem;
location / {
proxy_pass http://localhost:8090;
}
}
Solução temporária
Eu criei um servidor padrão que captura todas as solicitações padrão e retorna o erro 404. No entanto, eu gostaria de ter uma solução mais holística impedindo que solicitações de qualquer servidor servidas por outro servidor.
server {
listen 443 default_server;
server_name _;
return 404;
ssl_certificate /etc/letsencrypt/live/a.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem;
}