Eu tenho vários servidores em execução na mesma máquina, alguns apenas com http, outros com http e https. Existem vários blocos de servidor definidos em arquivos separados, incluídos no arquivo de configuração principal.
Eu configurei um servidor "padrão" para http que servirá uma "página de manutenção" genérica para solicitações que não correspondem a nenhum dos outros nomes de servidor nos outros arquivos de configuração. O servidor padrão http funciona como esperado, ele usa o nome_do_servidor "_" e aparece primeiro na lista de inclusões (porque observei que, no caso de nomes de servidor duplicados nos servidores, é usado o que aparece primeiro). Isso funciona muito bem.
Eu esperaria o mesmo bloco de servidor exato (apenas alternando "listen 80 default_server" para "listen 443 default_server" e também em vez de exibir a página "return 444"), mas isso não acontece. Em vez disso, parece que o novo servidor https padrão está realmente capturando todas as conexões https recebidas e causando falhas, embora os outros blocos do servidor tenham nomes de servidor mais apropriados para as solicitações recebidas. A remoção do novo servidor https padrão fará com que o comportamento semi-correto seja retomado: todos os sites com https serão carregados corretamente; mas os sites sem https serão todos roteados para o primeiro servidor https nos arquivos de inclusão (que, de acordo com os documentos, se nenhum "servidor_servidor padrão" aparecer, o primeiro bloco de servidor a aparecer será "padrão").
Então, minha pergunta é: qual é a maneira correta de definir um "servidor padrão" no nginx para conexões SSL? Por que quando eu defino explicitamente um "default_server", ele fica ganancioso e agarra todas as conexões, enquanto quando eu deixo implicitamente o nginx decidir o "servidor padrão" funciona como eu esperaria (com o servidor incorreto definido como padrão e os outros servidores reais comportando-se corretamente)?
Aqui estão meus "servidores padrão". O HTTP funciona sem quebrar outros servidores. O Https quebra outros servidores e consome tudo.
server {
listen 443 ssl default_server;
server_name _;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
return 444;
}
server {
listen *:80 default_server;
server_name _;
charset utf-8;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
root /home/path/to/templates;
location / {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
}
Algum de vocês vê o que pode estar errado aqui?
Consegui configurar uma hospedagem dedicada compartilhada em um único IP com o nginx. HTTP e HTTPS padrão que atendem a 404 para domínios desconhecidos recebidos.
1 - Crie uma zona padrão
Como o nginx está carregando vhosts em ordem ascii, você deve criar um
00-default
arquivo / link simbólico no seu/etc/nginx/sites-enabled
.2 - Preencha a zona padrão
Preencha o seu
00-default
com vhosts padrão. Aqui está a zona que estou usando:3 - Crie certificado autoassinado, teste e recarregue
Você precisará criar um certificado autoassinado
/etc/nginx/ssl/nginx.crt
.Crie um certificado autoassinado padrão:
Apenas um lembrete:
nginx -t
sudo service nginx reload
Espero que ajude.
fonte
default_server
para escutar 443 e adicionei o endereço IPv6 [::]: 80 e [::]: 443 comdefault_server
.Basicamente, queremos evitar a todo custo que a primeira definição de servidor em nosso arquivo de configuração seja servida como um servidor catch-all-server para conexões SSL. Todos sabemos que faz isso (em oposição ao http e usando a configuração default_server que funciona muito bem).
Isso não pode ser alcançado declarativamente para SSL (ainda), portanto, precisamos codificá-lo com um IF ...
A variável
$host
é o nome do host da linha de solicitação ou do cabeçalho http. A variável$server_name
é o nome do bloco do servidor em que estamos agora.Portanto, se esses dois não forem iguais, você serviu esse bloco do servidor SSL para outro host, para que ele devesse ser bloqueado.
O código não contém referências específicas aos endereços IP do servidor, para que possa ser reutilizado facilmente para outras configurações do servidor sem modificação.
Exemplo:
fonte
listen [::]:443 ssl http2;
faz? Estou tendo problemas para encontrar documentação para isso.Para elaborar mais sobre a resposta de Radmilla Mustafa:
O Nginx usa o cabeçalho 'Host' para a correspondência server_name. Ele não usa TLS SNI. Isso significa que, para um servidor SSL, o nginx deve poder aceitar a conexão SSL, que se resume a ter certificado / chave. O certificado / chave pode ser qualquer um, por exemplo, autoassinado.
Ver documentação
Portanto, a solução é:
fonte
Para quem perdeu tanto cabelo por isso quanto eu (passei quase o dia inteiro nisso hoje). Eu tentei quase tudo, e o que o fez finalmente funcionar corretamente foi esta frase estúpida:
Com base na resposta do Ifnot , meu exemplo de trabalho é:
Não tenho idéia do por que isso era necessário, o único princípio que deduzi disso foi que o nginx se comporta de maneira estranha quando não damos a ele o que ele quer.
fonte
Se você quiser ter certeza absoluta, use endereços IP separados para hosts que não devem responder em HTTPS e hosts que devem. Isso também resolve o problema de aviso do navegador "certificado inválido".
fonte