使用 Nginx 对 Project V 做负载均衡

前言

在之前的一篇文章中介绍了两种 Project V 的负载均衡的方式:1. 通过 Project V 自带的负载均衡 2. 通过 Haproxy。 今天来介绍第三种方式:Nginx

Nginx 简介

Nginx 是一款可以托管 Http 的软件,很多朋友使用 Nginx 来配合 PHP, Mysql 等来组成经典的’LENP’环境用于搭建网站。Nginx 除了简单的网页托管和反向代理的功能之外,还可以对 TCP 流量进行负载均衡,性能亦十分优秀。 Nginx 所支持的平台也十分全面,即使在 Windows 系统也可以找到官方提供的分发包;而 Windows 的用户若是想要使用 Haproxy 则不得不借助 cygwin 这一软件来提供类 Linux 环境来编译 Haproxy。

但 Nginx 有一个缺点: 那就是主动后端检测的功能需要付费版才能提供,免费版只有被动检测的功能。

不过,这并不妨碍我们试一试

拓扑结构

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

Nginx 配置

Nginx 的安装

Nginx 的安装过程不再赘述。需要注意的是如果你是 Windows 用户,去官网下载的时候不要下载成源码包(后缀是.tar.gz),应该下载后缀为.zip的压缩包,里面会有 Windows 的可执行文件。

配置文件

以下贴出主要的配置:

直接打开默认的配置文件nginx.conf, 键入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
worker_processes auto;
events {
worker_connections 1024;
}
stream{
server{
listen localhost:10000;
proxy_pass v2ray_backend;
proxy_timeout 10m;
proxy_connect_timeout 5000ms;
}
upstream v2ray_backend{
server 服务器1的IP:1的端口 max_fails=3 fail_timeout=30s weight=1;
server 服务器2的IP:1的端口 max_fails=3 fail_timeout=30s weight=1;
server 服务器3的IP:1的端口 max_fails=3 fail_timeout=30s weight=1;
server 服务器4的IP:1的端口 max_fails=3 fail_timeout=30s weight=1;
}
}

主要配置参数的解释

负载均衡主要的功能都在stream块中

负载均衡方式介绍

Nginx 支持三种负载均衡的方式:Round Robin(简单轮询),Least Connections(最少连接) 和 Least Time(最少时间)

· Round Robin 是默认的方式,不需要在配置文件中特意写出来,可根据权重在后端服务器中依次选择

· Least Connections 最少连接,Nginx 会选择当前活动连接数最少的服务器进行连接,设置如下:

1
2
3
4
5
6
upstream stream_backend {
least_conn;
server backend1.example.com:12345;
server backend2.example.com:12345;
server backend3.example.com:12346;
}

· Least Time 最少时间,这个是收费版才有的功能,可以选择当前平均延迟低并且活动连接最少的服务器。因为是收费功能所以不再赘述。

其他主要的配置介绍

1
proxy_timeout 10m

proxy_timeout表示成功与后端建立连接后的超时时间,一旦超过这个时间没有数据传送连接就会关闭。这里设置为10分钟

1
proxy_connect_timeout 5m

proxy_connect_timeout表示Nginx与后端服务器连接所需的延迟,根据 Nginx 所在的机器和后端服务器的延迟来设置。当然也可以设置的大一些,来容纳一些小幅度的网络波动

1
max_fails=3 fail_timeout=30s

这个就是被动检测的设置项了,它的意思是在30秒内如果连接失败或者超时3次,那么该服务器就被忽略30秒。看起来的确有些不智能,但是实测下来还是可以接受的。主动检测和 Haproxy 很相似,但是这个功能是付费版才有,在此不做讨论。

1
weight=1

和 Haproxy 相似,这个是权重的意思,不赘述。

注意事项

Unix类系统的用户可以方便的开启和关闭 Nginx,Windows的用户需要注意,软件开启后会有黑窗一闪而过,并不会有图形界面。要想知道是否正确运行的话有两种方便的方法:

  • 查看日志:

到软件的logs文件夹中查看日志,失败的话会有报错信息在里面

  • 查看进程:

打开任务管理器,成功的话里面会有名叫nginx的进程存在

另外 Windows 用户可以使用bat脚本来快速关闭Nginx,将以下内容保存成后缀为.bat的文件即可。需要关闭Nginx的时候直接双击它:

1
2
@echo off
tasklist|find /i "nginx.exe" && taskkill /im nginx.exe /f && taskkill /im cmd.exe || taskkill /im cmd.exe

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", //Nginx 监听的地址
"port": 10000, //Nginx 监听的端口
"users": [
{
"id": "1ce383ea-13e9-4939-9b1d-20d67135969a",
"alterId": 64
}
]
}
]
},
"streamSettings": {
"tlsSettings":{
"serverName":"TLS证书对应的域名",
"allowInsecure":true
},
...
}
},
...
}

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

1
2
3
4
5
6
7
8
···
upstream v2ray_backend{
server 服务器1的IP:443 max_fails=3 fail_timeout=30s weight=1;
server 服务器2的IP:443 max_fails=3 fail_timeout=30s weight=1;
server 服务器3的IP:443 max_fails=3 fail_timeout=30s weight=1;
server 服务器4的IP:443 max_fails=3 fail_timeout=30s weight=1;
}
···

如此以来我们就成功借助 Nginx 实现了负载均衡,实测下来效果也不错。

写在最后

使用 Nginx 负载均衡 Project V 的方法已经介绍完毕,如果需要使用一些 Nginx 的其他功能,可以参考参考文献列出的一些文章。 如果错误请不吝指正。

参考文献

Nginx相关文档
自带负载均衡