使用nginx error_page 对404 文件做冗余 源由:多个图片服务器图片有差异,可能会出现访问某一台服务器出现404,现在需要不管怎样访问都能访问到。 思路:打算使用下面三个方法,由于时间太短方法1应该可行但是没时间,方法2简单的测试下没有通过,方法3成了唯一选择查了多方资料才搞定,发现网上很多资料不全,按照配置应该不能出现意料的结果,现在总结如下。 后续:后续看效果,不知道有没有bug,造成死循环等故障。 1,lua脚本 2,proxy_next_upstream 3,error_page 主体: 一、参考资料 proxy_intercept_errors http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_proxy_module.html 当后端服务器的响应状态码大于等于400时,决定是否直接将响应发送给客户端,亦或将响应转发给nginx由error_page指令来处理。 upstream http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_upstream_module.html max_fails=number 设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。 失败的尝试次数默认是1。设为0就会停止统计尝试次数,认为服务器是一直可用的。 你可以通过指令proxy_next_upstream、 fastcgi_next_upstream和 memcached_next_upstream来配置什么是失败的尝试。 默认配置时,http_404状态不被认为是失败的尝试。 fail_timeout=time 设定 统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。 服务器被认为不可用的时间段。 默认情况下,该超时时间是10秒。 error_page http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#error_page 如果内部跳转时无需改变URI,可以将错误处理转到一个命名路径: location / { error_page 404 = @fallback; } location @fallback { proxy_pass http://backend; } 如果处理uri产生了错误,那么nginx将最后一次出错的HTTP响应状态码返回给客户端,也就是说备用服务器还是不行的话会直接展示这台服务器的响应码。 二、相关配置: server { listen 80; server_name test.com; index index.html index.htm; location / { proxy_pass http://online; error_page 404 = @fallback; proxy_intercept_errors on; } location @fallback { proxy_pass http://backend; } } upstream online { server 192.168.88.18:80; server 192.168.88.28:80; } upstream backend { server 192.168.88.38:80; } 三、测试: test1.html在第一台服务器上,test2.html在第二台服务器上,test3.html哪里都没有 192.168.88.188 - - [09/Nov/2016:17:07:13 +0800] "GET /test1.html HTTP/1.1" 200 24 "-" "curl/7.15.5 (x86_64-RedHat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5" - 192.168.88.188 - - [09/Nov/2016:17:07:15 +0800] "GET /test2.html HTTP/1.1" 200 22 "-" "curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5" - 192.168.88.188 - - [09/Nov/2016:17:27:47 +0800] "GET /test3.html HTTP/1.1" 404 583 "-" "curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5" - (责任编辑:IT) |