Project V 负载均衡的两种方法

2018-01-04

前言

许多朋友有不只一台的服务器,那么在使用Project V 的过程中,可以通过Project V 本身或者 Haproxy 来实现负载均衡,从而达到均摊流量,减少单个IP连接的时间,从而减少暴露面而降低被封的可能性(可能没有用)。本文将介绍的两种方法。

利用 Project V 自带的负载均衡

此方法不需要任何外部软件,配置简单易用,可以达到分摊流量,较少单个暴露时间的效果。缺点同样存在,那就是只能进行简单的轮询,也就是类似先用“A”,再用“B”,再用“C”然后周而复始的状况,即“A-B-C-A-B-C···”,显得不是特别灵活。此外,如果有一个服务器离线或者不能连接,Project V 也往往不能够自动将其剔除。这样,不仅每次都会出现轮询到不能用的服务器而不能上网,并且它需要人为发现并手动处理,十分不智能。

但还是值得一试

拓扑结构

                      ====> server1
                      |
data ====> Project V  ====> server2
                      |
                      ====> server3

Project V 配置

{
  "inbound": {
  ...
  },
  "outbound": {
    "protocol": "vmess",
    "settings": {
      "vnext": [
        {
          "address": "address_of_vps1",
          "port": 8232,
          "users": [
            {
              "id": "1ce383ea-13e9-4939-9b1d-20d67135969a",
              "alterId": 64
            }
          ]
        },
        {
          "address": "address_of_vps2",
          "port": 4822,
          "users": [
            {
              "id": "bc172445-4b5e-49b2-a712-12c5295fd26b",
              "alterId": 64
            }
          ]
        }
        //如果还有更多服务器可继续添加
      ]
    },
    "streamSettings": {
    ...
    }
  },
  ...
}

如端口、id 这些在 vnext 数组内的配置项可以各不相同,但是它们的传输层配置(streamSettings)必须一致。如果有配置 TLS 的需求,只需申请一个 TLS 证书,然后把证书和密钥复制到所有的 VPS 并配置好 TLS,接着客户端配置里 address 填各个服务器的 IP,在 tlsSettings 的 serverName 填证书的域名。

这样,我们就设置好了负载均衡了,每次新建连接时,它会自动帮我们依次选择服务器来连接。

利用 Haproxy 实现负载均衡

通过之前的分析,我们可以知道,内置负载均衡的一个很大的缺点,就是不能自动排除已掉线的服务器。那么我们可以换一种思路,利用著名的负载均衡软件 Haproxy 来协助我们完成这项工作。它的优势有很多:1. 它拥有更多的轮询方式,2. 它可以自动排除掉线的服务器。3.拥有WEB管理页面方便我们的管理。

Haproxy的介绍暂不赘述,它的详细使用方法在这里

拓扑结构

                                    ====> server1
                                    |
data ====> Project V  ====> Haproxy ====> server2
                                    |
                                    ====> server3

Haproxy 配置

以下贴出简单的配置:

global
	ulimit-n 51200
	log /dev/log local0
	log /dev/log local1 notice
	chroot /var/lib/haproxy
	pidfile /var/run/haproxy.pid
	user haproxy
	group haproxy
	daemon

defaults

	log global
	mode tcp

	retries	3

	option	dontlognull
	option	redispatch

	timeout	connect 5s  #上游TCP服务器连接等待时间 
	timeout	client 24h
	timeout	server 24h

#以下为Web管理页面设置,如不需要可以删除

listen	admin_stats          
	bind 0.0.0.0:80
	mode http
	log 127.0.0.1 local0 err
	stats refresh 30s
	stats uri /haproxy
	stats realm welcome login\ Haproxy
	stats auth admin:admin
	stats hide-version
	stats admin if TRUE

#以上为Web管理页面设置,如不需要可以删除
	
frontend v2ray-in

	mode	tcp
	bind	0.0.0.0:7777 #Haproxy监听的端口
	default_backend v2ray

backend v2ray

	mode tcp
	option	tcp-check 
	balance roundrobin
#	balance leastconn

	server v2ray1 服务器1的IP:服务器1的端口 check inter 1000 
	server v2ray2 服务器2的IP:服务器2的端口 check inter 1000 	
        server v2ray3 服务器3的IP:服务器3的端口 check inter 1000 

Project V 配置

  • 如果你没有启用TLS,那么Project 的配置方法和第一种方法中介绍的一样。

  • 如果你启用了TLS,那么配置要做调整:只需申请一个 TLS 证书,然后把证书和密钥复制到所有的 VPS 并配置好 TLS,接着客户端配置里 address 填各个服务器的 IP,在 tlsSettings 的 serverName 填证书的域名。

启用了TLS后,Project V 的配置文件如下:

{
  "inbound": {
  ...
  },
  "outbound": {
    "protocol": "vmess",
    "settings": {
      "vnext": [
        {
          "address": "0.0.0.0", //Haproxy监听的地址
          "port": 7777,         //Haproxy监听的端口
          "users": [
            {
              "id": "1ce383ea-13e9-4939-9b1d-20d67135969a",
              "alterId": 64
            }
          ]
        }
      ]
    },
    "streamSettings": {
        "tlsSettings":{
                "serverName":"TLS证书对应的域名",
                "allowInsecure":true
        },

    ...
    }
  },
  ...
}

此时,Haproxy 配置中的,服务器端口应指定为443,即:

···
backend v2ray

	mode tcp
	option	tcp-check 
	balance roundrobin
#	balance leastconn

	server v2ray1 服务器1的IP:443 check inter 1000 
	server v2ray2 服务器2的IP:443 check inter 1000 	
        server v2ray3 服务器3的IP:443 check inter 1000
··· 

如此以来我们就成功借助Haproxy实现了负载均衡,并且可以除了简单轮询外还可以实现,加权,自动排除掉线服务器等功能。

写在最后

以上两种方法都已经介绍完毕,如果需要使用一些Haproxy的其他功能,可以参考参考文献列出的一些文章。

参考文献

Haproxy配置范例 Haproxy轮询方式介绍 自带负载均衡

使用 Nginx 对 Project V 做负载均衡

使用Caddy反向代理Project V

comments powered by Disqus