我想要执行以下操作:我有重定向到 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_module
和add_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