HTTPS nginx servindo com a mesma configuração que HTTP

195

Existe uma maneira de compartilhar diretivas de configuração entre dois server {}blocos nginx ? Gostaria de evitar a duplicação das regras, pois o conteúdo HTTPS e HTTP do meu site é exibido exatamente com a mesma configuração.

Atualmente, é assim:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

Posso fazer algo como:

server {
  listen 80, 443;
  ...

  if(port == 443) {
    ssl on; #etc
  }
}
ceejayoz
fonte

Respostas:

262

Você pode combinar isso em um bloco de servidor da seguinte maneira:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Instruções oficiais

Jauder Ho
fonte
6
Ah, eu não fazia ideia que o nginx era inteligente o suficiente para ignorar as diretivas SSL se carregadas na porta 80. Incrível!
ceejayoz
72
nginx é todo tipo de vitória.
Jauder Ho
5
e se você tiver vários sites em um único servidor, vale a pena mencionar que "default" não é obrigatório
Luchaninov
4
Tão elegante dói ...
Alix Axel
3
não está funcionando aqui ... "A solicitação HTTP simples foi enviada para a porta HTTPS"
gcstr 18/08/14
87

Para esclarecer a resposta aceita, você precisa omitir

SSL on;

e você só precisa do seguinte para a versão nginx após 0.8.21

listen 443 ssl;

Referência:

Nginx Docs - Configurando um único servidor HTTP / HTTPS

Sean Tan
fonte
2
Obrigado! Não consegui descobrir por que nada no http estava funcionando. Removendo o SSL ativado; trabalhou.
21814 Chris Cummings
27

Não conheço uma maneira como você sugere, mas certamente existe uma maneira fácil e sustentável.

Mova as configurações comuns do servidor para um arquivo separado, ou seja, "serverFoo.conf" e, em seguida include, em server {}blocos separados da seguinte maneira:

server {
    listen 80;
    include serverFoo.conf;
}
server {
    listen 443 ssl;
    include serverFoo.conf;
}
dwc
fonte
2
+1 = funciona para mim. (Não foi possível fazê-lo funcionar com o outro método.)
Além disso, o outro exemplo não considera 'proxy_pass' se estiver atuando como um balanceador de carga.
Mike Purcell
Esta opção é ótima se a sua server_namefor diferente para cada porta
iDev247 3/13
5
Não use ssl on, use a listen 443 ssl;partir de agora um.
danger89
Essa parece ser a única solução que está funcionando com o nginx 1.10.1 recente. Por alguma razão, duas listenlinhas não são interpretadas corretamente, mas movê-las para separar as server{}corrige.
Artur Bodera
9

Expandindo as respostas já úteis, aqui está um exemplo mais completo:

server {

    # Listen on port 80 and 443
    # on both IPv4 and IPv6
    listen 80;
    listen [::]:80 ipv6only=on;
    listen 443 ssl;
    listen [::]:443 ipv6only=on ssl;

    # Set website folder
    root /path/to/your/website;

    # Enable SSL
    ssl_certificate your-cert.pem;
    ssl_certificate_key your-cert.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;
}
Jonathan
fonte
2
Eu sei que essa é uma resposta bastante antiga, mas como é muito completa, eu gostaria de destacar para outras pessoas que podem usá-lo que você deve desativar o protocolo SSLv3 como vulnerável à vulnerabilidade POODLE: disablessl3.com Em vez disso, use: ssl_protocols TLSv1 TLSv1 .1 TLSv1.2;
user147787
4

Apenas para adicionar à postagem de Igor / Jauder, se você estiver ouvindo um IP específico, poderá usar:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;
Matt Bostock
fonte