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

news2025/7/8 3:18:16

目录

一、实验环境准备

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网站服务器web1192.168.1.20(内部IP)关闭selinux和firewalld
nginx web2网站服务器web2192.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四层代理,以实现对应负载均衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

StarRocks从入门到精通系列五:导入数据

StarRocks从入门到精通系列五:导入数据 一、导入总览二、从 Apache Kafka 持续导入三、使用 Apache Spark™ 批量导入四、从 Apache Flink持续导入一、导入总览 下图详细展示了在各种数据源场景下,应该选择哪一种导入方式。 数据导入是指将原始数据按照业务需求进行清洗、…

Springboot常用参数注解

访问路径为http://localhost:8080/ PathVariable GetMapping("/get/{id}/blank/{name}")public Map getValue(PathVariable("id") Integer id,PathVariable("name") String name,PathVariable Map<String,String> kv){Map map new Hash…

在Jeston NX上部署运行PaddleOCR教程(安装whl包方法)

文章目录基本概念介绍1.确定盒子环境pythonCUDAcuDNNTensorRT版本1.1 我还没有安装环境&#xff1a;一步到位整体安装1.2 我已经安装了环境&#xff1a;查询盒子环境版本1.3 默认python版本设置2.安装PaddlePaddle3. 安装PaddleOCR4. 运行例程5. 后续工作附&#xff1a;参考教程…

Java---Arrays类的常用方法

目录 1&#xff1a;Arrays常用的API方法 2&#xff1a;API方法具体举例 &#xff08;1&#xff09;toString方法 &#xff08;2&#xff09;sort方法 &#xff08;3&#xff09;binarySearch方法 &#xff08;4&#xff09;fill方法 &#xff08;5&#xff09;copyOf方法 …

如何在自己的项目中实现脚手架的命令行交互

背景 所在的公司大多数项目都是用Taro脚手架搭建的&#xff0c;因为业务上要实现多端开发 答应我&#xff0c;如果可以千万不要选择跨端开发&#x1f64f;。所以不同环境下运行、打包会有多个命令。如下图所示&#xff1a; 嗯&#xff1f;&#xff1f;好熟悉感觉在哪见过&…

LeetCode刷题(python版)——Topic69. x 的平方根

一、题设 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1…

2022年下半年网络规划设计师下午真题及答案解析

1.若系统正在将( )文件修改的结果写回磁盘时系统发生掉电&#xff0c;则对系统的影响相对较大。A.目录 B.空闲块 C.用户程序 D.用户数据 2.采用三级模式结构的数据库系统中&#xff0c;如果对一个表创建聚簇索引&#xff0c;那么改变的是数据库的( )。 A.外模式…

信号(1.信号概念 2.信号的处理方式 3.信号阶段 用户态,内核态)

目录1.临界资源2.临界值3.原子性4.互斥5.什么是信号量6.什么是信号1.信号概念2.信号的处理方式3.信号阶段1.信号使用前&#xff0c;信号的产生2.为什么进程会崩溃3.信号产生中4.信号产生后1.临界资源 被多个进程能够看到看到额资源叫做临界资源 如果没有堆临界资源进任何的保护…

技术分享 | AlertManager 源码解析

作者&#xff1a;石蓓蓓 爱可生研发工程师&#xff0c;主要负责爱可生产品云DMP树产品的研发工作。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 AlertManager 是处理对应用程序的告警的…

ZIP压缩文件的打开密码和自动加密有什么不同?

ZIP是常用的压缩文件格式&#xff0c;对于重要的内容&#xff0c;我们还可以设置密码&#xff0c;从而达到保护文件内容的目的。 通过WinRAR给ZIP文件设置密码保护&#xff0c;可以设置“打开密码”和“自动加密”&#xff0c;那两者有什么不同呢&#xff1f; 设置打开密码是…

【附源码】Python计算机毕业设计万达影院售票管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

图相似度计算——SIMGnn源码解读

在运行代码的时候&#xff0c;需要首先指定参数&#xff0c;--histogram&#xff0c;表示使用直方图特征 1.数据集 数据集我们使用的是AIDS数据集&#xff0c;为内置的数据集&#xff0c;整个数据集大约700张图&#xff0c;每个图少于10个点&#xff0c;每个点由29维的向量组成…

多视角碰撞,探索 Serverless 企业落地更多可能性丨阿里云用户组厦门站

2022 年 9 月 24 日&#xff0c;阿里云在厦门举办了第 12 场阿里云用户组&#xff08;AUG&#xff09;活动&#xff0c;活动主题为“提效降本&#xff0c;Serverless 助力企业快速落地云原生”&#xff0c;吸引了众多技术从业者及企业管理者到场交流。 2009 年&#xff0c;伯克…

油气田工业控制系统现状

石油石化行业综述 石油石化行业分为上游、中游和下游。其中&#xff0c;上游从事的业务包括原油、天然气 的勘探、开发&#xff0c;中游主要是油气 的存储与运输&#xff0c;下游则涵盖炼油、化工、天然气加工等流程型业务及加油站零售等产品配送、销售型业务。通常情况下&…

常用 numpy 函数(长期更新)

文章目录np.where()np.zeros()np.zeros_like()np.divide()np.linalg.norm()np.uint8()np.clip()np.where() np.where有两种用法 np.where(condition,x,y) 当where内有三个参数时&#xff0c;第一个参数表示条件&#xff0c;当条件成立时where方法返回x&#xff0c;当条件不成…

超强功能WebSSH安装,解决Web远程SSH终端

项目地址&#xff1a;https://github.com/huashengdun/webssh 一个简单的 Web 应用程序&#xff0c;用作 ssh 客户端以连接到您的 ssh 服务器。它是用 Python 编写的&#xff0c;基于 tornado、paramiko 和 xterm.js。 特征&#xff1a; 支持SSH密码认证&#xff0c;包括空密…

Windows系统配置CUDA编程环境

像配置一个简单的可以进行CUDA编程的Windows系统环境&#xff0c;分别需要CUDA以及Visual stdio。 注意&#xff0c;如果是新配置的电脑&#xff0c;一定要先安装visual stdio再安装CUDA&#xff0c;否则后面在VS中创建.cu文件时容易出现找不到模块的情况。 一、安装Visual st…

动态规划--(回文子串,最长回文子序列)

代码随想录day 57 动态规划模块 回文子串,最长回文子序列 文章目录1.leetcode 647. 回文子串1.1 详细思路及解题步骤1.2 Java版代码示例2.leetcode 516. 最长回文子序列2.1 详细思路及解题步骤2.2 Java版代码示例1.leetcode 647. 回文子串 1.1 详细思路及解题步骤 该题用动态规…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java杨佑川音乐播放器908v6

大部分步骤是 1.确定选题 选题的确定需要查阅大量的资料&#xff0c;要搞清楚自己大概想要研究的方向是什么。可以选择自己感兴趣的学科或者强势的学科进行研究&#xff0c;同时要多和毕业指导老师多交流&#xff0c;征求老师的意见和建议&#xff0c;最后确立选题。计算机专…

【K8S系列】第九讲:Kubernetes 之探针

目录 一、探针是什么 二、探针类型 2.1 livenessProbe 2.1.1 容器重启策略 2.2 readinessProbe 2.3 startupProbe 2.4 总结 2.5 探针示例 2.6 配置字段介绍 三、探测机制 3.1 HTTP GET探针 3.2 TCP套接字探针 3.3 Exec探针 Tips 一、探针是什么 探针:是由 kub…