2016-04-27 4 views
3

Ich arbeite an einer neuen Version einer API, die eine vollständige Neufassung der aktuellen API ist. Um zu beginnen, wird die neue API keine Anfragen bearbeiten, aber im Laufe der Zeit werden mehr und mehr Routen in der neuen API implementiert (die meisten von ihnen verwenden denselben Pfad, den sie in der alten API verwenden). Ich habe nginx auf dem gleichen Server wie der neue api-Dienst eingerichtet (Knoten läuft auf Port 3000) und der alte api-Dienst läuft auf api.example.com (192.168.1.25). Was ich tun möchte, ist api.example.com auf dem neuen api-Dienst anzugeben, dann, wenn eine Anfrage eingeht, habe nginx zuerst die Anfrage auf dem neuen api-Dienst (127.0.0.1:3000) und wenn diese Anfrage eine 404 zurückgibt , dann sende die Anfrage an den alten api-Dienst (192.168.1.25).Einrichten von Nginx zu Proxy fehlgeschlagene Anforderungen auf einem Server zu einem anderen

Antwort

1

Wenn legen Sie Ihren Endpunkt unter Verwendung eines ‚upstream‘, dann können Sie den proxy_pass konfigurieren wechseln the next upstream anprobieren 404.

upstream api { 
    # new 
    server localhost:3000; 
    # old 
    server 129.168.1.25:3000 backup; 
} 


location/{ 
    proxy_pass http://api; 
    proxy_next_upstream http_404 non_idempotent; 
} 

Eine Sache jedoch, dass ich nicht sicher bin, ob Sie ist kann eigentlich Wechseln Sie zu einem "Backup" -Server als Teil von proxy_next_upstream, da der Server technisch einwandfrei ist.

+0

Möglicherweise anstelle von "Backup" könnten Sie Gewicht = 0; –

2

Ich endete damit, dies mit Header und Cookie-Unterstützung mit der folgenden Konfiguration zu arbeiten.

http { 
    upstream new_api_backend { 
    server 127.0.0.1:3000; 
    } 

    upstream old_api_backend { 
    server old.example.com:443; 
    } 

    server { 
    listen   80; 
    return   301 https://$http_host$request_uri; 
    } 

    server { 
    proxy_http_version 1.1; 

    listen    443; 
    ssl     on; 
    ssl_certificate  /etc/nginx/ssl/my_cert.crt; 
    ssl_certificate_key /etc/nginx/ssl/my_cert.key; 

    location/{ 
     proxy_intercept_errors on; 
     error_page 417 = @old_backend; 
     proxy_pass http://new_api_backend; 
    } 

    location @old_backend { 
     proxy_set_header Host old.example.com; 
     proxy_redirect https://old.example.com/ https://$http_host/; 
     proxy_cookie_domain old.example.com $http_host; 
     proxy_pass https://old_api_backend; 
    } 
    } 
} 

Beachten Sie die error_page 417 = @old_backend. Dies macht nginx eine 417 Antwort vom neuen Server als Auslöser, um den alten Server zu verwenden. Dann habe ich gerade eine Catchall-Route zum neuen Server hinzugefügt, um 417 zurückzugeben, so dass 404 s immer noch verwendet werden kann, wenn es auf dem neuen Server angemessen ist. 417 Expectation Failed möglicherweise nicht der am besten geeignete Code für diesen Anwendungsfall, aber es sah nah genug aus.

Auch dies wird http://example.com/some/path zu https://old.example.com/some/path korrekt Proxy.

Verwandte Themen