Ich habe einen NGINX-Server, der als Reverse-Proxy für eine Reihe von Backend-IIS-Servern fungiert. Ich möchte jede eingehende HTTPS-Anforderung an einen bestimmten Backend-Server (Upstream-Server) weiterleiten, abhängig von der angegebenen URI, WÄHREND die gleiche URL in der Adressleiste erhalten bleibt (um den Backend-Servernamen oder die Adresse für Benutzer unsichtbar zu halten).
Beispielsweise
sieht die Adressleistenanforderung so aus:
https://test.blahblah.com/url_a
geht eigentlich an -->,
https://upstreamserver_a/url_a
sieht in der Adressleiste aber dennoch so aus:
https://test.blahblah.com/url_a
Hier ist meine bisherige nginx.conf:
## 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;
}
}
Sobald ich einen Server zum Laufen bekomme, werde ich natürlich mehrere Upstream-Server hinzufügen, z. B. Upstreamserver_b, Upstreamserver_c usw.
Ich brauche keine Hilfe beim SSL-Teil, nur bei der Zuordnung und/oder Variablenreferenz.
Ich habe bewiesen, dass SSL funktioniert, indem ich diese Zeile ersetzt habe:
proxy_pass http://$upstream_host$uri;
durch
proxy_pass http://upstreamserver_a;
was funktioniert. Das heißt, es leitet zu Upstreamserver_a weiter, während die URL unter der URL „test.blahblah.com“ verborgen bleibt.
Für jede Hilfe wäre ich sehr dankbar!
Ich habe viele Beispiele mit Antworten gefunden, die meinen Anforderungen sehr nahe kommen, aber ich war zu dumm, sie an meine speziellen Anforderungen anzupassen!
Antwort1
Sie müssen Ihr URI-Muster in regulären Ausdrücken beschreiben und es an Ihrem Standort verwenden, um die Teile davon zu erfassen, die Sie im Rewrite- oder Proxy_Pass-Ziel verwenden können. Beispiel:
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.
}
ich hoffe es hilft
Antwort2
Je nachdem, was genau Sie möchten, fallen mir einige Anweisungen ein:
Wenn Sie beispielsweise grundsätzlich nur möchten, dass Nginx alles per Proxy an Ihre verschiedenen Upstream-Server weiterleitet, die ihre Internetnamen nicht genau kennen, und eine Zuordnung zwischen internen und externen Namen haben, sollte etwas wie das Folgende ausreichen:
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 Beachten Sie, dass es wichtig ist, zu verwenden$request_uri
in diesem Zusammenhang (und nicht nur$uri
, weil Sie sonst etwas zurücklassen ), oder alternativ, wenn Sie auch Anweisungen $args
verwenden , ist then auch eine gute Option (beachten Sie, dass die beiden nicht gleichwertig sind).rewrite
$uri$is_args$args