Nginx实现四层代理与七层代理

2023-10-28

目录

一、实验环境准备

1、准备三台服务器

2、安装nginx环境

3、启动nginx环境

二、设置Nginx七层代理

1、proxy代理服务器配置(轮询)

2、设置加权轮询

3、健康检测功能

4、解决重复登录问题(源地址哈希ip_hash)

三、设置Nginx四层代理


一、实验环境准备

1、准备三台服务器

web1、web2作为nginx集群2个节点,proxy服务器作为代理,负责调度来自客户端的请求,192.168.1.200模拟公网的对外IP,客户端访问proxy代理服务器192.168.1.200,然后转发给内部网站服务器。

主机清单
主机类型 主机名 主机IP 备注
nginx代理服务器 proxy

192.168.1.10(内部IP)

192.168.1.200(外部IP)

关闭selinux和firewalld
nginx web1网站服务器 web1 192.168.1.20(内部IP) 关闭selinux和firewalld
nginx web2网站服务器 web2 192.168.1.30(内部IP) 关闭selinux和firewalld

2、安装nginx环境

安装步骤参考:Nginx安装、升级与基础配置_桂安俊@kylinOS的博客-CSDN博客

注意:这里需要安装Nginx 1.9及以上版本,1.9及以上版本Nginx才支持四层路由TCP/UDP转发,并在编译安装时开启--with-stream模块

nginx下载地址:nginx: download

3、启动nginx环境

#三台服务器都执行
/usr/local/nginx/sbin/nginx

修改web1和web2主机的/usr/local/nginx/html/index.html,加以标识,以区分到时候测试的时候实际访问的是哪台服务器,比如我这边将index.html改为:

 

二、设置Nginx七层代理

目标:实现代理服务器对网站服务器进行轮询调度

1、proxy代理服务器配置(轮询)

#proxy服务器执行
vim /usr/local/nginx/conf/nginx.conf

新增或修改如下红色标识内容:

http {
    upstream servers {                    #定义源服务器组,servers为自定义组名
         server 192.168.1.20:80;    #组节点网站服务器web1 IP,80为web1 nginx默认端口
         server 192.168.1.30:80;    #组节点网站服务器web2 IP,80为web2 nginx默认端口
    }

    

    server {                                           #每一个server是一个虚拟主机
        listen       80;
        server_name  localhost;             #web主机名

       

        location / {
            proxy_pass http://servers;       #调用服务组,servers和上面自定义组名要对应
            root   html;
            index  index.html index.htm;
        }

    }

}

#proxy服务器执行
/usr/local/nginx/sbin/nginx -s reload

客户端测试,访问proxy代理服务器的192.168.1.200地址,然后刷新几次,可以看到访问的web页面是在web1和web2服务器之间平均轮询切换:

 

2、设置加权轮询

对于集群web服务器性能参差不齐的时候,我们希望性能好的服务器可以多被访问,性能差的服务器减少被访问,就是后就可以选择加权轮询,自动配比服务器访问比重。

#proxy服务器执行
vim /usr/local/nginx/conf/nginx.conf

在上面轮询配置的基础上,修改集群池属性,添加加权轮询参数(红色修改部分):

http {
    upstream servers {                    #定义源服务器组,servers为自定义组名
         server 192.168.1.20:80 weight=1 max_fails=1 fail_timeout=30;    
         server 192.168.1.30:80 weight=2 max_fails=2 fail_timeout=30;    
         server 192.168.1.40 down;     #问了说明参数down,实际没有该服务器,可不加

  }

    

    server {                                           #每一个server是一个虚拟主机
        listen       80;
        server_name  localhost;             #web主机名

       

        location / {
            proxy_pass http://servers;       #调用服务组,servers和上面自定义组名要对应
            root   html;
            index  index.html index.htm;
        }

    }

}

【释】如上增加的红色修改参数部分中:

weight为设置服务器权重值,默认是1

max_fails设置最大失败次数,就失败多少次,判定该服务器故障

fail_timeout设置失败超时时间,单位为秒,即失败后,多少秒内不再检查访问该服务器

down标记服务器已关机,不参与集群调度

重新加载配置:

#proxy服务器执行
/usr/local/nginx/sbin/nginx -s reload

客户端测试,再次访问proxy的192.168.1.200时,会发现web1和web2访问的几率是1:2,因为上面做了权重配置。

3、健康检测功能

当网站服务器的一个节点故障时,nginx是可以自动进行健康检查,跳过故障服务器的,比如这里将web1的nginx服务关闭:

#web1服务器执行
/usr/local/nginx/sbin/nginx -s stop

再访问192.168.1.200时,无论怎么刷新,都是访问的web2的页面:

同样,当web1重新启动恢复正常时,Nginx也会自动识别,加入集群,又可以重新恢复对web1的访问。 

4、解决重复登录问题(源地址哈希ip_hash)

使用上面轮询的方案会带来一个问题,就是如果网站需要账户登录,当第一次轮询调度到web1,输入完账户登录后,刷新页面,proxy将请求调度给web2,这是记住账户信息的只有web1,那么切换到web2又得重新输入账户信息,这时候就需要使用ip_hash,来保证同一客户端IP始终只访问同一台web服务器通过IP地址来判别是否为同一客户端,这里判别的不是IP的全部地址,而是看的IP地址前几位。

#proxy服务器执行
vim /usr/local/nginx/conf/nginx.conf

http {
    upstream servers {                    #定义源服务器组,servers为自定义组名
        ip_hash;         #在上面配置的基础上,加上ip_hash配置 

        server 192.168.1.20:80 weight=1 max_fails=1 fail_timeout=30;    
         server 192.168.1.30:80 weight=2 max_fails=2 fail_timeout=30;    
         server 192.168.1.40 down;     #问了说明参数down,实际没有该服务器,可不加

  }

    

    server {                                           #每一个server是一个虚拟主机
        listen       80;
        server_name  localhost;             #web主机名

       

        location / {
            proxy_pass http://servers;       #调用服务组,servers和上面自定义组名要对应
            root   html;
            index  index.html index.htm;
        }

    }

}

#proxy服务器执行
/usr/local/nginx/sbin/nginx -s reload

客户端测试:

访问proxy的192.168.1.200时,不论怎么刷新,同一台客户端始终访问的是固定一个web服务器,除非web服务器故障,切换了。

三、设置Nginx四层代理

前面的七层代理主要是实现web http协议的负载均衡,如果需要对IP进行负载均衡,那就需要使用Nginx的四层代理功能(Nginx1.9及以上版本支持四层代理,并安装时需要添加--with_stream模块)。

【补充】

OSI第7层--->应用层协议:FTP、HTTP、NFS、SMTP

OSI第4层--->传输层协议:TCP、UDP、SPX

OSI第3层--->网络层:IP、IPX、AppleTalk DDP

实验目标:访问proxy服务器的192.168.1.200:22,proxy服务器将ssh请求轮询分配给web1和web2主机,实现对SSH的调度。

#proxy服务器执行
vim /usr/local/nginx/conf/nginx.conf

在http配置的上方新增以下内容(红色部分):

stream {                                           #四层代理配置stream
    upstream backend {                    #定义集群,名称为backend
        server 192.168.1.20:22;          #代理的是ssh服务,所以是22端口
        server 192.168.1.30:22;
    }
    server {                                       
#定义一个本地服务器代理服务
        listen 12345;                           #本地代理监听端口,需要是未使用的端口
        proxy_pass backend;              #调用backend集群,集群名要与上面定义的对应
    }
}


http {

... ...

}

#proxy服务器执行
/usr/local/nginx/sbin/nginx -s reload

客户端测试:

使用xshell远程连接192.168.1.200的12345端口,会自动转发到web1和web2的22端口:

 【注】四层代理只关系协议是TCP还是UDP,不管是ssh、mysql、dns都可以使用nginx四层代理,以实现对应负载均衡。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx实现四层代理与七层代理 的相关文章

随机推荐

  • RedLock加锁源码分析

    目录 Redis获取锁 加锁操作 lockInterruptibly unLock Redis获取锁 首先了解下Redisson 获取RLock RedissionLock public RLock getLock String name
  • 《高质量程序设计指南--C/C++语言》学习笔记

    高质量程序设计指南 C C 语言 学习笔记 高质量软件开发之道 程序设计入门 内部名称 连接规范 变量及其初始化 浮点变量与零值比较 C C常量 正确定义符号常量 类中的常量 实际应用中如何定义常量 在C程序中定义多个编译单元或模块公用的常
  • whl文件安装方法

    whl格式本质上是一个压缩包 里面包含了py文件 以及经过编译的pyd文件 使得可以在不具备编译环境的情况下 选择合适自己的python环境进行安装 问题描述 whl下载了后不会安装 解决方法 1 把下载的文件拖到桌面 2 进入cmd命令行
  • Qt教程一

    文章目录 Qt是什么 Qt 可以做什么 Qt 的辛酸史 Qt 和 KDE GPL 和 LGPL 如何选择开源协议 2 为什么用Qt Qt 和 MFC 3 Qt Creator 安装之后添加组件 编码问题 主界面 创建项目 项目文件 main
  • 记常用Ubuntu命令

    Ubuntu 服务器 sudo i 切换到root用户 sudo lsof i 8080 查看8080端口是否被占用以及pid sudo kill 9 pid 通过pid关闭指定服务进程 docker ps 查看docker镜像相关信息 d
  • python统计excel某一列不同类别数量

    功能 某一列 比如病例类型 数据含有多种类别 比如 死亡 存活 失访 三种类别 取值 用python实现统计出这三种类别的数量 输入 xlsx文件 含有病例类型这一列row 4 数据含有 死亡 存活 失访 三种类别取值 输出 三种类别的数量
  • 二叉树链式存储结构代码实现

    上一篇博客已经介绍过实际内容了 这一篇直接上干货代码了 结构体 前面写的是用c语言写的 用的也是递归的方法 typedef char BTDataType typedef struct BTNode struct BTNode left s
  • 给数组元素指定位置排序方法

    调整数组选项 梨子 香蕉 苹果 selectSort gt let finalData const arr name 苹果 code apple name 梨子 code pear name 香蕉 code banana 原数据 const
  • office全家桶_大学新生必备!Adobe+Office全家桶免费拿。

    做最有趣有料的科技自媒体 数一数手指 还有几天就要开学了 各 位准大学生们听我 说 作为曾经的 学长 我很有必要告诉你们一些来自大学的 潜规则 你迟早有一天会用到电脑里装的Adode和offic的软件 Adobe和 office 的软件可以
  • Android 自定义属性,自定义控件、自定义View以及View的常见Error

    Android 自定义属性 自定义控件 自定义View以及View的常见Error View GONE 不占据layout 但是对象还是存在 资源还是占用的 View INVISIBLE 占据layout 对象还是存在 资源还是占用的 只是
  • Java开发代码规范之异常日志(二)——日志规约

    文章通过学习 阿里巴巴Java开发手册 整理 1 应用中不可直接使用日志系统 Log4j Logback 中的API 而应依赖使用日志框架SLF4J中的API 使用门面模式的日志框架 有利于维护和各个类的日志处理方式统一 import or
  • 【华为OD机试】不开心的小朋友(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 题目描述 游乐场里增加了一批摇摇车 非常受小朋友欢迎 但是每辆摇摇车同时只能有一个小朋友使用 如果没有
  • 信号与系统——初识到理解(第五章——傅立叶变换的应用)

    目录 第五章 傅立叶变换的应用 信号与系统的时频域特性 5 1 傅立叶变换的模和相位表示 5 2 无失真传输系统 讨论连续情况 离散时足以整数约束即可 5 3 系统相位 5 4 群时延 采样 5 5 通信中对信号的加工 5 6 冲击串采样
  • SM2可以使用私钥加密吗

    是的 SM2可以使用私钥加密 SM2是一种非对称加密算法 它使用公钥和私钥对数据进行加密和解密 私钥是保存在本地的密钥 只有拥有私钥的人才能使用它来加密数据或对已加密的数据进行解密 SM2的私钥加密功能可以用来保护数据的安全性 防止数据在传
  • 文件上传漏洞

    文件上传 文件上传是现代互联网常见的功能 允许用户上传图片 视频 及其他类型文件 向用户提供的功能越多 Web受攻击的风险就越大 文件上传漏洞 上传文件时 如果未对上传的文件进行严格的验证和过滤 就容易造成文件上传漏洞 上传脚本文件 包括a
  • 大数据学习01 -Linux 的简单使用

    1 NAT 网络地址转换 默认使用VMnet8 1 原理 子网掩码 和IP进行与操作 可以得到对应的子网IP 在那个网段上 IP 哪台机制 网关 路由器的IP dns 去dbs服务器查找域名对应的IP 常用命令 修改主机名 vi etc s
  • 13.罗马数字转整数

    这题转成字符数组后遍历就是了 罗马数字包含以下七种字符 I V X L C D 和 M 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如 罗马数字 2 写做 II 即为两个并列的 1 12 写做 X
  • 2023华为OD机试 报数游戏(Python)

    题目 输入 输入一个整数 n 代表有多少人 n 小于 1000 输出 告诉我最后剩下的那个人原来是第几个 示例 输入 2 输出 2 解释 两人围成一圈 第一个人数到3就走了 所以最后剩的是第二个人 理解 想象这样一个游戏 大家围成一圈 从第
  • C++:sort函数

    sort函数用于C 中 对给定区间所有元素进行排序 默认为升序 也可进行降序排序 sort函数进行排序的时间复杂度为n log2n 比冒泡之类的排序算法效率要高 使用sort函数要包含头文件为 include
  • Nginx实现四层代理与七层代理

    目录 一 实验环境准备 1 准备三台服务器 2 安装nginx环境 3 启动nginx环境 二 设置Nginx七层代理 1 proxy代理服务器配置 轮询 2 设置加权轮询 3 健康检测功能 4 解决重复登录问题 源地址哈希ip hash