Ejecuto varios contenedores docker con nombres de host:
web1.local web2.local web3.local
El enrutamiento a estos se realiza en función del nombre de host de nginx. Tengo un proxy en frente de esta configuración (en diferentes máquinas conectadas a internet) donde defino upstream como:
upstream main {
server web1.local:80;
server web2.local:80;
server web3.local:80;
}
Y descripción real del host virtual:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://main;
}
}
Ahora, debido a que los contenedores reciben el nombre de host "main" en lugar de "web1.local", no responden correctamente a la solicitud.
Pregunta: ¿cómo puedo decirle a nginx que pase el nombre del servidor en sentido ascendente en lugar del nombre del grupo de servidores en sentido ascendente en el encabezado cuando se envía la solicitud por proxy?
nginx
reverse-proxy
pavel_karoukin
fuente
fuente
Respuestas:
En realidad, puedes hacerlo a través de proxy_set_header.
Para obtener más detalles, consulte aquí: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header o vea un caso de uso de ejemplo aquí: https://stackoverflow.com/questions/12847771/configure-nginx- con-proxy-pass
He incluido el enfoque dinámico en su configuración publicada anteriormente:
Aquí hay un ejemplo con un nombre de host estático:
fuente
site1.myisp.com
ysite2.myisp.com
solo responden a su nombre respectivo. Ahora, soy dueño de mi nombre de dominio y me gustaría utilizar el sitio web de mi ISP para equilibrar la carga de mis servidores. ¿No es esa una buena razón? Muchas gracias;)Tuve el mismo problema y finalmente lo resolví usando dos niveles de proxy. Así es como podría hacer para su situación (creo):
Como puede ver, el truco es crear un servidor local que responda a un puerto particular que representará el servidor reescribiendo el Host correcto para cada servidor. Luego, puede usar estos servidores locales en su flujo ascendente y finalmente usarlo en el proxy real.
fuente
Entonces, al leer toda la documentación para nginx (realmente no pude analizar el código para el módulo ascendente = (), se me ocurrió esta solución bastarda. Desafortunadamente, esta solución no realiza un seguimiento de los hosts fallidos, sino que simplemente selecciona uno aleatorio y le dirige la solicitud. Así que tengo que configurar algún tipo de monitoreo para asegurarme de que todos los backends se estén ejecutando.
fuente
Pasamos el direccionador ascendente como un encabezado separado como este
¿Y si lo intentas?
fuente
Si bien el objetivo parece lógico, nginx no va a cambiar el host: encabezado para que coincida con el ascendente . En cambio, trata
upstream
los nombres de dominio como unCNAME
DNS, como una forma de llegar a una dirección IP.Los encabezados de solicitud (y el cuerpo) se arreglan antes de seleccionar el flujo ascendente. El flujo ascendente puede cambiar a mitad de la solicitud si se encuentra que un flujo ascendente particular no responde, pero la solicitud no cambia.
fuente
Hmm Tengo una configuración similar, en la que simplemente he hecho
El uso de
$http_host
(el encabezado de Host HTTP de la solicitud entrante) aquí en lugar de$host
(la configuración del nombre de host del servidor) hace que el mismo encabezado de Host pasado por el cliente se pase hacia arriba, en mi prueba.Consulte también https://stackoverflow.com/questions/14352690/change-host-header-in-nginx-reverse-proxy .
fuente
Como otras personas ya publicaron usando la variable de secuencia de comandos (como $ upstream), puede configurarlo de la manera que desee, y eso solucionará el problema, sin piratería de encabezado adicional.
Las variables de script de amenaza del controlador de Proxy Pass de una manera diferente, si un valor no es condicional (no tiene $ en el nombre) se respalda en la fase ascendente en la fase de configuración y se usa más adelante.
Una forma simple de omitir este problema y tener las mayores ventajas de (versión gratuita) en sentido ascendente sería usar algo como
Split_Clients
:El ejemplo anterior se ve casi igual que aguas arriba. Existen otros módulos que hacen el mapeo, es decir, chash_map_module , pero como están fuera del árbol, deberá construirlos usted mismo, lo que no es posible para algunos casos de uso /
fuente