如何利用DNS和NGINX给服务器群配置负载均衡,巧妙榨干服务器群性能
-
什么是负载均衡? 当大量用户并发访问时,将请求转发到不同的机器止实现负载均衡。通常,負載平衡主要應用於Web網站,大型的Internet Relay Chat網路,高流量的檔案下載網站,NNTP(Network News Transfer Protocol)服務和DNS服務。
-
为什么要使用负载均衡? 网络的负载均衡是一种动态均衡技术,通过一些工具实时地分析数据包,掌握网络中的数据流量状况,把任务合理均衡地分配出去。这种技术扩展服务器带宽和增加服务器吞吐量,加强了网络数据处理能力,提高了网络的灵活性和可用性。也可以用作防止服务器宕机,或者拓展 DDOS 服务器的带宽抵抗防止 DDOS 攻击。
-
负载均衡的特征 负载均衡具有一系列特性,包括:不對稱負載調節,優先啟動,SSL截斷和加速,DDOS攻擊防護,HTTP壓縮,TCP offload,TCP緩衝,後台伺服器直接回應用戶,(伺服器)健康檢查,HTTP快取,內容過濾,HTTP安全,優先佇列,內容感知開關,用戶授權,可程式化的流量控制,防火牆功能,入侵阻止功能。
最近,在网上查看资料时偶然发现我的虚拟服务器使用的 NGINX 架构支持很多种负载均衡的方式。
Nginx 目前提供的常见负载均衡方法:( 其余众多策略, 详见 NGINX - ngx_http_upstream_module )
ngx_http_upstream_round_robin,加权轮询,可均分请求,是默认的HTTP负载均衡算法,集成在框架中。
ngx_http_upstream_ip_hash_module,IP哈希,可保持会话。
ngx_http_upstream_least_conn_module,最少连接数,可均分连接。
刚好手上有两台 VPS,一台是CN2 GT线路的所以用的比较少,基本处于吃灰状态。于是我一直想整合两台虚拟服务器。我设想可以通过 DNS 服务器的域名解析完成第一次的简单负载均衡,再由 NGINX 完成加权负载均衡。这样一来,所有访问 此域名 的流量就能够按照我的设计,分别使用两台服务器的流量,不仅增加了服务的稳定也防止服务器吃灰浪费。
DNS域名解析负载均衡有如下优点: 将负载均衡的工作交给DNS,省去了网站管理维护负载均衡服务器的麻烦。同时许多DNS还支持基于地理位置的域名解析,即会将域名解析成距离用户地理最近的一个服务器地址,这样就可以加速用户访问,改善性能。
1、DNS一级负载均衡
-
购买域名 我们首先购买一个域名(购买域名可以参考之前的文章 - 十家主流域名商的评测笔记),随后修改域名的记录(record)类型A,指向服务器的 IP。A记录指向 IPV4 的地址,AAAA 记录指向 IPV6 地址,根据服务器的 IP 决定填写记录的类型。 以下示范图片来源于 Porkbun 的解析记录添加过程。找不到在那可参考 porkbun - How do I edit DNS? 本文不赘述。
-
添加解析记录 写入 HOST 和 ANSWER。如下图,想带 www 的域名,e.g. www.dolorhunter.com 则应该在 HOST 中写入www。 注:比较传统的域名规则认为,加上 www 表示这是一个网页,但是这一观念因为技术的改变正在逐渐淡化。但是为了照顾不同用户的使用习惯,建议大家带 www 和不带 www 的记录都添加。
写入后可以看到下方的记录中显示了记录
- 测试解析 需要等待大约 3~15 分钟,域名就能够完成解析。完成解析后我们可以使用 DNS 工具 验证一下,看看是否已经解析成功了。
- 生成 SSL 证书 成功后可以使用 certbot 或 acme.sh 开始制作 Let’s Encrypt 证书。虽然 Porkbun 也提供免费的 Let’s Encrypt 证书,但是应该还是要从网站下载手动更新,不符合懒人的需求。关于如何使用这两个工具生成证书可以自行 Google 一下,目前自己玩的也不溜,因此还没有打算自己写一篇。 注意:生成证书的时候切记关闭NGINX的重定向(redirection),否则会导致生成证书失败。(一不小心连续失败了 5 次, 很悲伤的等了一个小时 Let’s Encrypt 才重新开始生成证书.)
如果有生成安全传输证书,且端口为 443,可以使用 Qualys - SSL Server Test 测试一下是否完成了多服务器的安全传输配置。
当然, DNS域名解析负载均衡也有一些缺点: 不能够按服务器的处理能力来分配负载。DNS负载均衡采用的是简单的轮询算法,不能区分服务器之间的差异,不能反映服务器当前运行状态,所以负载均衡效果并不是太好。 因此, 我们如果想进一步改善均衡效果, 可以采用二级负载均衡.
2、NGINX二级负载均衡 在查阅了 NGINX 的文档后,我决定先采用加权负载均衡的策略(Weighted load balancing),因为服务器的流量不同,因此我设置的加权值为服务器的流量大小。
- 配置加权负载均衡 我们在 NGINX 的配置中写入如下内容:
默認情況下,使用加權循環平衡方法在服務器之間分配請求。当前配置表示,每四次请求中的三次会被定向到srv1,剩余一次会被定向到srv2。upstream有众多策略, 详见 NGINX - ngx_http_upstream_module
upstream name { # name 可以随便填写,NGINX会自动配置proxy_pass
server srv1.example.com weight=3; # 也可以写IP地址 e.g. server 1.2.3.4;
server srv2.example.com; # 默认权值为1
server srv3.example.com backup; # 备用服务
}
注:如果之前没有用过 NGINX,可以在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/ 目录下创建 *.conf 文件写入以下内容。不建议直接修改 /etc/nginx/nginx.conf
- 测试配置并重启 写入后保存,测试一下配置是否正确
$ nginx -t
如果一切正常,重启 nginx 载入新配置
$ systemctl restart nginx
此时再打开 https://dolorhunter.com 就会加权访问服务器了。 在经过了一段时间后,我们可以在虚拟服务器的面板上看到两台服务器的流量存在负载均衡的特征。
3、负载均衡下的其他应用(*) 除了能够让网页访问的流量负载均衡,如果 VPS 上搭建了其他的网络应用,也可以享有负载均衡。但是务必保证每台机器的配置相同。
例如,我们使用 V2ray 代理的话,就可以在两台服务器上设置一样的配置信息(协议,TLS,UUID 和 alterID)。如何配置请参考:新白话 - WebSocket + TLS + Web
此时,客户端仅仅使用一套配置,就可以通过 DNS 服务器解析的一级均衡,平均的访问到多台VPS( DNS 解析发生在国内,因此通过 GFW 的实际上是 IP 地址而不是域名)考虑到当前客户端似乎都没有普及负载均衡,因此此配置适合此类用户。且一旦有端口或IP被阻断,由于负载均衡的特性,此时网络依然可用(直到服务器群内所有服务器被阻断)。因此,我们只需要保证不是所有的服务器都被阻断即可。使用 NGINX 作为二级负载均衡不能防止 GFW 封锁(树形结构只要封锁根节点就全部被封锁,网状结构似乎不能满足设计要求)。并且,如果两台服务器的线路和配置差距太大实际使用起来比较尴尬,会时快时慢的,因此建议至少使用类似的线路和配置保证使用体验。
不仅如此,可以通过注册一个域名专门用来使用 V2ray 的代理。只要保证服务器上 V2ray 配置相同,就可以把这些服务器的 IP 使用同一个域名进行解析。这样就可以在不影响服务器的其他用途的情况下,高鲁棒性的进行代理。理论上来说,当服务器的数量足够大时,透过 DNS 解析的均衡,应该是可以保证永不被封。
注: 如果 V2ray 无法使用由于安全性问题无法正常使用,只需要打开 TLS 的允许不安全连接(Insecure) 即可。此选项默认打开。
配置完成后可以打开 WizCase - What Is My IP 进行测试,重启代理后看看自己的 IP 会不会有变化。
参考资料: