我正在尝试将 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
您的代码似乎使用了正向代理(通常只是“代理”),而不是反向代理,它们的运行方式完全不同。反向代理适用于服务器端,而客户端并没有真正看到或考虑。它是从后端服务器检索内容并交给客户端。转发代理是客户端为了连接到 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;
按照 Grumpy 的建议使用
$uri
变量时,您可能会遇到 url 编码问题,因为它是由 nginx 自动解码的。我建议您将代理传递行修改为
proxy_pass http://$http_host$request_uri;
变量
$request_uri
保持编码不变,还包含所有查询参数。
使用 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;
}
}
}