Tengo un servidor NGINX que actúa como proxy inverso para varios servidores IIS backend. Me gustaría pasar cada solicitud HTTPS entrante a un determinado servidor backend (ascendente), dependiendo del URI especificado, MIENTRAS mantengo la misma URL en la barra de direcciones (para mantener el nombre del servidor backend o la dirección invisible para los usuarios)
Por ejemplo,
la solicitud de la barra de direcciones se ve así:
https://test.blahblah.com/url_a
en realidad va a -->
https://upstreamserver_a/url_a
pero en la barra de direcciones todavía se ve así:
https://test.blahblah.com/url_a
Aquí está mi nginx.conf hasta ahora:
## Upstreamserver_A backend for test.blahblah.com
upstream upstreamserver_a {
server 10.10.1.12:80; #upstreamserver_a.blahblah.com
}
map_hash_bucket_size 128;
map_hash_max_size 2048;
# URI to Server Map
map $1 $upstream_host {
default whatever;
url_a upstreamserver_a;
}
## OUR HTTP SERVER AT PORT 80
server {
listen 80;
server_name test.blahblah.com;
index index.html;
root /usr/share/nginx/html;
## redirect http to https ##
proxy_redirect http:// https://;
}
server {
listen 443 ssl;
server_name test.blahblah.com;
#root /usr/share/nginx/html;
### ssl config - customize as per your setup ###
ssl_certificate ssl/blahblah.com/blahblah.pem;
ssl_certificate_key ssl/blahblah.com/blahblah.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
## PROXY backend
location ~ ^/(.*)$ {
rewrite ^/([^/]+)$ https://test.blahblah.com/webapps /Application.html?firm=$1#login break;
proxy_pass http://$upstream_host$uri;
}
}
Por supuesto, una vez que pueda hacer funcionar un servidor, agregaré varios servidores ascendentes, por ejemplo, upstreamserver_b, upstreamserver_c, etc.
No necesito ayuda con la parte SSL, solo el mapeo y/o la referencia de variable.
He demostrado que SSL funciona sustituyendo esta línea:
proxy_pass http://$upstream_host$uri;
con
proxy_pass http://upstreamserver_a;
la que funciona. También conocido como, redirige a upstreamserver_a, mientras mantiene la URL disfrazada bajo la URL 'test.blahblah.com'.
¡Cualquier ayuda será muy apreciada!
He encontrado muchos ejemplos con respuestas que se acercan mucho a lo que necesito, ¡pero he sido demasiado estúpido para moldearlos según mi necesidad particular!
Respuesta1
debe describir su patrón de URI en una expresión regular y usarlo en su ubicación para capturar las partes que puede usar en el objetivo de reescritura o proxy_pass. p.ej:
location ~ ^/url_(.).*$ {
#this will capture your /url_a or /url_b URI's
#and will store the "a" or "b" into $1 variable
#which you can use to proxy the request to a specific server
proxy_pass http://$1.$upstreams$uri;
#the above will result in a.<upstreams>/url_a for your example.
#don't forget the resolver configuration for domain names.
}
Espero eso ayude
Respuesta2
Dependiendo de qué es exactamente lo que desea, se le ocurren algunas directivas:
Por ejemplo, si básicamente solo desea que nginx represente todo en sus diversos servidores ascendentes que no conocen completamente sus nombres de Internet y tienen una asignación entre nombres internos y externos, entonces algo como esto debería ser suficiente:
map $host $host_upstream_mapped {
hostnames;
test.example.su test_iis.internal:8070;
example.com bleeding_edge.internal:9999;
default localhost:8080;
}
server {
listen [::]:80;
location / {
proxy_pass http://$host_upstream_mapped$request_uri;
}
}
PD: tenga en cuenta que es importante utilizar$request_uri
en este contexto (y no sólo$uri
, porque de lo contrario te quedarás atrás), o, alternativamente, si también $args
estás usando directivas, también es una buena opción (ten en cuenta que las dos no son equivalentes).rewrite
$uri$is_args$args