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获取IP地址都是127.0.0.1 的问题
Sep 25 Servers
Nginx反向代理学习实例教程
Oct 24 Servers
NGINX 权限控制文件预览和下载的实现原理
Jan 18 Servers
聊聊配置 Nginx 访问与错误日志的问题
May 25 Servers
利用Apache Common将java对象池化的问题
Jun 16 Servers
服务器SVN搭建图文安装过程
Jun 21 Servers
windows server2008 开启端口的实现方法
Jun 25 Servers
win7配置本地ftp服务器的图文教程
Aug 05 Servers
Windows Server 2016服务器用户管理及远程授权图文教程
Aug 14 Servers
Elasticsearch6.2服务器升配后的bug(避坑指南)
Sep 23 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+ajax实现文章自动保存的方法
2014/12/30 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
js下用eval生成JSON对象
2010/09/17 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
Vue.use源码分析
2017/04/22 Javascript
探讨Vue.js的组件和模板
2017/10/27 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
python二叉树遍历的实现方法
2013/11/21 Python
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
深入了解Python中pop和remove的使用方法
2018/01/09 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
Python Gluon参数和模块命名操作教程
2019/12/18 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
HTML5 解析规则分析
2009/08/14 HTML / CSS
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
工程业务员工作职责
2013/12/07 职场文书
出差报告格式模板
2014/11/06 职场文书
兵马俑导游词
2015/02/02 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB
python实现学员管理系统(面向对象版)
2022/06/05 Python