如何配置Nginx作为代理服务器的负载均衡器?

9
我知道nginx可以被配置为充当负载均衡器,但我想知道是否可以在代理之间进行负载均衡?假设我有多个代理在本地主机上运行,并且我想使用nginx提供单一连接点,以便我可以在代理之间轮换。我试图实现类似于这里的帖子所描述的内容,该帖子使用的是HAProxy而不是nginx。我有以下nginx.conf
events {  }

http {
    upstream proxies {
        server localhost:9998;
        server localhost:9999;
        server localhost:10000;
    }
    server {
        listen 8080;

        location / {
            proxy_pass http://proxies;
        }
    }
}

然而,当我发送类似这样的curl请求时:
curl http://icanhazip.com -x localhost:8080

它忽略了URL,我收到的响应类似于如果我直接向其中一个代理服务器发送请求时所期望的响应:
curl localhost:9999

当然,我并不真的期望它可以工作,因为必须有一些选项来告诉nginx将upstream服务器本身视为代理。然而,在网上搜索后我没有找到如何做到这一点。


我不确定你的问题是什么,你的问题是什么,你所说的代理是什么 - 因为在这里,你的nginx负载均衡也是一个反向代理。你的问题是没有主机头吗?尝试在proxy_pass指令后添加 proxy_set_header Host $host; - regilero
我正在尝试使用nginx在多个代理之间进行轮换。换句话说,我想能够连接到nginx主机和端口(例如localhost:8080)作为代理,并且它将在我设置的多个代理之间进行轮换。 - b_pcakes
好的,你试过主机这个东西了吗?因为反向代理几乎是透明的,没人关心被代理的后端是最终服务器还是一些代理,但你需要知道你实际上正在将哪个域名转发到代理。 - regilero
尝试过了,但出于某些原因似乎没有起作用...另外一件事,我能够在AWS上使用弹性负载均衡器和一组EC2实例设置相同的东西,但我不得不为负载均衡器设置TCP规则而不是HTTP才能使其工作。不确定这里是否也是如此? - b_pcakes
你知道HAProxy是否有包含文件的功能吗?我想使用你提供的方法,但是希望将代理列表维护在一个单独的文件中。 - chovy
3个回答

3

1

正如您在haproxy文章中所看到的,haproxy可以作为转发代理

选项http_proxy

这个选项的含义在手册中有描述 https://cbonte.github.io/haproxy-dconv/1.6/configuration.html#4-option%20http_proxy

有时人们需要一个纯HTTP代理,它能够理解基本的代理请求,而不需要缓存或任何花哨的功能。在这种情况下,值得设置一个带有“option http_proxy”设置的HAProxy实例。在这种模式下,没有服务器被声明,并且连接被转发到“http://”方案后找到的IP地址和端口。

不执行主机地址解析,因此仅在传递纯粹的IP地址时才有效。由于此选项的使用范围相当有限,因此可能仅由知道他们确切需要它的专家使用。这与HTTP隧道模式不兼容。

据我所知,nginx没有这个功能。

这是一个类似的问题。 https://superuser.com/questions/604352/nginx-as-forward-proxy-for-https 为什么不能像您链接中的帖子所描述的那样使用haproxy?

HaProxy不允许在配置中包含文件。我想要管理一个名为proxies.list的导入文件。Nginx有包含功能,但显然无法将请求转发到http代理? - chovy

0

您需要为代理配置加权或其他负载均衡规则

类似于max_fails=1 fail_timeout=10s;

        Can you put max_fails =1 and fail_timeout=10s; after the proxies

    server localhost:9998 max_fails =1 and fail_timeout=10s;
    server localhost:9999 max_fails =1 and fail_timeout=10s;
    server localhost:10000 max_fails =1 and fail_timeout=10s;


  change location /{ 
       to location @proxy{

您能提供一个完整的示例吗? - chovy

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