使用tcpdump+wireshark分析nginx反向代理无法访问问题
  vYK3nmVMoUKm 2023年11月02日 64 0

问题描述

在使用nginx配置多路径反向代理后端prometheus应用的时候由于prometheus本身是自动跳转到/graph才能正常访问,而使用nginx反向代理如果只是配置简单的http_proxy到后端prometheus的端口会报404错误,以下是具体的配置和报错:

        location /prometheus {
         proxy_pass http://10.10.10.227:9090;
         }

image.png

使用tcpdump抓包

tcpdump -i ens192 tcp port 80 or tcp port 9090 -w nginx.pcap

使用wireshark分析

image.png 通过以上截图可知189这台客户端也就是浏览器请求到103,103再请求到227,而从227返回的404可知实际上真实请求的地址是http://10.10.10.227:9090/prometheus,而这个路径在227是不存在的,真实存在的是http://10.10.10.227/graph image.png 因为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处理那么访问会变成这样: image.png 还是没有达成我们的预期,所以还得修改,使用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的地址 image.png

多个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简单粗暴的将不管什么链接反正重定向到最终要访问的地址上去。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  P3nxyT0LRuwj   2023年11月28日   22   0   0 nginxhtmlWeb
  jnZtF7Co41Wg   2023年12月11日   27   0   0 nginx客户端服务端
  jnZtF7Co41Wg   2023年11月28日   19   0   0 nginx文件名linux命令
  stLBpDewCLT1   2023年12月08日   27   0   0 nginx
  jnZtF7Co41Wg   2023年12月10日   20   0   0 nginx客户端服务端NFS
  eHipUjOuzYYH   2023年12月06日   26   0   0 nginxHTTP
  eHipUjOuzYYH   2023年12月06日   22   0   0 nginx加载IPV6