Configuración del proxy inverso de Nginx

Configuración del proxy inverso de Nginx

Actualmente tengo unos cientos de aplicaciones web repartidas en alrededor de 20 servidores, y un proxy inverso se encuentra frente a estas que ejecutan Pound y Haproxy. Pound está realizando la redirección de http a https y el cifrado SSL y luego reenviando a Haproxy, que tiene una regla configurada para que cada sitio reenvíe a uno de los servidores backend que ejecutan Tomcat. Todos los sitios están en el mismo dominio, por ejemplo, www.dominio.com/webapp1, www.dominio.com/webapp2

Pound y Haproxy fueron configurados originalmente por nuestro proveedor de alojamiento y, al sentirme frustrado con Pound, ahora estoy considerando reemplazar esta configuración con Nginx. Estoy en un punto en el que tengo Nginx ejecutándose en un entorno de desarrollo haciendo la redirección https y SSL, y tengo un par de reglas configuradas para proxy a un backend.

Realmente solo busco algunos consejos sobre si esta es la mejor manera de hacerlo, o si sería mejor dejar a Haproxy manejando todas las reglas y simplemente configurar Nginx como un reemplazo de Pound.

Mi preocupación es configurar Nginx con los cientos de reglas directas como las que se muestran a continuación y terminar con problemas de rendimiento. Cualquier sugerencia será bienvenida, gracias.

location /webapp1/ {
     proxy_pass http://10.1.9.11:8080;
}

location /webapp2/ {
     proxy_pass http://10.1.9.11:8080;
}

location /webapp3/ {
     proxy_pass http://10.1.9.12:8080;
}

Respuesta1

No sé mucho al respecto, haproxypero sé lo suficiente para nginxresponder a sus inquietudes sobre problemas de rendimiento.

Tenga en cuenta que nginxla configuración se compila en un structformato amigable y se guarda en la memoria; el archivo no se lee en cada solicitud. Por lo tanto, cientos de location /...configuraciones se ejecutarán casi tan rápido como llamar strlen()+ strncmp()la misma cantidad de veces. Lo cual es insignificante en comparación con la configuración del socket.

La URL esnormalizado antes de que comience el emparejamientopor lo tanto , no hay nada realmente inteligente en las coincidencias a menos que utilice uno de los operadores ( ,,,, =) .~*~^~

Podrías usar una coincidencia de expresiones regulares ( ~, *~) y luego algo de iflógica para decidir entre los upstreamservidores, peroesa sería la solución lenta.

Por otro lado, si tiene al menos una ubicación de expresión regular, deberá considerar utilizar el ^~operador. Ver elrespuesta antigua pero aún relevante de Martin Redmond en SOsobre diferentes operadores y cómo nginxcombinarlos.

información relacionada