nginx 和 2 个上游

nginx 和 2 个上游

我想要执行以下操作:我有重定向到 tomcat 的 nginx,因此配置如下:


    upstream miserver.com {
         server localhost:8080;
    }


    server {

        listen      0.0.0.0:80;
        location / {
            proxy_pass http://miserver.com/mywar-web-0.4/convert;
        }
   }

我想要做的是 nignx 命中上游,并且只考虑其中一个的响应。这是因为我想测试 war 的新版本,但我仍然想继续使用旧版本(新版本会将信息记录在文件中)。

例如,我想要:


    upstream miserver.com {
         server localhost:8080;
    }

    server {

        listen      0.0.0.0:80;
        location / {
            proxy_pass http://miserver.com/mywar-web-0.4/convert;
            proxy_pass http://miserver.com/mywar_testing-web-0.4/convert;
        }
   }

当命中“/”时,nginx 将命中: - mywar-web-0.4 - mywar_testing-web-0.4

但只有mywar-web-0.4用来。

答案1

你基本上想要的是单个客户请求导致 nginx 制作向后端服务器发出两个请求,但只将其中一个请求的结果返回给客户端。这是非常不寻常的,并且通常不支持。

  • 你可能想尝试一些技巧error_page。您可能希望发出第一个请求(其答复将被丢弃),然后将其状态代码捕获为错误,然后使用命名位置(以 开头@且不会重写 的位置$uri)来处理后续请求,该请求将返回给客户端。不确定您是否可以指定error_page 200,如果不能,那么您可能必须修改您的应用程序(其答复将被丢弃)以返回一些实际的错误代码。

  • 或者,您可以尝试使用某种过滤模块,例如ngx_http_addition_moduleadd_after_body指令。虽然这是一个官方模块,并且已经是 nginx 源代码分发的一部分,但它需要重新编译,并且还会导致向用户返回两个回复,因此无论如何你都必须修改你的应用程序。

答案2

我使用此配置对 4 个 Tornado 服务器进行负载平衡。

upstream frontends {
    server 127.0.0.1:8888;
    server 127.0.0.1:8889;
    server 127.0.0.1:8890;
    server 127.0.0.1:8891;
}
server { 
    listen 80;
    location / {
        proxy_pass http://frontends;
    }
}

请求分布在“前端”列表中的每个服务器之间,如果一个服务器发生故障,它将被忽略,直到可以访问为止。

在您的示例中,如果每个战争都在不同的端口上监听,您可以让每个战争处理部分流量。

检查上游模块文档了解更多信息。

答案3

这对你有用吗?

 upstream miserver.com {
         server localhost:8080;  <- This is Live mywar-web-0.4
         server localhost:8081;  <- This is Testing mywar_testing-web-0.4
    }

    server {
        listen      0.0.0.0:80;
        location / {
            proxy_pass http://miserver.com;
        }
   }
不确定你是否可以做到这一点,并且仍然知道你使用的是什么后端

希望这能有所帮助:D

相关内容