使用 Nginx 对 Project V 做负载均衡

2018-03-01

前言

在之前的一篇文章中介绍了两种 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 有一个缺点: 那就是主动后端检测的功能需要付费版才能提供,免费版只有被动检测的功能。

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

拓扑结构

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

Nginx 配置

Nginx 的安装

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

配置文件

以下贴出主要的配置:

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

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 会选择当前活动连接数最少的服务器进行连接,设置如下:

upstream stream_backend {
    least_conn;
    server backend1.example.com:12345;
    server backend2.example.com:12345;
    server backend3.example.com:12346;
}

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

其他主要的配置介绍

proxy_timeout 10m

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

proxy_connect_timeout 5m

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

max_fails=3 fail_timeout=30s

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

weight=1

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

注意事项

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

  • 查看日志:

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

  • 查看进程:

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

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

@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 的配置文件如下:

{
  "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,即:

···
  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相关文档 自带负载均衡

树莓派linux

使用Caddy反向代理Project V (二)

Project V 负载均衡的两种方法

comments powered by Disqus