nginx上游代理的后备

时间:2012-11-14 14:11:28

标签: nginx proxy fallback

我在一组图像服务器前面有一个nginx实例:

  upstream img-farm-1  {
    server 10.0.1.1;
    server 10.0.1.2;
    server 10.0.1.3;
    server 10.0.1.4;
    # etc
  }

  location ~ ^/static: {
    rewrite /static:(.*) /$1 break;
    proxy_pass http://img-farm-1;
    limit_except GET {
        allow all;
    }
  }

这个集群正在被一个新的集群取代,有一段时间,我希望从旧集群中提供映像,但如果映像是新映像或已从中迁移,则会在新集群上回退旧到新。迁移完成后,我可以返回原始设置。

所以我以为我能做到

  upstream img-farm-2  {
    server 10.0.2.1;
    server 10.0.2.2;
    server 10.0.2.3;
    server 10.0.2.4;
    server 10.0.2.5;
    # etc
  }

  location ~ ^/static: {
    access_log /var/log/nginx/static.access.log;
    rewrite    /static:(.*) /$1 break;
    proxy_pass http://img-farm-1;
    error_page 404 = @fallback-2;
  }

  location @fallback-2 {
    access_log /var/log/nginx/static-2.access.log;
    proxy_pass http://img-farm-2;
  }

但这不起作用。我在static.access.log看到了404,但error_page 404指令没有被采取行动,因为没有任何内容写入static-2.access.log

我很确定我不能使用try_files因为,好吧,没有任何本地文件,所有内容都是代理的。

以前有人做过这样的事吗?我错过了什么?

2 个答案:

答案 0 :(得分:8)

傻傻的我。所需的只是第一个位置的proxy_intercept_errors on;

答案 1 :(得分:1)

我有类似的情况,但是如果我的第一台服务器出现故障(状态)502,我想回退到另一台服务器上。我可以在不使用proxy_intercept_errors的情况下使其正常工作(nginx/1.17.8)。

此外,对于使用proxy_pass和URI(在此示例中为/)的任何人,您都需要使用略有不同的配置,否则会出错(请参见下文)。

location /texts/ {
  proxy_pass http://127.0.0.1:8084/;
  proxy_set_header X-Forwarded-For $remote_addr;
  error_page 502 = @fallback;
}

location @fallback {
  # This will pass failed requests to /texts/foo above to
  #  http://someotherserver:8080/texts/foo
  proxy_pass http://someotherserver:8080$request_uri;
}

无论出于何种原因,Nginx均不允许在此处使用斜杠:

location @fallback {
  proxy_pass http://someotherserver:8080/;
}

会抛出:

nginx:[emerg]“ proxy_pass”不能在正则表达式给出的位置,命名位置内部,“ if”语句内部或“ limit_except”块内部

很遗憾,没有/,您不能(AFAIK)proxy_pass子目录。没有$1的RegEx也不起作用,因为它不支持空格。