O problema
Eu tenho um servidor nginx servindo 3 subdomínios - digamos 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 /etc/nginx/sites-available
e vinculados a partir de arquivos /etc/nginx/sites-enabled
.
Nos arquivos de configuração, cada server
cláusula tem sua server_name
diretiva apropriada. Se for importante, todos os três subdomínios usam os mesmos problemas de certificado SSL da Let's Encrypt (que funciona bem).
Quando b.example.com.conf
for removido de sites-enabled
, espero uma mensagem de erro ao tentar navegar até ele. Surpreendentemente, o nginx redireciona o tráfego para arquivos a.example.com
. Na verdade, toda conexão de entrada sem um nome de servidor correspondente /etc/nginx/sites-enabled
- incluindo apenas o IP da máquina - é roteada para a.example.com
.
Como configurar o nginx para tornar a server
diretiva exclusiva, de modo 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
Criei um servidor padrão que captura todas as solicitações padrão e retorna o erro 404. No entanto, gostaria de ter uma solução mais holística para evitar solicitações de qualquer servidor fornecido 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;
}
Da documentação do nginx :
Portanto, sua solução temporária parece ser a solução certa.