Eu tenho um servidor NGINX que atua como proxy reverso para vários servidores IIS de back-end. Gostaria de passar cada solicitação HTTPS recebida para um determinado servidor backend (upstream), dependendo do URI especificado, ENQUANTO mantenho o mesmo URL na barra de endereço (para manter o nome do servidor backend ou endereço invisível para os usuários)
Por exemplo,
a solicitação da barra de endereço se parece com:
https://test.blahblah.com/url_a
na verdade vai para ->
https://upstreamserver_a/url_a
mas na barra de endereço ainda se parece com:
https://test.blahblah.com/url_a
Aqui está meu nginx.conf até agora:
## 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;
}
}
Claro, assim que conseguir fazer um servidor funcionar, adicionarei vários servidores upstream, por exemplo, upstreamserver_b, upstreamserver_c, etc.
Não preciso de ajuda com a parte SSL, apenas o mapeamento e/ou referência de variável.
Eu provei que o SSL funciona substituindo esta linha:
proxy_pass http://$upstream_host$uri;
por
proxy_pass http://upstreamserver_a;
qual funciona. Também conhecido como, ele redireciona para upstreamserver_a, enquanto mantém o URL disfarçado sob o URL 'test.blahblah.com'.
Qualquer ajuda seria muito apreciada!
Encontrei muitos exemplos com respostas muito próximas do que preciso, mas fui estúpido demais para moldá-los à minha necessidade específica!
Responder1
você precisa descrever seu padrão de URI em expressão regular e usá-lo em seu local para capturar as partes dele que você pode usar no destino rewrite ou proxy_pass. por exemplo:
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 que ajude
Responder2
Dependendo do que exatamente você deseja, existem algumas diretrizes que vêm à mente:
Por exemplo, se você basicamente deseja ter tudo como proxy nginx para seus vários servidores upstream que não estão totalmente cientes de seus nomes de Internet e têm um mapeamento entre nomes internos e externos, algo como isto deve ser feito:
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;
}
}
PS Observe que é importante usar$request_uri
neste contexto (e não apenas$uri
, porque caso contrário você estará deixando $args
para trás) ou, alternativamente, se você rewrite
também estiver usando diretivas, então $uri$is_args$args
também é uma boa opção (observe que as duas não são equivalentes).