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

img

主机名/服务 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目录下面

img

主机名 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、后端服务器的配置

  • 比如给后端服务器设置备份,等等

8、总结

posted @ 2025-11-22 20:44  乔的港口  阅读(1)  评论(0)    收藏  举报