menu Chancel's blog
rss_feed
Chancel's blog
有善始者实繁,能克终者盖寡。

Privoxy+HAProxy负载均衡配置实践

作者:Chancel Yang, 创建:2019-11-20, 字数:4572, 已阅:1044, 最后更新:2024-03-10

代理协议,常见的是是HTTP或socks代理,访问外网时,小代理的稳定性往往不够好,因此一些外网代理服务商提供了多个代理点来解决单点网络崩溃导致服务崩溃的问题。但是,手动切换代理非常麻烦

为了解决这个问题,尝试引入Nginx来实现负载均衡,问题在于部分代理商的协议不一致,有的是socks5,有的是http代理为了解决这个问题,可以再引入Privoxy来将socks5代理服务转换为HTTP代理服务

这样,就可以使用通用的代理服务,而不需要关心具体的代理协议是什么,最后再结合HAProxy或Nginx则可以完美的做到将多个socks合并为一个HTTP代理且实现负载均衡

1. 说明

1.1. 目标

假设我有5个socks5的代理和5个http代理,socks5代理分别是1080-1084,http代理分别是8080-8084

实现目标

  • 将10个代理合并成一个端口 8000
  • 代理流量自动分配到上述10个可用的代理节点上
  • 自动屏蔽不可用的节点

1.2. Socks5

SOCKS5代理是一种通用的代理协议,支持多种协议和应用程序的代理,而HTTP代理主要用于Web浏览器的代理,并且只能代理HTTP流量

HAProxy是一款高性能、开源的负载均衡器和代理服务器软件。它能够在多个服务器之间分配和平衡流量,特点如下

  1. 负载均衡:HAProxy可以将流量分发到多个后端服务器,以实现负载均衡。它支持各种负载均衡算法,如轮询、加权轮询、IP哈希等
  2. 高可用性:HAProxy支持故障检测和故障转移,可以自动将流量切换到健康的服务器上,以确保系统的高可用性
  3. 反向代理:HAProxy可以作为反向代理,接收客户端请求,并将请求转发给后端服务器。这样可以隐藏后端服务器的真实IP地址,并提供更好的安全性和灵活性
  4. SSL终止:HAProxy可以终止和处理SSL/TLS连接,减轻后端服务器的负载,并提供更高的性能和安全性
  5. 动态配置:HAProxy支持动态配置更新,可以在运行时动态添加、修改或删除后端服务器,而无需重启服务
  6. 监控和统计:HAProxy提供了丰富的监控和统计功能,可以实时监控服务器的状态、流量信息和性能指标,帮助进行故障排除和性能优化

由于其高性能、可靠性和灵活性,HAProxy被广泛应用于Web应用、容器化环境、云计算平台等场景中,成为一款非常受欢迎的负载均衡和代理解决方案

但如果将http和socks代理一起配置到是不可行的,这样做虽然不会报错,但无法负载均衡,socks5流量会被分配到socks5代理服务器上,http代理的流量会直接分配给http代理服务器

所以先使用HAProxy将几个socks5做负载均衡转换为一个socks5代理,然后使用Privoxy将这个端口转换为HTTP代理,最后再使用HAProxy代理这6个HTTP代理

2. 实践

2.1. HAProxy

安装并启用HAProxy

Bash
sudo apt install haproxy
sudo systemctl start haproxy
sudo systemctl enable haproxy

编辑/etc/haproxy/haproxy.cfg

TEXT
global
    maxconn 2000         #默认最大连接数

defaults
    mode   tcp           #所处理的类别,默认采用http模式
    option  forwardfor   #将客户端真实ip加到HTTP Header中供后端服务器读取
    option  httpclose    #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只>能模拟这种模式的实现
    retries 2            #2次连接失败就认为服务器不可用,主要通过后面的check检查
    option  redispatch   #当serverid对应的服务器挂掉后,强制定向到其他健康服务器
    option  abortonclose #当服务器负载很高时,自动结束掉当前队列中处理比较久的链接
    timeout connect 5000  #连接超时时间
    timeout client  50000 #客户端连接超时时间
    timeout server  50000 #服务器端连接超时时间

frontend socks-in
    mode tcp
    bind 127.0.0.1:1085
    default_backend socks-out

backend socks-out
    mode tcp
    option      tcp-check
    timeout server 3000
    balance roundrobin
    server socks01 127.0.0.1:1080 weight 5 check inter 2000 rise 2 fall 3
    server socks02 127.0.0.1:1081 weight 5 check inter 2000 rise 2 fall 3
    server socks03 127.0.0.1:1082 weight 5 check inter 2000 rise 2 fall 3
    server socks04 127.0.0.1:1083 weight 5 check inter 2000 rise 2 fall 3
    server socks05 127.0.0.1:1084 weight 5 check inter 2000 rise 2 fall 3
    # weight 标示权重,check 标示检查

根据上面的配置文件,我们将30000-30004的socks代理转换负载均衡的的socks代理(1085)

2.2. Privoxy

上面已经使用HAProxy将多个socks代理转换为一个socks代理了,接下来我们安装Privoxy

Bash
sudo apt install privoxy
sudo systemctl start privoxy
sudo systemctl restart privoxy

修改Privoxy配置,将socks代理转换为HTTP代理

Bash
sudo vim /etc/privoxy/config

# 下面是配置文件,无关的用省略号代替
...
listen-address  0.0.0.0:8085                           # HTTP代理对外监听端口
...
forward-socks5t   /               127.0.0.1:1085 .     # socks代理信息
...

上面的配置将socks5://127.0.0.1:1085的代理转换为 http://127.0.0.1:8085

2.3. 负载均衡

现在回到HAProxy,所有的代理协议已经统一为http,下面将演示用HAProxyNginx各自实现负载均衡

HAProxy的负载均衡,编辑/etc/haproxy/haproxy.cfg

Bash
# 配置文件
global
    maxconn 2000         #默认最大连接数

defaults
    mode   tcp           #所处理的类别,默认采用http模式
... 
# 上面是在协议合并章节的配置,不需要修改,下面是新增的配置

frontend http-in
    mode http
    bind 127.0.0.1:8086
    default_backend http-out

backend http-out
    mode http
    option      http-check
    timeout server 3000
    balance roundrobin
    server http01 127.0.0.1:8080 check inter 20000
    server http02 127.0.0.1:8081 check inter 20000
    server http03 127.0.0.1:8082 check inter 20000
    server http04 127.0.0.1:8083 check inter 20000
    server http05 127.0.0.1:8084 check inter 20000
    server http06 127.0.0.1:8085 check inter 20000
    # 使用check inter 20秒抓取一次代理情况

重启HAProxy,即可得到一个 http://127.0.0.1:808 的统一HTTP代理

Bash
sudo systemctl restart haproxy

Nginx负载均衡,首先安装Nginx

Bash
sudo apt update
sudo apt -y install nginx

编辑/etc/nginx/conf/proxy.conf,内容参考如下

TEXT
http {
    upstream backend {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
        server 127.0.0.1:8004;
        server 127.0.0.1:8005;
    }

    server {
        listen 8086;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

3. 附录

HAProxy 2.0.9 - Document


[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]