基于 Nginx 实现的负载均衡
负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。
如果手上没有足够数量的公网云服务器,本地使用虚拟机环境搭建集群做负载均衡测试是最省钱的做法,也方便做快照恢复。
一、准备工作
我使用 VMware 在本地部署了 3 台 CentOS 服务器作为测试环境,统一安装宝塔编译环境(LNMP)。虚拟机的网络配置不是本文的重点,就不再赘述了。
二、检查环境
这 3 台 CentOS 服务器编译好环境之后分别添加一个网站,检查 web 服务是否正常,并修改其中 2 台的默认模板文件,方便在测试负载均衡效果时区分是哪台服务器提供的 web 服务。
本次测试的三台服务器 IP 地址分别为
192.168.150.10(负载均衡 主服务器) 192.168.150.20(业务服务器) 192.168.150.30(业务服务器)
三、部署网站
测试域名为 t10.com,因此需要在宿主机上将此域名解析到负载均衡主服务器(192.168.150.10)。
修改宿主机的 hosts 文件(路径:C:\Windows\System32\drivers\etc\hosts),添加以下内容。
192.168.150.10 t10.com
分别在三台服务器上添加网站后,将 t10.com 这个域名解析到网站上。
如下图示例
在负载均衡主服务器的 server 语法块下,也就是网关的配置文件中加入一条转发规则
location / {
# 转发至负载均衡服务器
proxy_pass http://fzjh;
proxy_connect_timeout 2s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
在负载均衡主服务器的 nginx 配置文件的 http 语法块下(与 server 同级别)加入规则
upstream fzjh {
# least_conn;
# ip_hash;
server 192.168.150.20:80 weight=1;
server 192.168.150.30:80 weight=1;
# server 192.168.150.30:80 backup;
}
保存配置文件后重启 nginx,此时访问 t10.com 时会自动分发至两台业务服务器(192.168.150.20、192.168.150.30)。
四、常用的 nginx 负载均衡算法
1、轮询(默认)
轮询即 Round Robin,根据 Nginx 配置文件中的顺序,依次把客户端的 Web 请求分发到不同的后端服务器。
http{
upstream sampleapp {
server ...;
server ...;
}
....
server{
listen 80;
...
location / {
proxy_pass http://sampleapp;
}
}
2、least_conn(最少连接)
Web 请求会被转发到连接数最少的服务器上。
http{
upstream sampleapp {
least_conn;
server ...;
server ...;
}
....
server{
listen 80;
...
location / {
proxy_pass http://sampleapp;
}
}
3、ip_hash(IP 地址哈希)
前述的两种负载均衡方案中,同一客户端连续的 Web 请求可能会被分发到不同的后端服务器进行处理,因此如果涉及到会话 Session,那么会话会比较复杂。常见的是基于数据库的会话持久化。要克服上面的难题,可以使用基于 IP 地址哈希的负载均衡方案。这样的话,同一客户端连续的 Web 请求都会被分发到同一服务器进行处理。
http{
upstream sampleapp {
ip_hash;
server ...;
server ...;
}
....
server{
listen 80;
...
location / {
proxy_pass http://sampleapp;
}
}
4、基于权重的负载均衡算法
基于权重的负载均衡即 Weighted Load Balancing,这种方式下,我们可以配置 Nginx 把请求更多地分发到高配置的后端服务器上,把相对较少的请求分发到低配服务器。
http{
upstream sampleapp {
server ... weight=1;
server ... weight=1;
}
....
server{
listen 80;
...
location / {
proxy_pass http://sampleapp;
}
}
- backup 即为备机,当所有业务服务器都宕机时,请求会自动转发至备机;
- 多台业务服务器的代码同步可以使用 rsync 解决。