Utilizo nginx como proxy inverso con un servidor de aplicaciones gunicorn (aplicación Django).
En mi archivo de host virtual nginx, hay dos server
bloques. El primero redirige www
el tráfico al segundo (que maneja non-www
el https
trá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 reuseport
en el último bloque.
Si coloco reuseport
ambos 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 reuseport
pará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 reuseport
en 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 server
mensajes 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 server
haga esto depende de su preferencia. Pero como regla general y para mayor claridad, sugiero designar uno de los server
s con default_server
directiva, 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
}