Opção 1.
Use três server blocos (como mencionado em sua pergunta), mas descarregar o conteúdo duplicado em um arquivo separado, usando uma diretiva include para puxá-lo para cada um dos blocos server relevantes. Consulte este documento para obter detalhes.
Opção 2.
O default_server não precisa de uma instrução server_name . No entanto, você deve trocar o default_server pelo outro bloco server , para que o primeiro bloco server se torne o mais específico.
Por exemplo:
server{
listen 80;
listen [::]:80;
server_name hostname.external_domain;
return 301 https://$host$request_uri;
}
server {
listen 80 default_server;
listen 443 ssl default_server;
listen [::]:80 default_server;
listen [::]:443 ssl default_server;
...
}
O segundo server_block não precisa corresponder usando server_name , pois corresponderá a qualquer coisa que o primeiro bloco server não corresponda explicitamente.