使用nginx error_page 对404 文件做冗余

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

代码覆盖率工具 istanbul

代码覆盖率工具 istanbul 1. 代码覆盖率 在测试时,我们的用例把所有代码都覆盖了吗? 对于这个问题引出了代码覆盖率的测试指标,一共有以下4种: 行覆盖...

3175
来自专栏菩提树下的杨过

eclipse/intellij Idea集成jetty

jetty相对weblogic、jboss、tomcat而言,启动速度快,十分方便开发调试,以下是eclipse里的使用步骤: 一、eclipse->Marke...

4128
来自专栏向治洪

关于Android的UI测试

Android 测试主要分为3个类型: 单元测试(Unit Test) 区分UI代码和功能代码在Android开发中尤其困难。因为有时Activity既有Con...

2225
来自专栏wblearn

我的Github之Pull request的使用

GitHub已经成为的一切开放源码软件的基石。开发人员喜欢它,基于它进行协作,并不断通过它开发令人惊叹的项目。除了​​代码托管,GitHub的主要吸引力是使用它...

1252
来自专栏GreenLeaves

Oracle 数据库实例和数据库

本文参考自oracle数据库实例,数据库的理解,纯属读书笔记,用于加深记忆。 先看Tom关于这二者的解释: 1、数据库 物理操作系统文件或磁盘的集合(我觉得可以...

24410
来自专栏FreeBuf

如何利用Ptrace拦截和模拟Linux系统调用

ptrace(2)这个系统调用一般都跟调试离不开关系,它不仅是类Unix系统中本地调试器监控实现的主要机制,而且它还是strace系统调用常用的实现方法。ptr...

2077
来自专栏惨绿少年

练习题三

第1章 练习题 1.1 第1题 取得/etc/hosts 文件的权限 如何取得/etc/hosts 文件的权限对应的数字内容,如-rw-r--r--  为 64...

2310
来自专栏salesforce零基础学习

salesforce 零基础学习(四十)Custom Settings简单使用

有时候,项目中我们需要设置类似白名单的功能,即某些用户或者某种Profile的用户不走一些校验或者走一些校验,这时,使用Custom Settings功能可以很...

2289
来自专栏blackheart的专栏

[认证授权] 5.OIDC(OpenId Connect)身份认证授权(扩展部分)

在上一篇[认证授权] 4.OIDC(OpenId Connect)身份认证授权(核心部分)中解释了OIDC的核心部分的功能,即OIDC如何提供id token来...

2998
来自专栏FreeBuf

Shodan新手入坑指南

*本文原创作者:xiaix,本文属FreeBuf原创奖励计划,未经许可禁止转载 亲们~黑五 Shodan Membership 只要5刀,你剁手了没? 什么是 ...

5325

扫码关注云+社区

领取腾讯云代金券