Eu uso o nginx como proxy reverso com um servidor de aplicativos gunicorn (aplicativo Django).
No meu arquivo host virtual nginx, existem dois server
blocos. O primeiro redireciona www
o tráfego para o último (que trata non-www
do https
trá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 reuseport
no último bloco.
Se eu colocar reuseport
os 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 reuseport
parâ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 reuseport
em 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 server
programas 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 reuseport
exclusivo .listen
A forma como server
você faz isso depende da sua preferência. Mas como regra e para maior clareza, sugiro designar um dos server
s com default_server
diretiva, 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
}