Nginx:将实际转发的 proxy_pass 请求 URI 记录到上游

Gle*_*mad 6 server-configuration nginx proxypass server nginx-reverse-proxy

我有以下 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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当我击中时:

http://localhost/test/bar/foo
Run Code Online (Sandbox Code Playgroud)

我的实际输出是:

[proxied request] localhost/test/bar/foo -> 127.0.0.1:3000 
Run Code Online (Sandbox Code Playgroud)

虽然我的预期输出是:

[proxied request] localhost/test/bar/foo -> 127.0.0.1:3000/bar
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*dOS 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
Run Code Online (Sandbox Code Playgroud)

可以通过手动输入 来模拟响应,然后在运行HTTP/1.1 200 OK时输入 2 个新行。nc

  • 是的,根据您的解决方法的想法,我在 `nginx` 和 `nginx` 之间使用 [`socat`](http://www.dest-unreach.org/socat/) 设置一个小型记录器/转发器我的本地服务器。假设我的本地服务器在端口 3000 上运行,我将 nginx 配置调整为“proxy_pass http://127.0.0.1:3001/$1”,然后运行“socat -v tcp-listen:3001,fork tcp:localhost:3000” ,这很好地完成了这项工作。总而言之,由于我认为没有合适的 nginx-ic 方法来做到这一点,所以我暂时接受您的解决方案,直到出现其他更好的解决方案。再次感谢!:)) (2认同)