Nginx负载配置
Nginx 负载均衡笔记
1. 概述
1.1 Nginx 简介
Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 以其高性能、稳定性、丰富的功能集、简单的配置文件以及低系统资源消耗而闻名。
1.2 负载均衡概述
负载均衡是一种将工作负载分摊到多个服务器上的技术,以提高网站、应用或数据库的性能和可靠性。负载均衡器可以在不同的网络层级实现,最常见的是第 4 层(传输层)和第 7 层(应用层)负载均衡。
2. 四层负载均衡(传输层)
2.1 工作原理
第 4 层负载均衡基于传输层协议(如 TCP 和 UDP)进行负载均衡。Nginx 作为第 4 层负载均衡器时,会基于 IP 地址和端口将请求分发到后端服务器。
2.2 特点
- 透明性: 第 4 层负载均衡器只处理网络层和传输层的数据包,不关心应用层的数据内容。
- 高效性: 因为不需要解析应用层数据包,处理速度快,性能高。
- 简单性: 配置较为简单,适用于不需要复杂应用层处理的场景。
2.3 优缺点
优点
- 高性能: 因为只处理传输层的数据包,Nginx 可以高效地转发请求。
- 广泛适用: 可以处理任何基于 TCP 或 UDP 的应用。
缺点
- 功能有限: 无法基于应用层内容(如 URL、头信息)进行负载均衡。
- 调试复杂: 因为透明性,难以对应用层问题进行调试。
2.4 示例场景
- TCP 负载均衡: 适用于需要将 TCP 流量分发到多个后端服务器的场景,如数据库连接池。
- UDP 负载均衡: 适用于需要将 UDP 流量分发到多个后端服务器的场景,如 DNS 请求。
3. 七层负载均衡(应用层)
3.1 工作原理
第 7 层负载均衡基于应用层协议(如 HTTP 和 HTTPS)进行负载均衡。Nginx 作为第 7 层负载均衡器时,会解析 HTTP 请求,并基于请求的内容(如 URL、头信息、Cookies)将请求分发到后端服务器。
3.2 特点
- 灵活性: 第 7 层负载均衡器可以基于应用层的任何信息进行复杂的负载均衡决策。
- 可见性: 可以解析并记录详细的请求信息,便于监控和调试。
- 安全性: 可以基于请求内容进行安全过滤和权限控制。
3.3 优缺点
优点
- 灵活性高: 可以基于 URL、头信息、Cookies 等进行复杂的负载均衡。
- 强大的功能: 支持 SSL 终结、缓存、压缩、请求重写等高级功能。
- 可扩展性: 易于扩展和集成其他应用层服务,如 WAF、认证等。
缺点
- 性能开销: 因为需要解析和处理应用层数据包,性能开销较大。
- 配置复杂: 需要更多的配置和管理工作,特别是在复杂的应用场景中。
3.4 示例场景
- HTTP 负载均衡: 适用于需要将 HTTP 请求分发到多个后端 Web 服务器的场景。
- HTTPS 负载均衡: 适用于需要处理 HTTPS 请求,并将其分发到多个后端服务器的场景。
- 基于 URL 的负载均衡: 适用于需要将不同路径的请求分发到不同服务器的场景。
- 基于 Cookies 的会话保持: 适用于需要基于用户会话将请求分发到同一服务器的场景。
4. Nginx 调度算法
4.1 轮询(Round Robin)
- 简介: 将请求依次分发给每个后端服务器,循环进行。
- 特点: 简单易用,适用于负载均衡较为均匀的场景。
4.2 最小连接数(Least Connections)
- 简介: 将请求分发给当前活动连接数最少的后端服务器。
- 特点: 适用于请求处理时间差异较大的场景。
4.3 IP 哈希(IP Hash)
- 简介: 基于客户端 IP 地址计算哈希值,将请求分发给对应的后端服务器。
- 特点: 适用于需要会话保持的场景,确保同一客户端的请求始终分发到同一服务器。
4.4 加权轮询(Weighted Round Robin)
- 简介: 根据服务器的权重进行轮询,权重高的服务器分配更多的请求。
- 特点: 适用于后端服务器性能不一致的场景。
5. 四层负载配置示例
需求:使用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 |
5.1 安装并启动数据库
[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
5.2 开启root远程连接权限
如果不开启远程连接权限的话,是不能够连接上数据库的,此时的数据库只能够本地进行使用,所以我们需要开启远程权限
[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)
5.3 配置Nginx
[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;
}
}
配置解释:
- 一定要在/etc/nginx/nginx.conf里面加入这一段配置,如果在
conf.d目录下写的话会报错的,因为这个是四层负载,而你将配置写在conf.d下的话他是会被加载到http段落里面去的,http属于7层,所以他会报错 - upstream db :表示定义一个后端服务器组,这个组的名字叫做db,在这个段落里面使用server来指定主机和端口
- server段落:这里就是配置虚拟主机,监听8888端口
5.4 重启nginx并测试
[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监听的端口
6. 七层负载配置示例
四层的负载是需要定义在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服务,只提供对后端的负载
6.1 配置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的负载均衡
6.2 配置负载均衡
[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;
}
}
6.3 重启nginx并测试
[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
Nginx负载配置的更多相关文章
- Nginx 负载配置
简版的,详细参数需要自己微调. nginx.conf http{ upstream name { server 127.0.0.1:8777; server 127.0.0.1:8778; serve ...
- Nginx负载均衡的详细配置及使用案例详解.
感谢看过这一些列博文和评论的小伙伴, 我把自己所看到的学到的拿到这里来分享是想和大家一起学习进步, 想听听园友给出的意见, 也是对自己学习过程的一个总结. 技术无止境, 我们仍需努力! 1,话不多说, ...
- 从零开始学 Java - CentOS 下 Nginx + Tomcat 配置负载均衡
为什么现在有非常多的聪明人都在致力于互联网? 最近在读埃隆·马斯克传记,他说「我认为现在有非常多的聪明人都在致力于互联网」. 仔细一想,好像真的是这样的. 我问了自己一个问题:如果你不敲代码了,你能做 ...
- nginx + tomcat配置负载均衡
目标:Nginx做为HttpServer,连接多个tomcat应用实例,进行负载均衡. 注:本例程以一台机器为例子,即同一台机器上装一个nginx和2个Tomcat且安装了JDK1.7. 1.安装Ng ...
- 配置nginx负载均衡
配置nginx负载均衡 执行命令:vi /usr/local/nginx/sbin/nginx/conf/nginx.conf 修改为: worker_processes 2; events { ...
- centos+nginx从零开始配置负载均衡
nginx负载均衡的理解 nginx是一个轻量级的.高性能的webserver,他主要可以干下面两件事: 作为http服务器(和apache的效果一样) 作为反向代理服务器实现负载均衡 现在nginx ...
- 图文解说:Nginx+tomcat配置集群负载均衡
图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用 作者:niumd Blog:http://ari.iteye ...
- Keepalived+Nginx+Tomcat配置高可用负载均衡系统示例
前言 此示例为keepalived+nginx+tomcat的基础配置示例,某些特定配置此例中不会出现,在示例中会用到三个虚拟机:两个纯命令行用于模拟服务端配置,一个带桌面环境的用于模拟客户端访问,这 ...
- Tomcat集群,Nginx集群,Tomcat+Nginx 负载均衡配置,Tomcat+Nginx集群
Tomcat集群,Nginx集群,Tomcat+Nginx 负载均衡配置,Tomcat+Nginx集群 >>>>>>>>>>>> ...
- [项目构建 十三]babasport Nginx负载均衡的详细配置及使用案例详解.
在这里再次说明下, 这个项目是从网上 找到的一套学习资料, 自己在 空闲时间学习了这些东西. 这里面的code当然会有很多不完善的地方, 但是确实也能学到很多新东西.感谢看过这一些列博文和评论的小伙伴 ...
随机推荐
- 安装assimp失败
使用Cmake和Visual Studio编译assimp成功(包括Debug和Release),并且安装Release版本也成功,但安装debug版本失败,安装输出信息如下: 通过提示找到脚本文件, ...
- three.js教程4-Group层级模型
1.组对象Group.层级模型-形成树状结构 //创建两个网格模型mesh1.mesh2 const geometry = new THREE.BoxGeometry(20, 20, 20); con ...
- 使用自定义lua解析管理器调用lua脚本中的table
[5] 使用自定义lua解析管理器调用table 访问数组类型的table CallLuaEntrance测试脚本中内容: //------------------------------------ ...
- 基本base样式
/* 去除常见标签默认的 margin 和 padding */ body, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, input { ma ...
- next-元数据创建、更新 SEO 优化
在创建Next.js项目时,根页面会自动生成一个metadata对象,其中包含标题和描述等关键信息.每当页面被访问时,这个metadata对象会被读取并应用到HTML的默认配置中,确保页面的基本信息得 ...
- PyQt5 GUI编程(组件使用)
一.简介 PyQt5 是一个用于创建图形用户界面(GUI)应用程序的 Python 绑定,它基于 Qt 库.PyQt5 提供了大量的组件(也称为控件或部件),用于构建复杂的用户界面.以下是一些常用的 ...
- 热更学习笔记10~11----lua调用C#中的List和Dictionary、拓展类中的方法
[10]Lua脚本调用C#中的List和Dictionary 调用还是在上文中使用的C#脚本中Student类: lua脚本: print("------------访问使用C#脚本中的Li ...
- C#.Net筑基-类型系统②常见类型
01.结构体类型Struct 结构体 struct 是一种用户自定义的值类型,常用于定义一些简单(轻量)的数据结构.对于一些局部使用的数据结构,优先使用结构体,效率要高很多. 可以有构造函数,也可以没 ...
- Windows下生成RSA公钥和私钥
打开E:\MAMP\bin\apache(服务器安装文件目录)文件夹下的 bin 文件夹,执行 openssl.exe 文件 生成 RSA 私钥,出现图中提示说明生成成功 genrsa -out rs ...
- 记一次U8的插件开发
在u8上开发一个winform的插件用来实现不同账套之间的单据协同,使用的方法是用存储过程走数据库.因为原账套的数据量会很大,如果直接在插件上用单线程传输,那肯定会造成传输过程,u8卡死的.一种方法是 ...