如何使用 NGINX 作为任何请求位置的转发代理?

问题描述 投票:0回答:3

我正在尝试将 NGINX 配置为转发代理,以替换我们用作转发代理的 Fiddler。我们使用的 Fiddler 功能允许我们将所有传入请求代理到 8888 端口。我如何使用 NGINX 做到这一点?

在 NGINX 作为反向代理的所有示例中,我看到

proxy_pass
总是定义到特定的上游/代理服务器。我如何配置它以便它转到请求的服务器,而不管服务器的方式与我使用 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

nginx proxy reverse-proxy fiddler
3个回答
64
投票

您的代码似乎使用了正向代理(通常只是“代理”),而不是反向代理,它们的运行方式完全不同。反向代理适用于服务器端,而客户端并没有真正看到或考虑。它是从后端服务器检索内容并交给客户端。转发代理是客户端为了连接到 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 标头将包含
example.com
的主机。这将使您的 proxy_pass 从
http://example.com/foo?bar
.

检索数据

您链接的文档将其用作反向代理。这相当于

        proxy_pass http://localhost:80;

9
投票

按照 Grumpy 的建议使用

$uri
变量时,您可能会遇到 url 编码问题,因为它是由 nginx 自动解码的。我建议您将代理传递行修改为

proxy_pass http://$http_host$request_uri;

变量

$request_uri
保持编码不变,还包含所有查询参数。


0
投票

使用 nginx 作为 https 的正向代理 需要安装proxy_connect

cd /tmp
wget https://nginx.org/download/nginx-1.20.2.tar.gz
tar xzvf nginx-1.20.2.tar.gz

git clone https://github.com/chobits/ngx_http_proxy_connect_module

cd nginx-1.20.2/
patch -p1 < ../ngx_http_proxy_connect_module-master/patch/proxy_connect_rewrite_1018.patch

./configure --add-module=../ngx_http_proxy_connect_module-master --prefix=/usr
make 
sudo make install

然后编辑 nginx.conf

nano /usr/conf/nginx.conf
http {
 server {
     listen                         3128;

     # dns resolver used by forward proxying
     resolver                       8.8.8.8;

     # forward proxy for CONNECT request
     proxy_connect;
     proxy_connect_allow            443 563;
     proxy_connect_connect_timeout  10s;
     proxy_connect_data_timeout     10s;

     # forward proxy for non-CONNECT request
     location / {
         proxy_pass http://$host;
         proxy_set_header Host $host;
     }
 }
}
© www.soinside.com 2019 - 2024. All rights reserved.