目录Nginx 负载均衡笔记1. 概述1.1 Nginx 简介1.2 负载均衡概述2. 四层负载均衡(传输层)2.1 工作原理2.2 特点2.3 优缺点优点缺点2.4 示例场景3. 七层负载均衡(应用层)3.1 工作原理3.2 特点3.3 优缺点优点缺点3.4 示例场景4. Nginx 调度算法4.
Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 以其高性能、稳定性、丰富的功能集、简单的配置文件以及低系统资源消耗而闻名。
负载均衡是一种将工作负载分摊到多个服务器上的技术,以提高网站、应用或数据库的性能和可靠性。负载均衡器可以在不同的网络层级实现,最常见的是第 4 层(传输层)和第 7 层(应用层)负载均衡。
第 4 层负载均衡基于传输层协议(如 TCP 和 UDP)进行负载均衡。Nginx 作为第 4 层负载均衡器时,会基于 IP 地址和端口将请求分发到后端服务器。
第 7 层负载均衡基于应用层协议(如 HTTP 和 HTTPS)进行负载均衡。Nginx 作为第 7 层负载均衡器时,会解析 HTTP 请求,并基于请求的内容(如 URL、头信息、Cookies)将请求分发到后端服务器。
需求:使用nginx监听8888端口,后端服务器均为MySQL,并且MySQL为主从模式,客户端将访问nginx提供的8888端口来连接MySQL
我这里只是模拟,所以数据库里面是空的,没有任何库,表
主机名/服务 | IP | 端口 |
---|---|---|
oe01 Nginx | 192.168.200.170 | 8888 |
oe02 Mysql01 | 192.168.200.171 | 3306 |
oe03 Mysql02 | 192.168.200.172 | 3306 |
[root@oe02~]# yum install mariadb-server -y
[root@oe03 ~]# yum install mariadb-server -y
[root@oe02 ~]# systemctl enable --now mariadb
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
[root@oe03 ~]# systemctl enable --now mariadb
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
# 初始化数据库
[root@oe02 ~]# mysql_secure_installation
[root@oe03 ~]# mysql_secure_installation
如果不开启远程连接权限的话,是不能够连接上数据库的,此时的数据库只能够本地进行使用,所以我们需要开启远程权限
[root@oe02 ~]# mysql -uroot -p123
MariaDB [(none)]> grant all privileges on *.* to 'root'@'123' identified by '123';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)
[root@oe03 ~]# mysql -uroot -p123
MariaDB [(none)]> grant all privileges on *.* to 'root'@'123' identified by '123';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)
[root@oe01 ~]# vim /etc/nginx/nginx.conf
# 在末尾加上这一段配置
stream {
upstream db {
server 192.168.200.171:3306;
server 192.168.200.172:3306;
}
server {
listen 8888;
proxy_pass db;
}
}
配置解释:
conf.d
目录下写的话会报错的,因为这个是四层负载,而你将配置写在
conf.d
下的话他是会被加载到http段落里面去的,http属于7层,所以他会报错
[root@oe01 ~]# systemctl restart nginx
现在我们使用客户端来连接mysql
[root@oe01 ~]# mysql -uroot -p123 -h 192.168.200.170 -P 8888
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.5.5-10.5.25-MariaDB MariaDB Server
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
客户端成功的连接上了数据库,并且使用的地址是Nginx的地址,端口也是Nginx监听的端口
四层的负载是需要定义在http段落以外的,而七层的负载就可以定义在http段落内了,也就是说我们可以将负载的配置文件单独写一个并放在
/etc/nginx/conf.d/
下
需求:使用nginx轮询的策略负载后端的web服务
主机名/服务 | IP |
---|---|
oe01 Nginx负载 | 192.168.200.170 |
oe02 Nginx01 | 192.168.200.171 |
oe03 Nginx02 | 192.168.200.172 |
从这个规划来,第一个nginx不提供web服务,只提供对后端的负载
# 安装nginx
[root@oe02 ~]# yum install nginx -y
[root@oe03 ~]# yum install nginx -y
# 启动nginx
[root@oe02 ~]# systemctl start nginx
[root@oe03 ~]# systemctl start nginx
# 编写index.html
[root@oe02 ~]# echo "hello nginx01" >/usr/share/nginx/html/index.html
[root@oe02 ~]# echo "hello nginx02" >/usr/share/nginx/html/index.html
我们的web服务器就配置好了,接下来配置Nginx的负载均衡
[root@oe01 ~]# cd /etc/nginx/conf.d/
[root@oe01 conf.d]# vim load.conf
upstream webserver {
server 192.168.200.171:80;
server 192.168.200.172:80;
}
server {
listen 80;
location / {
proxy_pass http://webserver;
}
}
[root@oe01 conf.d]# systemctl restart nginx
客户端测试
C:\Users\86156>curl 192.168.200.170
hello nginx01
C:\Users\86156>curl 192.168.200.170
hello nginx02
C:\Users\86156>curl 192.168.200.170
hello nginx01
C:\Users\86156>curl 192.168.200.170
hello nginx02