Nginx:记录实际转发的proxy_pass请求URI到upstream

5
我有以下的nginx配置:
http {

  log_format upstream_logging '[proxied request] '
                              '$server_name$request_uri -> $upstream_addr';
  
  access_log /dev/stdout upstream_logging;

  server {

    listen 80;
    server_name localhost;
    
    location ~ /test/(.*)/foo {
      proxy_pass http://127.0.0.1:3000/$1;
    }
  }
}

当我按下时:

http://localhost/test/bar/foo

我的实际输出是:
[proxied request] localhost/test/bar/foo -> 127.0.0.1:3000 

我的预期输出是:

[proxied request] localhost/test/bar/foo -> 127.0.0.1:3000/bar

在日志中有没有变量或方法可以生成实际代理的URI?


该死,我也需要那个! - roeb
@roeb,那么您可以投票支持这个问题 #声望追求者 :) - Glenn Mohammad
1个回答

2

如果不是生产环境,您可以在所需的本地地址和端口上启动最简单的监听服务器(而不是真正的服务器),以测试nginx发送了什么:

$ nc -l 127.0.0.1 3000
POST /some/uri HTTP/1.0
Host: 127.0.0.1
Connection: close
Content-Length: 14

some payload

在运行nc时,可以手动输入HTTP/1.1 200 OK,然后再加上两个换行符,从而模拟响应。


1
嗯,这可能是一个有趣的解决方法。但是当我尝试使用 nc -l 127.0.0.1:3000 时,我得到了 nc: getaddrinfo: nodename nor servname provided, or not known 的错误信息(?) - Glenn Mohammad
1
感谢您的报告。很抱歉,我在主机和端口之间放置了“:”是我的错误。它们必须仅由一个空格分隔。现在我已经在答案中更正了示例。 - AleXoundOS
其实,我应该自己读手册的 - 对此也很抱歉哈哈。不得不承认,这看起来很有前途,是个聪明的解决方法! :) 我现在可以确认,至少我已经部分地得到了我想要的:当从浏览器访问localhost/test/bar/foo时,能够在nc日志中看到/bar部分。不幸的是,服务器的响应似乎没有返回给浏览器(浏览器一直在加载)。有什么想法吗? - Glenn Mohammad
确实,不会有任何响应。这个解决方法可以完成原始问题的要求 - 记录实际请求。响应超出了范围。如果您有一个真正响应的服务器,您可以使用 tcpdumpwireshark 监视消息。 - AleXoundOS
2
根据您的解决方案,我尝试了一下使用socatnginx和我的本地服务器之间设置了一个小型记录器/转发器。假设我的本地服务器运行在3000端口上,我将我的nginx配置改为proxy_pass http://127.0.0.1:3001/$1,然后运行socat -v tcp-listen:3001,fork tcp:localhost:3000,这样就可以很好地完成任务了。总的来说,由于我认为没有一个适当的nginx方式来解决这个问题,所以我暂时接受了您的解决方案,直到有更好的解决方案出现。再次感谢! :)) - Glenn Mohammad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接