Forma correcta de utilizar reuseport en el host virtual nginx

Forma correcta de utilizar reuseport en el host virtual nginx

Utilizo nginx como proxy inverso con un servidor de aplicaciones gunicorn (aplicación Django).

En mi archivo de host virtual nginx, hay dos serverbloques. El primero redirige wwwel tráfico al segundo (que maneja non-wwwel httpstráfico).

En concreto, el antiguo bloque de ubicación es:

server {

    server_name www.example.com;

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

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

El último bloque de ubicación es:

server {

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

    # other directives here
}

Observe el uso de reuseporten el último bloque.

Si coloco reuseportambos bloques, aparece un error: nginx: [emerg] duplicate listen options for 0.0.0.0:443 in /etc/nginx/sites-enabled/vhost:62.

Si lo inserto únicamente en el bloque anterior, funciona. No sé dónde colocarlo correctamente, si el primer bloque o el último. ¿Alguien puede aclarar?


Entiendo que el reuseportparámetro indica a nginx que cree un socket de escucha individual para cada proceso de trabajo, lo que permite que el kernel distribuya las conexiones entrantes entre los procesos de trabajo (para manejar múltiples paquetes que se envían entre el cliente y el servidor).

Pero eso no me ayuda a entender por qué no puedo usarlo reuseporten los dos bloques antes mencionados, o en cuál debo usarlo (dado que solo puedo usarlo en uno).

Respuesta1

En NGINX, usted especifica las opciones de escucha del socket de red solo una vez en la configuración y se "aplican" a todos los demás servermensajes configurados que escuchan en el mismo socket (puerto). Citandodocumentos:

La directiva listening puede tener varios parámetros adicionales específicos de llamadas al sistema relacionadas con sockets. Estos parámetros se pueden especificar en cualquier directiva de escucha, pero solo una vez para un par dirección:puerto determinado.

Entonces, lo que debe descifrar del mensaje de error es que solo debe especificar una vez para cada dirección y puerto reuseportúnicos .listen

La forma en que serverhaga esto depende de su preferencia. Pero como regla general y para mayor claridad, sugiero designar uno de los servers con default_serverdirectiva, que:

si está presente, hará que el servidor se convierta en el servidor predeterminado para el par dirección:puerto especificado. Si ninguna de las directivas tiene el parámetro default_server, entonces el primer servidor con el par dirección:puerto será el servidor predeterminado para este par.

Luego coloque sus opciones de escucha en ese bloque de servidor (donde ha especificado default_server).

P.ej

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
}

información relacionada