nginx实现负载均衡
nginx负载均衡
1、概述
1、nginx简介
Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 以其高性能、稳定性、丰富的功能集、简单的配置文件以及低系统资源消耗而闻名
2、负载均衡
就是将请求平均的转发到后端服务器上,以提高网站、应用或数据库的性能和可靠性。负载均衡器可以在不同的网络层级实现,最常见的是第 4 层(传输层)和第 7 层(应用层)负载均衡。
2、四层负载均衡(传输层)
1、工作原理
第4层负载均衡基于传输层协议(tcp和udp)进行负载均衡,nginx作为第4层的负载均衡器时,会基于ip地址和端口将请求分发到后端服务器
2、特点
-
透明性:第 4 层负载均衡器只处理网络层和传输层的数据包,不关心应用层的数据内容。
-
高效性:因为不需要解析应用层数据包,处理速度快,性能高。
-
简单性:配置较为简单,适用于不需要复杂应用层处理的场景。
3、优缺点
-
优点:
-
高性能: 因为只处理传输层的数据包,Nginx 可以高效地转发请求。
-
广泛适用: 可以处理任何基于 TCP 或 UDP 的应用。
-
-
缺点:
-
功能有限: 无法基于应用层内容(如 URL、头信息)进行负载均衡。
-
调试复杂: 因为透明性,难以对应用层问题进行调试。
-
-
示例场景
-
TCP 负载均衡: 适用于需要将 TCP 流量分发到多个后端服务器的场景,如数据库连接池。
-
UDP 负载均衡: 适用于需要将 UDP 流量分发到多个后端服务器的场景,如 DNS 请求。
-
3、七层负载均衡(应用层)
1、工作原理
第 7 层负载均衡基于应用层协议(如 HTTP 和 HTTPS)进行负载均衡。Nginx 作为第 7 层负载均衡器时,会解析 HTTP 请求,并基于请求的内容(如 URL、头信息、Cookies)将请求分发到后端服务器。
2、特点
-
灵活性: 第 7 层负载均衡器可以基于应用层的任何信息进行复杂的负载均衡决策。
-
可见性: 可以解析并记录详细的请求信息,便于监控和调试。
-
安全性: 可以基于请求内容进行安全过滤和权限控制。
3、优缺点
-
优点
-
灵活性高: 可以基于 URL、头信息、Cookies 等进行复杂的负载均衡。
-
强大的功能: 支持 SSL 终结、缓存、压缩、请求重写等高级功能。
-
可扩展性: 易于扩展和集成其他应用层服务,如 WAF、认证等。
-
-
缺点
-
性能开销: 因为需要解析和处理应用层数据包,性能开销较大。
-
配置复杂: 需要更多的配置和管理工作,特别是在复杂的应用场景中。
-
4、nginx调度算法
1、轮询(Round Robin)
-
将请求依次分发给每个后端服务器,循环进行
-
每个服务器都能收到一个请求
-
适用场景 适用于负载均衡的较为均衡的场景
2、最小连接数(Least Connections)
-
将请求分发给当前连接数最少的服务器
-
选择用最空闲的服务器来处理请求
-
适用场景 服务器处理时间差异较大的场景
3、加权轮询(Weighted Round Robin)
-
根据服务器权重进行轮询,权重高的服务器分配更多的请求
-
就是服务器的性能最好的,配置最高的服务器,接收大量的请求
-
适用场景 适用于服务器性能差异较大的场景
4、ip哈希(ip hash)
-
基于客户端ip地址计算哈希值,将请求分发给对应的后端服务器
-
适用于需要会话保持的场景,确保同一客户端的请求始终分发到同一服务器
5、四层负载均衡案例
需求:使用nginx监听7777端口,后端服务器为mysql,mysql为主从,客户端将访问nginx提供的7777端口连接mysql

| 主机名/服务 | ip | 端口 |
|---|---|---|
| nginx服务器 | 192.168.101 | 7777 |
| mysql01 | 192.168.50.21 | 3306 |
| mysql02 | 192.168.50.22 | 3306 |
1、安装并启动数据库
- 后端2个服务器安装,并初始化数据库
yum -y install mariadb-server
systemctl enable mariadb --now
# 初始化数据库
mysql_secure_installation
2、开启roo远程连接权限
- 如果不开启远程连接的话,是不能连接上数据库的,只能在本地上使用,需要开启远程权限
# 登录到数据库里面
mysql -uroot -p123
# 允许用户从任意地址连接数据库,授予所有权限
MariaDB [(none)]> grant all privileges on *.* to 'root'@'%' identified by '123';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> SELECT user, host FROM mysql.user;
+-------------+-----------+
| User | Host |
+-------------+-----------+
| root | % |
| mariadb.sys | localhost |
| mysql | localhost |
| root | localhost |
+-------------+-----------+
4 rows in set (0.001 sec)
# 刷新权限
flush privileges;
3、配置nginx
vim nginx.conf
# 在末尾配置
stream {
upstream db { # 定义后端服务器组为db
server 192.168.50.21:3306;
server 192.168.50.22:3306;
}
server { # 定义虚拟主机,监听的端口为7777
listen 7777;
proxy_pass db; # 代理到db服务器组上
}
}
-
一定要在主配置文件上修改,在conf.d里面配置的话,会报错,stream块与http块是同级的,写在conf.d目录下面,nginx启动的时候,读取配置文件,会被加载到http块里面去的
-
这个是一个四层负载,http中是属于7层的
4、重启nginx并测试
systemctl restart nginx
# 连接数据库
[root@lvs nginx]# mysql -uroot -p123 -h 192.168.50.101 -P 7777
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 18
Server version: 10.5.29-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
5、实现ssh端口转发
stream {
upstream ssh {
server 192.168.50.21:22;
}
server {
listen 7777;
proxy_pass ssh;
}
}
[C:\~]$ ssh root@192.168.50.101 7777
# 登录到192.168.50.21机器上面了
6、七层负载均衡配置案例
- 七层的负载均衡是需要定义http段落中,可以写在conf.d目录下面

| 主机名 | ip |
|---|---|
| nginx负载均衡 | 192.168.50.101 |
| 后端服务器a | 192.168.50.21 |
| 后端服务器b | 192.168.50.22 |
1、配置web服务器
[root@node1 ~]# echo "nginx01" > /usr/share/nginx/html/index.html
[root@node1 ~]# systemctl restart nginx
[root@node2 ~]# echo "nginx2" > /usr/share/nginx/html/index.html
[root@node2 ~]# systemctl restart nginx
2、配置负载均衡
[root@lvs conf.d]# cat load.conf
# 定义后端服务器
upstream webserver {
server 192.168.50.21:80;
server 192.168.50.22:80;
}
server {
listen 80;
location / {
proxy_pass http://webserver/;
}
}
3、重启nginx并测试
[root@lvs conf.d]# systemctl restart nginx
[C:\~]$ curl 192.168.50.101 -s
nginx01
[C:\~]$ curl 192.168.50.101 -s
nginx2
7、后端服务器的配置
- 比如给后端服务器设置备份,等等

浙公网安备 33010602011771号