SS/SSR做负载均衡的两种方法

精品教程 2019-04-30 11 次浏览 0 条评论

ps:如果不能正常加载图片,请连上小飞机

负载均衡最大的作用就是0宕机,可以做到宕机秒切换。SS/SSR的PC客户端都有负载均衡的功能,而且还可以根据延迟进行负载均衡,但iOS端就有点蛋疼了,一直使用PotatsoLite的我有时候真的挺需要这个功能的。

这里介绍两种方法,第一种用HAProxy,第二种用Nginx。个人推荐用Nginx,因为HAProxy不支持UDP,如果是用来玩游戏,那就有点蛋疼了。而且有时候也确实需要用到UDP。

这里我准备了3台机器,一台用来做负载均衡服务器,另外两台跑SSR服务,实现功能:两台SSR机器如有某一台挂了,本地客户端可以自动切换并连接到正常运行的那一台。

这里补充一下,LEDE软路由是有这个HAProxy功能的,而且做SS/SSR负载均衡的话,建议HAProxy是搭建在本地,因为如果你搭建在服务器上,你跑HAProxy的那台机器挂了也就失去了负载均衡的意义。

两个前提条件:

1:所有的SS/SSR密码必须一致。

2:所有的SS/SSR加密方式必须一致。如果是SSR,那么协议/混淆也必须一致。

先安装:

yum -y install haproxy

将默认的配置文件做一个备份:

mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

新建一个配置文件:

nano /etc/haproxy/haproxy.cfg

写入下面的配置:

global
    chroot  /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    user    haproxy
    group   haproxy

defaults
    mode    tcp                         #服务器默认的工作模式
    balance roundrobin                  #服务器默认使用的均衡模式
    retries 3                           #三次连接失败表示服务器不可用
    maxconn 5000                        #最大连接数
    timeout connect 500ms               #连接超时
    timeout client  3s                  #客户端超时
    timeout server  3s                  #服务器超时

listen WebPanel
    mode    http                        #这里使用HTTP模式
    bind    0.0.0.0:50000               #WEB服务端口
    stats   refresh 5s                  #自动刷新时间
    stats   uri  /                      #WEB管理地址
    stats   auth imlala:lala.im         #账号密码
    stats   hide-version                #隐藏版本
    stats   admin if TRUE               #验证通过则赋予管理权

listen USA
    bind 0.0.0.0:50001                  #服务端口
    server usa1 1.2.3.4:55555 check inter 500 rise 2 fall 4 weight 100   #SS/SSR服务器地址与端口
    server usa2 2.2.3.4:55555 check inter 500 rise 2 fall 4 weight 50    #SS/SSR服务器地址与端口

listen JP
    bind 0.0.0.0:50002                  #服务端口
    server jp1 3.2.3.4:55555 check inter 500 rise 2 fall 4 weight 100   #SS/SSR服务器地址与端口
    server jp2 4.2.3.4:55555 check inter 500 rise 2 fall 4 weight 50    #SS/SSR服务器地址与端口

这里详细说一下这个配置里面的各项作用:

首先你需要将listen WebPanel段下的web管理员账户密码做一下修改。然后你就可以看到listen USA/JP这两段这里了。

一个listen代表一个服务,你可以把它分为多个组。现在假设你在美国有2台机器,日本有2台机器,那么就可以分成两组,组与组之间没有联系,HAProxy只会给在同一个组里面的机器做负载均衡。但这样我们得在HAProxy内起两个服务端口,一个端口用于美国,一个端口用于日本。如果你想将所有的机器都加在一个组里面也是可以的,这样就可以让4台机器做负载均衡。怎么选择看你自己。

server后面首先跟名字,名字随便起呗,自己能够区分就行。紧接着跟这台机器的公网IP+端口,端口也就是SS/SSR的端口。

check是检测的意思,这段配置很重要:

inter:单位毫秒,我配置的500,即500毫秒检测一次目标服务器。

rise2:设定健康状态检查中,某离线的服务器从离线状态转换至正常状态需要成功检查的次数,这里我设置的2次。

fall4:确认服务器从正常状态转换为不可用状态需要检查的次数,这里是4次。

weight:权重,值越大代表这台机器工作的机会越多,这里我们可以把一台线路较好的机器的权重设置高一些。

配置完成之后,务必关闭SELinux,否则我们无法使用systemd去正常运行HAProxy(这是一个坑):

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

启动HAProxy:

systemctl start haproxy
systemctl enable haproxy

这样HAProxy就配置好了,可以访问WEB面板确认服务器是否都在正常工作,如下图显示绿色就是正常:

本地客户端在配置的时候就填写这台HAProxy服务器的IP+服务端口。

因为我这边目前正在使用LEDE软路由,我的推荐是有LEDE那就直接在LEDE上面设置:

这样设置之后并没有完成,HAProxy甚至都不会运行,我们还需要添加一个节点:

之后把账号设置里面的节点改为刚才添加的,如果在上方多出一个“负载均衡”的检测就说明配置完成:

现在介绍Nginx的方法,还是先安装:

yum -y install nginx

然后在Nginx的主配置文件内写一个include,因为我们需要用到stream段,这个段和http段是平级的,不能内嵌到http段使用:

echo "include /etc/nginx/tcpconf.d/*.conf;" >> /etc/nginx/nginx.conf

创建一个存放配置文件的目录:

mkdir -p /etc/nginx/tcpconf.d

新建一个配置文件:

nano /etc/nginx/tcpconf.d/ssproxy.conf

写入如下配置:

stream {

    upstream imlala {
        server 1.2.3.4:55555 weight=7;
        server 2.2.3.4:55555 weight=3;
    }

    server {
	listen 50003;
        listen 50003 udp;
        proxy_pass imlala;
    }

}

这边我使用的是weight(权重)模式,可以去掉这两个设置让Nginx默认用于轮询模式。

最后我还看了一下Caddy,结果发现很可惜这个WEB服务器目前还不能够支持TCP/UDP的负载均衡,但可以实现中转的功能,并且配置也很简单,这里顺带记录一下。

首先在安装的时候得添加net插件:

curl https://getcaddy.com | bash -s personal net

然后新建配置文件:

nano /etc/caddy/Caddyfile

写入如下配置就能进行中转了:

proxy :50004 1.2.3.4:55555 {
}

proxy :50005 2.2.3.4:55555 {
}

注意,此时的Caddy启动时必须加上-type=net,插件功能才能生效:

caddy -type=net -conf=/etc/caddy/Caddyfile

Leave a Reply

Your email address will not be published. Required fields are marked *