nginx七层负载均衡配置详解


Posted in Servers onJuly 15, 2022

一、负载均衡介绍

1)四层负载均衡

所谓四层就是基于IP+端口的负载均衡

四层负载均衡,是指OSI七层模型中的传输层,传输层已经支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载。

2)七层负载均衡

七层是基于URL等应用层信息的负载均衡

七层负载均衡是在应用层,它可以完成很多应用方面的协议请求

3)四层与七层区别

        四层负载均衡数据在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发,七层负载均衡效率没有四层负载均衡高。

         四层负载均衡可以用来解决七层负载均衡端口限制问题(七层负载均衡最大使用65535个端口号)

        但是四层不支持协议的转发(http,https,DNS等)只支持IP,不识别域名。

        七层负载均衡更贴近于服务,如HTTP协议就是七层协议

        支持很多功能,比如支持http信息的改写、头部信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等一些规则,在应用层的服务里面可以做的内容更多。

二、nginx下载安装

1、下载nginx源码包

nginx网站域名:http://nginx.org/

nginx七层负载均衡配置详解

[root@server1 ~]# wget http://nginx.org/download/nginx-1.20.2.tar.gz
 
[root@server1 ~]# ls
nginx-1.20.2.tar.gz
 
[root@server1 ~]# tar -zxf nginx-1.20.2.tar.gz 
[root@server1 ~]# ls
nginx-1.20.2  nginx-1.20.2.tar.gz

2、安装并启用

[root@server1 ~]# cd nginx-1.20.2
[root@server1 nginx-1.20.2]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
 
[root@server1 nginx-1.20.2]# ./configure --help #可以看到可用参数
 
[root@server1 nginx-1.20.2]# ./configure --with-http_ssl_module --with-http_stub_status_module  --prefix=/usr/local/nginx
【注:此命令是安装一些模块,此命令必须在nginx源码目录下执行】

nginx七层负载均衡配置详解

nginx七层负载均衡配置详解

nginx七层负载均衡配置详解

解决:

yum install -y gcc

继续编译

nginx七层负载均衡配置详解

解决:

yum install -y pcre-devel

nginx七层负载均衡配置详解

编译成功

nginx七层负载均衡配置详解

此时生成了文件Makefile,此文件会指导我们进行make(将源码编译成本系统可以用的可执行程序)

nginx七层负载均衡配置详解

make完成后,会在该目录下的objs/nginx下生成nginx执行程序,再进行make install 

nginx七层负载均衡配置详解

完成后所有编译好的nginx程序都在指定的路径 /usr/local/nginx下,做一个软连接链接到/usr/local/bin下

[root@server1 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/  ##建立软连接
[root@server1 ~]# which nginx
/usr/local/bin/nginx

检测语法正确后启动nginx

[root@server1 ~]# /usr/local/nginx/sbin/nginx -t   ##查看语法是否有误
[root@server1 ~]# nginx                            ##启动nginx
[root@server1 ~]# nginx -s reload                  ##重新加载nginx
[root@server1 ~]# nginx -s stop                    ##停掉nginx

nginx七层负载均衡配置详解

访问http://172.25.254.1

nginx七层负载均衡配置详解

注意:不能多次启动nginx,每次启动完成后要用nginx -s stop 关闭nginx,因为80端口不能被多次占用

三、nginx七层负载均衡配置

/usr/local/bin/nginx/nginx.conf 为nginx的主配置文件

real server设置:

开启server2、server3虚拟机做负载均衡后端服务器

[root@server2 ~]# systemctl start httpd
echo server2 > /var/www/html/index.html
[root@server3 ~]# systemctl start httpd
echo server3 > /var/www/html/index.html

nginx配置:

nginx七层负载均衡配置详解

补:

可以加权重

nginx七层负载均衡配置详解

也可以更换负载均衡算法

nginx七层负载均衡配置详解

如要升级real server,手动下线

nginx七层负载均衡配置详解

自己写一个模块:

nginx七层负载均衡配置详解

修改配置文件后:

[root@server1 ~]# nginx -t
[root@server2 ~]# nginx -s reload

客户端设置:

[root@westos_student72 westos]# vim /etc/hosts
172.25.254.1 server1  www.westos.org

测试:

[root@westos_student72 westos]# curl www.westos.org
server2
[root@westos_student72 westos]# curl www.westos.org
server3
[root@westos_student72 westos]# curl www.westos.org
server2
[root@westos_student72 westos]# curl www.westos.org
server3
[root@westos_student72 westos]# curl www.westos.org
server2
[root@westos_student72 westos]# curl www.westos.org
server3

关闭server2的httpd服务:

[root@westos_student72 westos]# for i in {1..10}; do curl www.westos.org;done
server3
server3
server3
server3
server3
server3
server3
server3
server3
server3

nginx不再对server2进行调度,说明nginx对后端自带健康检测。

若此时再把server3挂掉:

nginx七层负载均衡配置详解

系统报错,没有可用后端 ,此时我们可以这样设置:

nginx七层负载均衡配置详解

四、nginx扩充调度算法(sticky)

ip_hash调度算法比较符合客户使用习惯,算法为了保证连接稳定根据客户端ip进行负载均衡,相同客户端IP访问时,会访问到同一服务端,一个sever对一个IP。

ip_hash算法缺陷在于:客户端发送请求到nginx服务器,再由nginx服务器到后端RS,后端RS再返回到nginx服务器再返回客户端,所以后端RS不知道是谁访问了自己。

改进:可以用Sticky cookie来实现,类似于浏览器的cookie。客户端发送请求时,后端RS返回信息时会将session信息传回客户端,客户端存到浏览器中,这是RS分配给每一个客户端的,以后每次请求RS就通过这个cookie来判断是哪个客户端。

nginx七层负载均衡配置详解

开源文档中显示此功能只有Nginx Plus才有,此时我们就要先扩充一下我们的调度算法:加上sticky模块重新编译。

1.下载扩展包

扩展包名字:nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip

下载扩展包,安装解压工具并解压

nginx七层负载均衡配置详解

2.编译前做一些优化:

1、关闭gcc的debug模式,这样编译出的二进制程序会更小

[root@server1 nginx-1.20.2]# vim auto/cc/gcc

nginx七层负载均衡配置详解

2、关闭版本显示

[root@server1 nginx-1.20.2]# vim src/core/nginx.h

nginx七层负载均衡配置详解

3.重新编译

由于nginx是静态编译,所以每次增加新功能时都需要重新编译,而且要加载之前的所有参数

[root@server1 nginx-1.20.2]# cd nginx-1.20.2
[root@server1 nginx-1.20.2]# nginx -s stop ##编译前停掉nginx
[root@server1 nginx-1.20.2]# make clean  ##清除原来编译的内容
 
[root@server1 nginx-1.20.2]# ./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42

nginx七层负载均衡配置详解

编译make

[root@server1 nginx-1.20.2]# make

注意不要进行make install安装,因为软件已经安装过,现在直是去更新,执行make install 会进行覆盖安装

覆盖原二进制程序

[root@server5 nginx-1.20.2]# cd objs/
[root@server5 objs]# ls
[root@server5 objs]# du -h nginx
[root@server5 objs]# cp nginx /usr/local/nginx/sbin/
cp: overwrite ‘/usr/local/nginx/sbin/nginx'? y
[root@server5 objs]# cd /usr/local/nginx/sbin/
[root@server5 sbin]# ls
nginx
[root@server5 sbin]# du -h nginx 
936K	nginx

测试:

此时nginx就有了sticky的cookie功能

nginx七层负载均衡配置详解

  检测语法没问题后启动nginx:

nginx七层负载均衡配置详解

 用浏览器访问才能看见效果,因为cookie只能存在于浏览器

nginx七层负载均衡配置详解

nginx七层负载均衡配置详解

此时我们发现用浏览器访问只能访问到server2,而用curl压测是负载均衡的。因为浏览器缓存了cookie值,cookie值不变,后端响应的RS也不会变。

到此这篇关于nginx七层负载均衡配置详解的文章就介绍到这了,更多相关nginx 七层负载均衡 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Servers 相关文章推荐
浅谈Nginx 中的两种限流方式
Mar 31 Servers
详解Nginx 工作原理
Mar 31 Servers
详解nginx.conf 中 root 目录设置问题
Apr 01 Servers
nginx限制并发连接请求数的方法
Apr 01 Servers
图文详解Nginx版本平滑升级方案
Sep 15 Servers
Apache Pulsar集群搭建部署详细过程
Feb 12 Servers
nginx刷新页面出现404解决方案(亲测有效)
Mar 18 Servers
Nginx+Tomcat负载均衡多实例详解
Apr 11 Servers
Windows和Linux上部署Golang并运行程序
Apr 22 Servers
Tomcat弱口令复现及利用
May 06 Servers
Linux中文件的基本属性介绍
Jun 01 Servers
git中cherry-pick命令的使用教程
Jun 25 Servers
Linux安装Docker详细教程
Jul 07 #Servers
Docker安装MySql8并远程访问的实现
Jul 07 #Servers
Docker部署Mysql8的实现步骤
Jul 07 #Servers
教你nginx跳转配置的四种方式
kubernetes集群搭建Zabbix监控平台的详细过程
GPU服务器的多用户配置方法
Jul 07 #Servers
如何让你的Nginx支持分布式追踪详解
You might like
PHP函数常用用法小结
2010/02/08 PHP
php的sso单点登录实现方法
2015/01/08 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
Python中函数的用法实例教程
2014/09/08 Python
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
python几种常用功能实现代码实例
2019/12/25 Python
django中related_name的用法说明
2020/05/20 Python
Python包和模块的分发详细介绍
2020/06/19 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
Ibatis的核心配置文件都有什么
2014/09/08 面试题
C/C++有关内存的思考题
2015/12/04 面试题
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
师范应届生教师求职信
2013/11/05 职场文书
业务经理的岗位职责
2013/11/16 职场文书
在校学生职业规划范文
2014/01/08 职场文书
个人买房协议书范本
2014/10/06 职场文书
班主任先进事迹材料
2014/12/17 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
React配置子路由的实现
2021/06/03 Javascript