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;
}