2016-04-27 510 views
3

我正在研究一個新版本的api,它是對當前api的完全重寫。首先,新的api不會處理任何請求,但隨着時間的推移,越來越多的路由將在新的api中實現(其中大多數使用與舊api中使用的路徑相同的路徑)。我將nginx設置在與新的api服務(在端口3000上運行的節點)相同的服務器上,並且舊的api服務正在api.example.com(192.168.1.25)上運行。我想要做的是將api.example.com指向新的api服務,然後當有請求進入時,讓nginx首先嚐試請求新的api服務(127.0.0.1:3000),如果該請求返回404 ,然後將請求發送到舊的api服務(192.168.1.25)。設置nginx將一個服務器上的失敗請求代理到另一個服務器

回答

1

如果您設置的端點使用「upstream」,那麼你就可以配置proxy_pass切換嘗試the next upstream 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; 
} 

一件事不過,我不能確定是你是否能真正切換到「備份」服務器作爲proxy_next_upstream的一部分,因爲從技術上講服務器是健康的。

+0

可能不是「備份」,你可以做weight = 0; –

2

我最終得到這個使用以下配置的標題和cookie支持。

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; 
    } 
    } 
} 

請注意error_page 417 = @old_backend。這使得nginx可以捕獲來自新服務器的417響應,作爲使用舊服務器的觸發器。然後,我只是向新服務器添加了一個catchall路由來返回417,這樣404仍然可以在新服務器上適當使用。 417 Expectation Failed可能不是這個用例最合適的代碼,但它看起來足夠接近。

此外,這將正確代理http://example.com/some/pathhttps://old.example.com/some/path

相關問題