使用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" -