Nginx - pode “se” ser usado com segurança no nível de um bloco de servidor?

2

Os documentos do Nginx avisam em termos inequívocos que se é mal e deve ser evitado sempre que possível, e existem avisos semelhantes espalhados por todo o comprimento e largura da internet.

No entanto, a maioria desses avisos se concentra especificamente no quanto o if se comporta em location blocos. Além disso, os documentos do Nginx dizem que:

The only 100% safe things which may be done inside if in a location context are:

  • return ...;

  • rewrite ... last;

Minha pergunta é: É seguro usar um if no nível do bloco server (em vez de um bloco location ) se a única diretiva contida nele for return ? Por exemplo, o seguinte redirecionamento de www para não-www:

server {
    listen 80;
    server_name example.com www.example.com;

    if ($http_host != example.com) {
        return 301 http://example.com$request_uri;
    }

    # more config
}

Pergunta secundária: Estou ciente de que o método recomendado para fazer esse tipo de coisa é com dois blocos server que possuem valores diferentes para server_name . Se este é um uso aceitável para if , existe alguma razão para ainda usar dois blocos server separados?

    
por Joseph Montanaro 05.04.2017 / 04:59

2 respostas

2

Um dos primeiros passos quando o nginx recebe uma solicitação é avaliar o campo HTTP Host header / TLS SNI e selecionar o host virtual com base no resultado dessa avaliação.

Isso significa que o cabeçalho Host é sempre processado.

Agora, se você especificar uma instrução if para o redirecionamento, isso significa que o cabeçalho Host será verificado duas vezes, primeiro para selecionar o host virtual e, em seguida, para verificar a condição if . Isso é o dobro do trabalho do processador.

Um contra-argumento pode ser o consumo de memória para um bloco de servidores separado. No entanto, a alocação de memória é a mesma para o tempo de vida do processo nginx, enquanto a avaliação dupla do cabeçalho Host acontece em todas as solicitações.

    
por 05.04.2017 / 14:43
0

Você pode fazê-lo, mas não é altamente recomendável. Já existe uma explicação oficial sobre isso .

Para executar vários sites, eu recomendaria fazer vários arquivos de configuração para cada site e incluir o local no nginx.conf principal.

    
por 05.04.2017 / 06:00