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 location优先级的深入讲解
Mar 31 Servers
扩展多台相同的Web服务器
Apr 01 Servers
教你快速构建一个基于nginx的web集群项目
Nov 27 Servers
Kubernetes控制节点的部署
Apr 01 Servers
Nginx配置根据url参数重定向
Apr 11 Servers
Windows Server 2016 配置 IIS 的详细步骤
Apr 28 Servers
项目中Nginx多级代理是如何获取客户端的真实IP地址
May 30 Servers
nginx设置资源请求目录的方式详解
May 30 Servers
使用Apache Camel表达REST服务的方法
Jun 10 Servers
windows server2008 开启端口的实现方法
Jun 25 Servers
Windows7下FTP搭建图文教程
Aug 05 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实现的下载远程文件类定义与用法示例
2017/07/05 PHP
PHP微信网页授权的配置文件操作分析
2019/05/29 PHP
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
2011/03/01 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
Vue响应式原理详解
2017/04/18 Javascript
解读ES6中class关键字
2017/11/20 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
vue使用自定义icon图标的方法
2018/05/14 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
React实现todolist功能
2020/12/28 Javascript
python fabric实现远程操作和部署示例
2014/03/25 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
python list转置和前后反转的例子
2019/08/26 Python
详解python tkinter模块安装过程
2020/01/06 Python
经理管理专业毕业自荐书范文
2014/02/12 职场文书
护士节策划方案
2014/05/19 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
离婚上诉状范文
2015/05/23 职场文书
工商行政处罚决定书
2015/06/24 职场文书
幼儿园小班教学反思
2016/03/03 职场文书