正常情况我们都是用nginx做反向代理,做负载均衡,将流量均匀的分散到upstream中,但是有时可能会需要同时打入后端两个服务
方法1
使用mirror模块,对于mirror模块的简单介绍大家可以自行百度一下 本方法流量虽然能导入两个服务,但是返回只能返回第一个服务的返回结果
- 创建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;
}
}
- 在测试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;
}
}
- 好文推荐:
- Nginx在线配置生成工具:www.nginxedit.cn/
- 性能工具之常见流量复制工具:segmentfault.com/a/119000003…