Maneira correta de usar o reuseport no host virtual nginx

Maneira correta de usar o reuseport no host virtual nginx

Eu uso o nginx como proxy reverso com um servidor de aplicativos gunicorn (aplicativo Django).

No meu arquivo host virtual nginx, existem dois serverblocos. O primeiro redireciona wwwo tráfego para o último (que trata non-wwwdo httpstráfego).

Especificamente, o antigo bloco de localização é:

server {

    server_name www.example.com;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    return 301 https://example.com$request_uri;
}

O último bloco de localização é:

server {

    server_name example.com;
    listen 443 ssl http2 reuseport;
    listen [::]:443 ssl http2 reuseport;

    # other directives here
}

Observe o uso de reuseportno último bloco.

Se eu colocar reuseportos dois blocos, recebo um erro: nginx: [emerg] duplicate listen options for 0.0.0.0:443 in /etc/nginx/sites-enabled/vhost:62.

Se eu inseri-lo apenas no bloco anterior, funciona. Estou indeciso sobre onde colocá-lo corretamente, o primeiro bloco ou o último. Alguém pode esclarecer?


Entendo que o reuseportparâmetro instrui o nginx a criar um soquete de escuta individual para cada processo de trabalho, permitindo que o kernel distribua conexões de entrada entre processos de trabalho (para lidar com vários pacotes enviados entre cliente e servidor).

Mas isso não me ajuda a entender por que não posso usar reuseportem ambos os blocos mencionados, ou em qual deles devo usá-lo (já que só posso usá-lo em um).

Responder1

No NGINX, você especifica as opções de escuta do soquete de rede apenas uma vez na configuração e elas "se aplicam" a todos os outros serverprogramas configurados que escutam no mesmo soquete (porta). Citandodocumentos:

A diretiva listen pode ter vários parâmetros adicionais específicos para chamadas de sistema relacionadas a soquetes. Esses parâmetros podem ser especificados em qualquer diretiva de escuta, mas apenas uma vez para um determinado par endereço:porta.

Portanto, o que você precisa decifrar na mensagem de erro é que você deve especificar apenas uma vez para cada endereço + porta reuseportexclusivo .listen

A forma como servervocê faz isso depende da sua preferência. Mas como regra e para maior clareza, sugiro designar um dos servers com default_serverdiretiva, que:

se presente, fará com que o servidor se torne o servidor padrão para o par endereço:porta especificado. Se nenhuma das diretivas tiver o parâmetro default_server então o primeiro servidor com o par endereço:porta será o servidor padrão para este par.

Em seguida, coloque suas opções de escuta nesse bloco de servidor (onde você especificou o default_server).

Por exemplo

server {

    server_name www.example.com;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    return 301 https://example.com$request_uri;
}

server {

    server_name example.com;
    listen 443 ssl http2 default_server reuseport;
    listen [::]:443 ssl http2 default_server reuseport;

    # other directives here
}

informação relacionada