proxy_intercept_errors
当上游服务器响应头回来后,可以根据响应状态码的值进行拦截错误处理,与error_page 指令相互结合。用在访问上游服务器出现错误的情况下。
服务部署情况
一、主服务(nginx:80) , /usr/local/nginx/sbin/nginx
二、上游服务(nginx:8012), /usr/local/nginx_8012/nginx
上游服务器文件说明(图1-1)
404.html 和 404_default.html 内容:
404.html:上游服务器提供的特定404页面内容,当nginx:80访问上游服务器资源不存在(返回404),要求显示的内容页面。
404_default.html:上游服务器默认404页面。
50x.html:上游服务器提供的特定50x页面内容,当nginx:80访问上游服务器出现50x错误(包含500, 502, 503和504),要求显示的内容页面。
50x_default.html:上游服务器提供的处理50x的默认页面
注意:
404.html 和 50x.html 是给 nginx:80配置中使用的
404_default.html 和 50x_default.html是给 nginx:8012配置中使用的
nginx:80服务中关于404和50x的配置(图1-2)
nginx:8012服务中关于404和50x的配置(图1-3)
几种配置
一、nginx:80服务的特定location配置
1). 开启proxy_intercept_errors
2). 设置特定的 error_page, 分别处理404和50x
配置如下(图1-4)
@404fallback 和 @50xfallback配置见(图1-2)
请求测试:
当通过nginx:80服务请求上游一个不存在的资源时,响应的结果如下:
对结果进行说明:
1、由于上游服务器的配置(见图1-3)。
add_header Cache-Control max-age=5;
add_header Content-Encoding gzip;
所以响应头包含Cache-Control 和gzip头。
2、由于nginx:80配置,当出现404时,具体内容要从上游服务器获取。(见图1-2,@404fallback的配置)
所以响应的内容为:
Upstream server provides a special page for representing 404.
二、上述配置不变,修改@404fallback中的资源名称(由404.html修改为 404_not_exists.html)
这个资源在上游服务器文件列表中(见图1-1)并不存在
在执行请求测试时,结果如下:
对结果进行说明:
1、由于请求的 nginx:8012服务器下的 /404_not_exists.html,该资源并不存在,所以没有匹配nginx:8012中的location / {xxx} 配置(见图1-3)。所以响应头没有再增加 Cache-Control 和 gzip。
2、走到了nginx:8012的404处理流程中,所以响应内容如下,是404_default.html的内容。
Upstream default 404 page.
三、测试error_page的不同位置
1). 关闭nginx:80 location中的error_page指令
2). 为nginx:80在server级别设置error_page指令,分别设置404和50x
测试结果与一、相同