Project V 负载均衡的两种方法

前言

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

利用 Project V 自带的负载均衡

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

但还是值得一试

拓扑结构

1
2
3
4
5
====> server1
|
data ====> Project V ====> server2
|
====> server3

Project V 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
"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的介绍暂不赘述,它的详细使用方法在这里

拓扑结构

1
2
3
4
5
====> server1
|
data ====> Project V ====> Haproxy ====> server2
|
====> server3

Haproxy 配置

以下贴出简单的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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 的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"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,即:

1
2
3
4
5
6
7
8
9
10
11
12
···
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轮询方式介绍
自带负载均衡