nginx - 将请求转发到另一个代理

12

所以,我有一个第三方代理(可能是基于squid),它只会接受来自我的一个IP的连接,但我需要能够从多个IP访问它。

因此,我正在尝试使用nginx将请求转发到这个代理。我知道nginx可以像这样转发请求:

location / {
    proxy_pass http://$http_host$uri$is_args$args;
}

如果我需要nginx直接将请求转发到目标站点,那么这个方法可行,但我需要先将其传递给代理X。我尝试了以下方法:

upstream myproxy {
   server X.X.X.X:8080;
}

location / {
   proxy_pass http://myproxy$uri$is_args$args; // also tried: http://myproxy$http_host$uri$is_args$args
}

但我收到了“(104)连接被对等方重置”的错误。我猜想是因为nginx像这样进行代理:

GET /index.html HTTP/1.1
Host: www.targetdomain.com.br

但是我需要它像这样代理:

GET http://www.targetdomain.com.br/index.html HTTP/1.1
1个回答

6
我发现这个方法有效:

http {
  # resolver 8.8.8.8; # Needed if you use a hostname for the proxy
  server_name ~(?<subdomain>.+)\.domain\.com$;

  server {
    listen 80;

    location / {
      proxy_redirect off;
      proxy_set_header Host $subdomain;
      proxy_set_header X-Forwarded-Host $http_host;
      proxy_pass "http://X.X.X.X:8080$request_uri";
    }
  }
}

如果 X.X.X.X 是主机名而不是IP,请使用resolver。查看 https://github.com/kawanet/nginx-forward-proxy/blob/master/etc/nginx.conf 以获取更多技巧。编辑:还要检查nginx server_name通配符或捕获所有http://nginx.org/en/docs/http/ngx_http_core_module.html#var_server_name

如果您需要根据查询参数设置主机,可以使用ifset等进行匹配(请参见我的答案底部的链接)。 - Silex
这是一个非常有趣的解决方案。是否可能匹配任何server_name,而不仅仅是子域名,并使用它? - lucaswxp
1
是的,请参考http://nginx.org/en/docs/http/server_names.html。在您的情况下,我认为您可以删除`server_name`指令,将`listen`指令添加一个`default_server`并使用`$server_name`代替`$subdomain`。请查看我的编辑。 - Silex
3
这仍然以仅路径形式将请求发送到代理,而不是带有方案的完整URL。 - adib
嗨@lucaswxp,我想了解您是如何解决URL而非从nginx中获取的。 - Aman Jain
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接