• nginx七层负载均衡配置


    目录

    一、负载均衡介绍

    1)四层负载均衡

    2)七层负载均衡

    3)四层与七层区别

    二、nginx下载安装

    1、下载nginx源码包

    2、安装并启用

    三、nginx七层负载均衡配置

    real server设置:

    nginx配置:

    客户端设置:

    测试:

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

    1.下载扩展包

    2.编译前做一些优化:

    3.重新编译

    测试:


    一、负载均衡介绍

    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/

    1. [root@server1 ~]# wget http://nginx.org/download/nginx-1.20.2.tar.gz
    2. [root@server1 ~]# ls
    3. nginx-1.20.2.tar.gz
    4. [root@server1 ~]# tar -zxf nginx-1.20.2.tar.gz
    5. [root@server1 ~]# ls
    6. nginx-1.20.2 nginx-1.20.2.tar.gz

    2、安装并启用

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

    解决:

    yum install -y gcc

    继续编译

     解决:

     yum install -y pcre-devel 

    编译成功

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

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

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

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

    检测语法正确后启动nginx

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

     访问http://172.25.254.1

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

    三、nginx七层负载均衡配置

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

    real server设置:

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

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

    nginx配置:

    补:

    可以加权重

    也可以更换负载均衡算法

    如要升级real server,手动下线

    自己写一个模块:

     

     修改配置文件后:

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

    客户端设置:

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

    测试:

    1. [root@westos_student72 westos]# curl www.westos.org
    2. server2
    3. [root@westos_student72 westos]# curl www.westos.org
    4. server3
    5. [root@westos_student72 westos]# curl www.westos.org
    6. server2
    7. [root@westos_student72 westos]# curl www.westos.org
    8. server3
    9. [root@westos_student72 westos]# curl www.westos.org
    10. server2
    11. [root@westos_student72 westos]# curl www.westos.org
    12. server3

    关闭server2的httpd服务:

    1. [root@westos_student72 westos]# for i in {1..10}; do curl www.westos.org;done
    2. server3
    3. server3
    4. server3
    5. server3
    6. server3
    7. server3
    8. server3
    9. server3
    10. server3
    11. server3

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

    若此时再把server3挂掉:

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

     四、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 Plus才有,此时我们就要先扩充一下我们的调度算法:加上sticky模块重新编译。

    1.下载扩展包

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

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

    2.编译前做一些优化:

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

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

    2、关闭版本显示

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

    3.重新编译

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

    1. [root@server1 nginx-1.20.2]# cd nginx-1.20.2
    2. [root@server1 nginx-1.20.2]# nginx -s stop ##编译前停掉nginx
    3. [root@server1 nginx-1.20.2]# make clean ##清除原来编译的内容
    4. [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

    编译make

    [root@server1 nginx-1.20.2]# make

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

    覆盖原二进制程序

    1. [root@server5 nginx-1.20.2]# cd objs/
    2. [root@server5 objs]# ls
    3. [root@server5 objs]# du -h nginx
    4. [root@server5 objs]# cp nginx /usr/local/nginx/sbin/
    5. cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y
    6. [root@server5 objs]# cd /usr/local/nginx/sbin/
    7. [root@server5 sbin]# ls
    8. nginx
    9. [root@server5 sbin]# du -h nginx
    10. 936K nginx

    测试:

    此时nginx就有了sticky的cookie功能

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

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

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

  • 相关阅读:
    quarkus依赖注入之二:bean的作用域
    hexo建站新手入门
    使用SpringBoot优雅的实现文件上传
    javase_io_异常_回顾
    设备树基本原理与操作方法
    数组中的逆序对
    C++(Qt)软件调试---GCC编译参数学习-程序检测(13)
    来自领导的指点--1 : 小程序和H5 代理问题
    Spring Security认证绕过漏洞(CVE-2022-22978)研究与防护手段
    设计人工智能产品:技术可能性、用户合意性、商业可行性
  • 原文地址:https://blog.csdn.net/qq_52015311/article/details/125607154