如何让nginx将流量同时转发到后台的两个服务上

1,056 阅读1分钟

正常情况我们都是用nginx做反向代理,做负载均衡,将流量均匀的分散到upstream中,但是有时可能会需要同时打入后端两个服务

方法1

使用mirror模块,对于mirror模块的简单介绍大家可以自行百度一下 本方法流量虽然能导入两个服务,但是返回只能返回第一个服务的返回结果

  1. 创建proxy.conf在nginx的conf.d目录下面
include       mime.types;


upstream test1 {
    ip_hash;
    server 172.20.7.110:8050;
}

upstream test2 {
    ip_hash;
    server 172.20.7.110:8051;
}


server {
    listen       8888;
    location /a {
            mirror /mirror;
            # 需要放大流量 再加一个 mirror /mirror;
            proxy_pass http://test1/metrics;
    }
    
    location = /mirror {
        internal;
        proxy_pass http://test2/metrics;
    }
}
  1. 在测试172.20.7.110服务器上起两个服务 服务1,端口8050
package main

import (
    "fmt"
    "http"
)

func HelloHandler(w http.ResponseWriter, r *http.Request){
    fmt.Fprintf(w, "lexporter_request_count{user=\"admin\"} 1000" )
    fmt.Println("被访问了")
}

func main() {
    for {
      http.HandleFunc("/metrics", HelloHandler)
      http.ListenAndServe(":8050", nil)
    }
}

服务2,端口8051

package main

import (
    "fmt"
    "http"
)

func HelloHandler(w http.ResponseWriter, r *http.Request){
    fmt.Fprintf(lexporter_request_count{user=\"admin\"} 2000")
    fmt.Println("被访问过了")
}

func main() {
    for {
        http.HandleFunc("/metrics", HelloHandler)
        http.ListenAndServe(":8051", nil)
    }
}

同时开两个终端,进行启动两个程序,不要关掉,当程序收到访问的时候,我们能看到终端上会打印一句“被访问过了”
结果:可以看到访问返回的结果是第一个程序的,但是去两个程序的终端查看,两个程序是都被访问了的

方法2

这个是ChartGPT生成的,我测试了一下一直没有成功,不知道为什么,如果有知道的可以下方留言

使用sub_filter模块:
upstream backend_servers1 {
    server 172.20.7.110:8050;
}

upstream backend_servers2 {
    server 172.20.7.110:8051;
}

server {
    listen 80;
    location /metrics {
        proxy_pass http://backend_servers1;
        sub_filter '</body>' '<form method="POST" action="http://backend_servers2"></form></body>';
        sub_filter_once off;
    }
}