2017-09-15 3 views
0

Ich versuche, NGINX Resolver den DNS-Auflösung-Cache automatisch zu aktualisieren, so bin ich Übergang zu einer Variable als proxy_pass Wert, um das zu erreichen. Wenn ich jedoch eine Variable verwende, werden alle Anfragen an den Root-Endpunkt der Anfrage gesendet und alle zusätzlichen Pfade der URL abgeschnitten. Hier ist meine config:NGINX - Verwenden von Variable in Proxy-Pass bricht Routing

resolver 10.0.0.2 valid=10s; 

server { 
    listen 80; 
    server_name localhost; 

    location /api/test-service/ { 
     proxy_redirect  off; 

     proxy_set_header X-Real-IP  $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

     # If these 2 lines are uncommented, 'http://example.com/api/test-service/test' goes to 'http://example.com/api/test-service/' 
     set $pass_url http://test-microservice.example.com:80/; 
     proxy_pass $pass_url; 

     # If this line is uncommented, things work as expected. 'http://example.com/api/test-service/test' goes to 'http://example.com/api/test-service/test' 
     # proxy_pass http://test-microservice.example.com:80/; 

    } 

Dieser keinen Sinn für mich macht, weil die URL fest codierten und der Wert der Variablen identisch sind. Gibt es etwas, das mir fehlt?

EDIT: Ah, also habe ich das Problem gefunden. Aber ich bin mir nicht ganz sicher, wie ich damit umgehen soll. Da dies ein Reverse-Proxy ist, brauche ich die proxy_pass, um die /api/test-service/ aus dem URI zu entfernen, bevor es an den Proxy übergeben wird. Also ..

Dieses:

http://example.com/api/test-service/test 

Should Proxy dazu:

http://test-microservice.example.com:80/test 

Aber statt Proxies dies:

http://test-microservice.example.com:80/api/test-service/test 

Wenn ich nicht über eine Variable, Es fällt kein Problem. Aber die Variable fügt es hinzu. Ist das nur inhärent, was die Verwendung der Variable tun wird?

Antwort

0

Es gibt einen kleinen Punkt, den Sie in der Dokumentation verpasst

When variables are used in proxy_pass: 
location /name/ { 
    proxy_pass http://127.0.0.1$request_uri; 
} 
In this case, if URI is specified in the directive, it is passed to the server as is, replacing the original request URI. 

So Sie config

geändert werden muss
set $pass_url http://test-microservice.example.com:80$request_uri; 
proxy_pass $pass_url;