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

wdebmtf2  于 2023-03-17  发布在  Nginx
关注(0)|答案(3)|浏览(220)

我正在尝试将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

dffbzjpn

dffbzjpn1#

您的代码似乎正在使用转发代理(通常只是“代理”),而不是反向代理,它们的运作方式也完全不同。反向代理是服务器端的,客户端并不真正看到或考虑到的东西。它是从后端服务器检索内容并交给客户端。正向代理是客户端设置的,以便连接到互联网的其余部分。反过来,服务器可能潜在地不知道关于你的转发代理的任何事情。

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将传递给一个变量host而不是一个预定义的host,所以如果你请求http://example.com/foo?bar,你的http头将包含example.com的host,这将使你的proxy_pass从http://example.com/foo?bar获取数据。
您链接的文档正在将其用作反向代理。它等效于

proxy_pass http://localhost:80;
ntjbwcob

ntjbwcob2#

当按照Grumpy的建议使用$uri变量时,可能会遇到url编码问题,因为它是由nginx自动解码的。
proxy_pass http://$http_host$request_uri;
变量$request_uri保留了完整的编码,并且还包含所有查询参数。

t1rydlwq

t1rydlwq3#

使用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;
     }
 }
}

相关问题