多人 努力 -s cell ble 變量 pro edi 生效

nginx不得不說的參數之 proxy_intercept_errors與fastcgi_intercept_errors

為什麽我的error_page 配置沒有生效,沒有正常跳轉?我也遇到過這個問題,所以這才促使我對proxy_intercept_errors與fastcgi_intercept_errors這兩個參數做了詳細的了解。

由於我們商戶和點評信息相關web應用是給用戶做消費決策的商戶和相關點評等信息,瀏覽功能一般比互動功能要重要一些,但是由於一些內部出錯可能會導致整個應用出現異常,導致用戶無法瀏覽到商戶的相關信息。

為了提升商戶頁面的可用性,我們通過靜態抓取現有頁面保存在靜態文件服務器上,在應用服務器nginx上配置相關規則,當應用出現異常的時候就會將用戶的請求轉發到降級用途的靜態文件服務器上。

在整個規則配置過程中,發現了一些問題,就是在nginx上配置了相關error_page的跳轉頁面,發現後端應用異常的時候,預期中的nginx跳轉規則並沒有生效。

1
2
3
4
5
error_page 500 501 502 503 504 @shopstatic;
location @shopstatic {
access_log logs/shop-web.access.log maintry;
proxy_pass http://shopstaticservers;
}

我們業務應用使用的是nginx+java容器的結構形式,nginx做反向代理和日誌記錄,當用戶請求到達服務器時,先判斷nginx配置的根目錄下是否存在對應的靜態文件,不存在的時候轉發到後端的java容器server。我們在nginx中配置了error_page 異常跳轉的規則,預期當後端java容器出現異常錯誤的時候,對應的請求會被nginx轉發到我們靜態降級的服務,但是實際上,當後端java容器出現異常或者過載的時候,nginx是直接吐出java容器後端的異常信息。

由於第一次配置這樣奇特的nginx規則,搞不清楚是什麽原因,在google上搜了半晌,由於搞不清楚狀況,也描述不清楚,所以一直沒有什麽收獲,後來終於用關鍵詞error_page proxy搜索搞定了,一個老外回答了類似的問題,給了proxy_intercept_errors on;這個配置,自己試了下還真的ok了。

發現學會如何提問,才是自己要努力的方向。

nginx proxy 啟用自定義錯誤頁面:

語法:proxy_intercept_errors on | off;

默認值:

proxy_intercept_errors off;

上下文:http, server, location

當被代理的後端服務器的響應狀態碼大於等於300時,決定是否直接將響應發送給客戶端,亦或將響應轉發給nginx由error_page指令來處理。

原文:

syntax:proxy_intercept_errors on | off;

default:

proxy_intercept_errors off;

context:http, server, location

Determines whether proxied responses with codes greater than or equal to 300 should be passed to a client or be redirected to nginx for processing with the error_page directive.

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors

proxy_intercept_errors 為on 表示 nginx按照原response code 輸出,後端是404,就是404.這個變量開啟後,我們才能自定義錯誤頁面。

語法:fastcgi_intercept_errors on | off;

默認值:

fastcgi_intercept_errors off;

上下文:http, server, location

當FastCGI後端服務器響應狀態碼大於等於300時,決定是否直接將響應發送給後端客戶端,或者將響應轉發給nginx由 error_page指令來處理。

原文:

syntax:fastcgi_intercept_errors on | off;

default:

fastcgi_intercept_errors off;

context:http, server, location

Determines whether FastCGI server responses with codes greater than or equal to 300 should be passed to a client or be redirected to nginx for processing with the error_page directive.

http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_intercept_errors

fastcgi_intercept_errors on表示接收fastcgi輸出的http 1.0 response code,後端php可以輸出header指示nginx輸出什麽錯誤頁面。開啟這個之後,我們才能在php裏面自定義錯誤代碼和頁面。

必須明確的在error_page中指定處理方法使這個參數有效,如果沒有適當的處理方法,nginx不會攔截一個錯誤,這個錯誤不會顯示自己的默認頁面,這裏允許通過某些方法攔截錯誤。

本來以為這個參數應該大部分人都知道,但是發現很多人都不知道,所以專門再寫出來。

為什麽nginx error_page遇到後端錯誤時不跳轉?