如何使用 NGINX 作为任何请求位置的转发代理?
How to use NGINX as forward proxy for any requested location?
我正在尝试将 NGINX 配置为转发代理以替换我们用作转发代理的 Fiddler。我们使用的 Fiddler 功能允许我们将所有传入请求代理到 8888 端口。我如何使用 NGINX 做到这一点?
在 NGINX 作为反向代理的所有示例中,我看到 proxy_pass
总是定义到特定的 upstream/proxied 服务器。我如何配置它以便它转到请求的服务器,而不管服务器的方式与我使用 Fiddler 作为转发代理的方式相同。
示例:
在我的代码中:
WebProxy proxyObject = new WebProxy("http://mynginxproxyserver:8888/",true);
WebRequest req = WebRequest.Create("http://www.contoso.com");
req.Proxy = proxyObject;
在 mynginxproxyserver/nginx.conf 中,我不想将代理委托给另一台服务器(例如 proxy_pass 设置为 http://someotherproxyserver
)。相反,我希望它只是一个代理服务器,并将来自我的客户端(见上文)的请求重定向到请求主机。当您将 Fiddler 启用为代理时,这就是它所做的:http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/UseFiddlerAsReverseProxy
您的代码似乎使用了正向代理(通常只是 "proxy"),而不是反向代理,它们的运行方式完全不同。反向代理适用于服务器端,而客户端并没有真正看到或考虑。它是从后端服务器检索内容并交给客户端。转发代理是客户端为了连接到 Internet 的其余部分而设置的东西。反过来,服务器可能对您的转发代理一无所知。
Nginx 最初被设计为反向代理,而不是正向代理。但它仍然可以用作前锋。这就是为什么您可能找不到太多配置的原因。
这更像是一个理论答案,因为我自己从未这样做过,但像下面这样的配置应该可以工作。
server {
listen 8888;
location / {
resolver 8.8.8.8; # may or may not be necessary.
proxy_pass http://$http_host$uri$is_args$args;
}
}
这只是重要的部分,您需要配置其余部分。
想法是 proxy_pass 将传递给变量主机而不是预定义的主机。因此,如果您请求 http://example.com/foo?bar
,您的 http header 将包含 example.com
的主机。这将使您的 proxy_pass 从 http://example.com/foo?bar
.
检索数据
您链接的文档将其用作反向代理。相当于
proxy_pass http://localhost:80;
当使用 Grumpy 建议的 $uri
变量时,您可以 运行 陷入 url 编码问题,因为它由 nginx 自动解码。我建议您将代理传递行修改为
proxy_pass http://$http_host$request_uri;
变量$request_uri
保持编码不变,还包含所有查询参数。
我正在尝试将 NGINX 配置为转发代理以替换我们用作转发代理的 Fiddler。我们使用的 Fiddler 功能允许我们将所有传入请求代理到 8888 端口。我如何使用 NGINX 做到这一点?
在 NGINX 作为反向代理的所有示例中,我看到 proxy_pass
总是定义到特定的 upstream/proxied 服务器。我如何配置它以便它转到请求的服务器,而不管服务器的方式与我使用 Fiddler 作为转发代理的方式相同。
示例:
在我的代码中:
WebProxy proxyObject = new WebProxy("http://mynginxproxyserver:8888/",true);
WebRequest req = WebRequest.Create("http://www.contoso.com");
req.Proxy = proxyObject;
在 mynginxproxyserver/nginx.conf 中,我不想将代理委托给另一台服务器(例如 proxy_pass 设置为 http://someotherproxyserver
)。相反,我希望它只是一个代理服务器,并将来自我的客户端(见上文)的请求重定向到请求主机。当您将 Fiddler 启用为代理时,这就是它所做的:http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/UseFiddlerAsReverseProxy
您的代码似乎使用了正向代理(通常只是 "proxy"),而不是反向代理,它们的运行方式完全不同。反向代理适用于服务器端,而客户端并没有真正看到或考虑。它是从后端服务器检索内容并交给客户端。转发代理是客户端为了连接到 Internet 的其余部分而设置的东西。反过来,服务器可能对您的转发代理一无所知。
Nginx 最初被设计为反向代理,而不是正向代理。但它仍然可以用作前锋。这就是为什么您可能找不到太多配置的原因。
这更像是一个理论答案,因为我自己从未这样做过,但像下面这样的配置应该可以工作。
server {
listen 8888;
location / {
resolver 8.8.8.8; # may or may not be necessary.
proxy_pass http://$http_host$uri$is_args$args;
}
}
这只是重要的部分,您需要配置其余部分。
想法是 proxy_pass 将传递给变量主机而不是预定义的主机。因此,如果您请求 http://example.com/foo?bar
,您的 http header 将包含 example.com
的主机。这将使您的 proxy_pass 从 http://example.com/foo?bar
.
您链接的文档将其用作反向代理。相当于
proxy_pass http://localhost:80;
当使用 Grumpy 建议的 $uri
变量时,您可以 运行 陷入 url 编码问题,因为它由 nginx 自动解码。我建议您将代理传递行修改为
proxy_pass http://$http_host$request_uri;
变量$request_uri
保持编码不变,还包含所有查询参数。