2017-01-10 760 views
0

我很難配置nginx作爲公共S3端點的代理。我的用例需要更改S3響應的狀態代碼,同時保留響應負載。如何在nginx中更改代理服務器響應的狀態碼?

通過S3可能返回的狀態碼包括200和403對我的使用情況下,我需要將這些狀態代碼映射到503

我試圖不工作的情況如下:

location ~* ^/.* { 
    [...] 
    proxy_intercept_errors on; 
    error_page    200 =503 $upstream_http_location 
} 

Nginx的輸出下列錯誤:

nginx: [emerg] value "200" must be between 300 and 599 in /etc/nginx/nginx.conf:xx

下面是一個更完整的片段:

server { 
    listen  80; 

    location ~* ^/.* { 
    proxy_http_version   1.1; 
    proxy_method    GET; 
    proxy_pass     http://my-s3-bucket-endpoint; 
    proxy_pass_request_body off; 

    proxy_set_header  Content-Length ""; 
    proxy_set_header  Connection ""; 
    proxy_set_header  Host my-s3-bucket-endpoint; 
    proxy_set_header  Authorization ''; 

    proxy_hide_header  x-amz-id-2; 
    proxy_hide_header  x-amz-request-id; 
    proxy_hide_header  Set-Cookie; 
    proxy_ignore_headers "Set-Cookie"; 

    proxy_cache   S3_CACHE; 
    proxy_cache_valid  200 403 503 1h; 
    proxy_cache_bypass  $http_cache_purge; 
    add_header    X-Cached $upstream_cache_status; 

    proxy_intercept_errors on; 
    error_page    200 =503 $upstream_http_location; 
    } 
} 

是否有可能通過nginx實現我所需要的?

回答

0

我發現了一個或多或少合適的解決方案。這有點hackish,但它的作品。

關鍵是將我的S3存儲桶的索引文檔設置爲不存在的文件名。這導致對S3存儲桶端點的請求導致403.

由於nginx代理將所有傳入請求映射到S3存儲桶端點上/上,所以結果始終爲403,即nginx代理可以截取的結果。從那裏,error_page指令通知它通過請求S3存儲桶端點中的特定文檔(本例中爲error.json)並使用503作爲響應狀態代碼進行響應。

location ~* ^/. { 
    proxy_intercept_errors on; 
    error_page    403 =503 /error.json; 
} 

該解決方案涉及兩個請求被髮送到S3桶端點(/,/error.json),但至少緩存似乎使用在上面的更完整的片段配置兩個請求被激活。

+0

只需將後端服務器關閉以進行維護,並且您將無任何技巧地得到您的錯誤。 – AnrDaemon

+0

但是,用戶將看到負載均衡器的默認通用503消息。我需要返回一個自定義錯誤消息,最終可以由團隊中的非技術人員配置。 – Wenzil

0

閱讀系統告訴你什麼。你不能改變「成功」的返回碼。這沒有意義。

+0

我知道我不能按原樣使用它,但我正在尋找一種替代方法來實現它。有關我的用例的更多信息:我希望在維護期間響應狀態代碼爲503,但其消息是動態的(從S3讀取並緩存)。所以我們的目標是讓這臺服務器在維護期間一舉突破,而生產服務器從負載平衡組中取出。 – Wenzil