问题描述
在使用nginx配置多路径反向代理后端prometheus应用的时候由于prometheus本身是自动跳转到/graph才能正常访问,而使用nginx反向代理如果只是配置简单的http_proxy到后端prometheus的端口会报404错误,以下是具体的配置和报错:
location /prometheus {
proxy_pass http://10.10.10.227:9090;
}
使用tcpdump抓包
tcpdump -i ens192 tcp port 80 or tcp port 9090 -w nginx.pcap
使用wireshark分析
通过以上截图可知189这台客户端也就是浏览器请求到103,103再请求到227,而从227返回的404可知实际上真实请求的地址是http://10.10.10.227:9090/prometheus,而这个路径在227是不存在的,真实存在的是http://10.10.10.227/graph 因为nginx是多路径的location /prometheus后他请求的路径自带了/prometheus,导致访问不到,如果使用location /,那么他请求的真实地址就是http://10.10.10.227:9090,这个时候227就会自动跳转http://10.10.10.227:9090/graph,所以此处的nginx就要做修改。
修改nginx配置
改成以下:
location /prometheus {
rewrite ^/prometheus/?(.*)$ /$1 break;
proxy_pass http://10.10.10.227:9090;
}
以上代码rewrite部分表示将/promethues开始的路径将/promethues去掉只保留后面的内容,但是如果只是一直rewrite处理那么访问会变成这样:
还是没有达成我们的预期,所以还得修改,使用proxy_redirect
,修改成如下:
location /prometheus {
rewrite ^/prometheus/?(.*)$ /$1 break;
proxy_pass http://10.10.10.227:9090;
proxy_redirect $uri /prometheus$uri;
}
proxy_redirect字段的意思是将访问路径前面加一个/promethues,这样路径组合/promethus/graph就具体访问到后端的prometheus了,而前面的/promethues代表的是nginx代理部分的内容后面的/graph才是真实的Prometheus的地址
多个nginx的场景
现实情况有可能nginx前面还会有一个nginx作为入口nginx,或者nginx前面有个F5等负载设备,此时以上的配置又出现问题了。由于是客户的环境,vpn过期了没法截图,这边我就直接把解决方法写出来,还是要修改nginx配置,修改成如下
location /prometheus {
rewrite ^/prometheus/?(.*)$ /$1 break;
proxy_pass http://10.10.10.227:9090;
proxy_redirect / https://xxx.xxx.com/prometheus/;
}
最后一个proxy_redirect简单粗暴的将不管什么链接反正重定向到最终要访问的地址上去。
标签:wirkshark,http,无法访问,9090,nginx,prometheus,proxy,10.10 From: https://blog.51cto.com/riverxyz/6504957