8

我在图像服务器集群前面有一个 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;
  }

但这不起作用。我看到了 404,static.access.log但该error_page 404指令没有被执行,因为没有任何东西被写入static-2.access.log.

我很确定我不能使用try_files,因为,嗯,没有任何本地文件,一切都被代理了。

有没有人做过这样的事情?我错过了什么?

4

3 回答 3

14

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

于 2012-11-14T14:31:30.310 回答
3

我有类似的情况,但如果我的第一台服务器关闭(状态)502,我想回退到另一台服务器。我让它工作(nginx/1.17.8)而不需要 proxy_intercept_errors`。

此外,对于使用proxy_passURI 的任何人(/在此示例中),您需要使用稍微不同的配置,否则您将收到错误消息(见下文)。

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”块中包含URI部分

不幸的是,没有/你不能(AFAIK)proxy_pass 一个子目录。没有 RegEx$1也不起作用,因为它不支持空格。

于 2020-09-25T08:25:14.033 回答
0

这应该工作

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;
    proxy_intercept_errors on;
    error_page 404 = @fallback-2;
}

location @fallback-2 {
    access_log /var/log/nginx/static-2.access.log;
    proxy_pass http://img-farm-2;
}
于 2021-12-09T11:56:36.843 回答