Nginx:获取proxy_pass使用的上游URI

km0tfn4u  于 2023-02-21  发布在  Nginx
关注(0)|答案(3)|浏览(208)

我正在使用proxy_pass,并希望记录proxy_pass使用的URI。
除了URI本身,我可以记录进程的每个细节,如$upstream_addr(IP)。
我错过了什么还是这是不可能的?

sirbozc5

sirbozc51#

我相信您希望使用的日志格式变量是$proxy_host
Nginx无功参考
$proxy_host在proxy_pass指令中指定的代理服务器的名称和端口

4nkexdtk

4nkexdtk2#

我正在使用proxy_pass,并希望记录proxy_pass使用的URI。
$upstream_addr,但您仍然无法在那里获得完整的URI。
这取决于具体情况,但如果您的应用已经投入生产,请添加$upstream_addr并检查上游的访问日志。
如果您的应用仍在调试中,请在error_log指令中使用nginx的debug级别。
我希望得到完整的URI,因为我的参数有一点小麻烦。一些他们似乎被忽略了,我试图记录这些。
那么,您可能会遇到nginx的proxy_pass URI处理规则。
请求URI按如下方式传递到服务器:
如果使用URI指定proxy_pass指令,则在将请求传递到服务器时,规范化请求URI中与位置匹配的部分将替换为指令中指定的URI:

location /name/ {
       proxy_pass http://127.0.0.1/remote/;
   }

如果指定proxy_pass时不带URI,则请求URI将以处理原始请求时客户端发送的相同形式传递到服务器,或者在处理更改的URI时传递完整的规范化请求URI:

location /some/path/ {
       proxy_pass http://127.0.0.1;
   }

如果需要将完整的URI传递给上游,只需指定proxy_pass的上游URI,而不是上游URI,并删除任何尾随的正斜杠。

proxy_pass http://backend_upstream;
svmlkihl

svmlkihl3#

在我的第一个NGINX配置中,当我认为我应该传递一个好的URI时,我与从上游服务器得到大量404错误作斗争。我可以记录我的NGINX服务器接收的URI,但从来不确定我的NGINX服务器传递给上游服务器的是什么。在我的经验和研究中,我从来没有找到一种方法来记录NGINX传递给处理客户端请求的NGINX服务器的是什么。
但是,上游服务器知道NGINX服务器正在请求的完整URI。在我的情况下,上游服务器是由另一个团队处理的,我没有访问那个服务器上的日志。最后我意识到,为什么不使用我自己的上游服务器,在那里我可以访问日志,也可以指定它如何记录日志。我可以很容易地做到这一点,因为我有多个NGINX服务器是我的开发环境。我使用第一个NGINX服务器作为我正在配置的代理服务器,第二个作为上游服务器。
我将调用我正在配置的原始NGINX服务器“MyProxyServer.com“我将调用我正在使用的上游服务器,以记录MyProxyServer.com传递的URI“Upstream.com“
在www.example.com上MyProxyServer.com,我配置了:

location /upstream/ {
    access_log  /etc/nginx/logs/received_requests.log   logformat1;
    proxy_pass  https://Upstream.com/;
}

在www.example.com上Upstream.com,我配置了:

location /  {
    access_log  /etc/nginx/logs/unexpected_uri.log    logformat1;
    try_files /unexpected.html =123;
}

location /uricapture/  {
    access_log  /etc/nginx/logs/uri_passed.log    logformat1;
    try_files /index.html =234;
}

使用您最喜欢的客户端GET https://MyProxyServer.com/uricapture/the/final/endpoint/
在www.example.com上MyProxyServer.com我可以检查日志,看到它收到了GET请求。GET /uricapture/the/final/endpoint/
在www.example.com上Upstream.com我可以检查日志,在uri_passed. log中,我看到MyProxyServer.com请求:GET /the/final/endpoint/
我找回了我设置的index.html文件。

相关问题