Nginx反向代理ip透传与负载均衡

前言

上篇介绍了nginx服务器单向代理和动静分离等相关内容,可参考Nginx重写功能和反向代理-CSDN博客,这里就ip透传和负载均衡对nginx反向代理做进一步了解。

目录

一、客户端ip透传

1. 概述

2. 一级代理

2.1 图示

2.2 操作过程 

3. 二级代理

3.1 图示

3.2 示例 

二、负载均衡

1. 概述

2. 配置格式

3. 调度算法 

3.1 轮询算法

3.2 加权轮询算法

3.3 最小连接数算法

3.4 ip_hash算法

3.5 fair算法

4. 示例 

4.1 图示

4.2 轮询操作过程

4.3 加权轮询操作过程

4.4 最大链接数、连续检测和延迟上线

4.5 备份服务器

4.6 hash调度操作


一、客户端ip透传

1. 概述

在Nginx中,代理客户端IP透传是指将客户端的真实IP地址(也称为远程IP地址)传递给后端服务器。这在一些情况下非常有用,例如,当Nginx作为反向代理服务器时,我们希望后端服务器能够获取到客户端的真实IP地址,而不是Nginx服务器的IP地址。

2. 一级代理

2.1 图示

2.2 操作过程 

实现目标:7-0服务器日志可以查看到客户端真实地址。

ip未透传前效果:

① 修改代理端7-2配置

[root@localhost ~]# vim /apps/nginx/conf.d/pc.conf
server {
        listen 80;
        server_name www.pc.com;
        root /data/;
        location / {
        proxy_pass http://192.168.190.100;
        }
}
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload

② 添加后端服务器7-0web文件,开启httpd服务,关闭防火墙,并实时查看访问日志

[root@localhost ~]# cd /var/www/html/
[root@localhost html]# echo welcome 7-0 > index.html
[root@localhost html]# systemctl start httpd
[root@localhost html]# systemctl stop firewalld.service 
[root@localhost html]# setenforce 0
[root@localhost html]# tail -f /var/log/httpd/access_log

③ 客户端7-3访问代理服务器

[root@localhost ~]# curl 192.168.190.102
welcome 7-0

④ 观察后端服务器7-0新增日志信息

[root@localhost html]# tail -f /var/log/httpd/access_log
192.168.190.102 - - [27/Feb/2024:16:02:18 +0800] "GET / HTTP/1.0" 200 12 "-" "curl/7.29.0"
#无法查看到真实客户端地址

配置ip透传:

① 修改代理端7-2配置

[root@localhost ~]# vim /apps/nginx/conf.d/pc.conf
server {
        listen 80;
        server_name www.pc.com;
        root /data/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#添加客户端IP和反向代理服务器IP到请求报文头部
        location / {
        proxy_pass http://192.168.190.100;
        }
}
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload

② 修改后端服务器7-1配置

[root@localhost html]# vim /etc/httpd/conf/httpd.conf
196     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\"" combined
#添加变量X-Forwarded-For
[root@localhost html]# systemctl restart httpd

③ 再次访问代理端,查看后端服务器访问日志

[root@localhost html]# tail -f /var/log/httpd/access_log
192.168.190.102 - - [27/Feb/2024:16:25:36 +0800] "GET / HTTP/1.0" 200 12 "-" "curl/7.29.0" "192.168.190.103"
#开启ip透传后可以查看到客户端ip

3. 二级代理

实现目标:7-0服务器日志可以查看到客户端ip和反向代理服务器ip。

3.1 图示

3.2 示例 

 ① 修改7-2代理服务器配置

[root@localhost ~]# vim /apps/nginx/conf.d/pc.conf
server {
        listen 80;
        server_name www.pc.com;
        root /data/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        location / {
        proxy_pass http://192.168.190.101;
        }
}
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload

② 修改7-1代理服务器配置

[root@localhost ~]# vim /etc/nginx/nginx.conf
 43         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 45         location / {
 46         proxy_pass http://192.168.190.100;
 47         }
[root@localhost ~]# systemctl restart nginx

③ 后端服务器7-0新建web文件

[root@localhost ~]# cd /usr/share/nginx/html
[root@localhost html]# echo welcome 7-0 > index.html

④ 客户端7-3访问代理服务器7-2

[root@localhost ~]# curl 192.168.190.102
welcome 7-0

⑤ 查看后端服务器访问日志

[root@localhost ~]# tail -f /var/log/nginx/access.log
192.168.190.101 - - [27/Feb/2024:18:00:11 +0800] "GET / HTTP/1.0" 200 12 "-" "curl/7.29.0" "192.168.190.103, 192.168.190.102"

二、负载均衡

1. 概述

在上一个节中Nginx可以将客户端的请求转发至单台后端服务器,但是无法转发至特定的一组的服务器,而且不能对后端服务器提供相应的服务器状态监测,Nginx可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能。

2. 配置格式

http {
    upstream web {
        server 192.168.190.100 weight=5;
        server 192.168.190.101;
        server 192.168.190.102;

        least_conn;
        ip_hash;
        keepalive 32;
        fair;
    }
}

server {
    listen 80;
    server_name www.pc.com;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    root /data/;
    location / {
    pass_proxy  http://web/
    }
}

上面的配置中,upstream块定义了后端服务器的列表和负载均衡算法。server块定义了反向代理服务器的监听端口和域名,以及请求转发的配置。具体说明如下:

  • upstream块:定义了一个名为web的负载均衡服务器组,其中包含了三个后端服务器,分别是192.168.190.100、192.168.190.101、192.168.190.102。 
  • weight=5表示将第一个后端服务器的权重设置为5,即分配更多的请求给它。ip_hash表示使用IP哈希算法进行负载均衡。keepalive 32表示使用长连接并保持32个连接。 
  • server块:定义了一个监听80端口的虚拟主机,它的域名是www.pc.com。location /表示将所有请求转发给upstream块中定义的服务器组web。proxy_set_header指令可以设置请求头,以便后端服务器能够获取客户端的真实IP地址等信息。
  • 由于使用了least_conn;算法,Nginx会动态地将请求发送到当前连接数最少的后端服务器上,以达到负载均衡的目的。
  • upstream块中使用了ip_hash算法,表示会根据客户端的IP地址,将该客户端的所有请求都发送到同一个后端服务器上。
  • 由于使用了fair算法,请求会被发送到响应时间最短的服务器上,从而实现负载均衡。

3. 调度算法 

3.1 轮询算法

默认算法是轮询算法即反向代理服务器处理用户请求时,每个后端服务器都轮流提供响应。

http {
 upstream web {
       server 192.168.190.100:80;
       server 192.168.190.101:80;
}

3.2 加权轮询算法

在默认轮询的基础上增加权重,weight=number。如果后端有2个服务器其中一个配置权重为weight=5另外一个不配置默认是1,则有用户访问时分配给给有权重的服务器和不配置权重的服务器的比例为5:1。

http {
    upstream web {
        server 192.168.190.100 weight=5;
        server 192.168.190.101;
}

3.3 最小连接数算法

最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC。按照nginx反向代理服务器和后端服务器的连接数分配请求,连接越少的分配处理请求优先级越高。例如最小连接数(least_conn;)是设置是3,1号后端服务器有2个请求在处理,而后2号后端服务器只有1个请求在处理,则新请求交给后端服务器2。

http {
 upstream web {

       least_conn;
       server 192.168.190.100:80;
       server 192.168.190.101:80;
}

3.4 ip_hash算法

基于客户端IP地址的负载均衡算法。它会根据客户端的IP地址,将该客户端的所有请求都发送到同一个后端服务器上。这样可以保证同一个客户端的所有请求都被发送到同一个后端服务器,从而保证了会话的一致性。

 http {
 upstream web {

       ip_hash;
       server 192.168.190.100:80;
       server 192.168.190.101:80;
}

3.5 fair算法

基于后端服务器的负载均衡算法。它会根据后端服务器的响应时间,将请求发送到响应时间最短的服务器上。这样可以保证请求被发送到处理能力最强的服务器上,从而提高系统的性能。

 http {
 upstream web {

       fair;
       server 192.168.190.100:80;
       server 192.168.190.101:80;
}

4. 示例 

这里后端服务器使用httpd服务

4.1 图示

4.2 轮询操作过程

① 7-0和7-1 apache后端服务器开启httpd服务,关闭防火墙,分别建立web文件

7-0,7-1:
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

7-0:
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# echo welcome to 7-0 > index.html

7-1:
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# echo welcome to 7-1 > index.html
#理论上7-0和7-1页面一样,这里为了方便查看分别命名主页面

② 修改7-2nginx主配置文件

[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
 20     upstream web { 
 21     server 192.168.190.100; 
 22     server 192.168.190.101;
 23     }
#在http下添加以上配置
 25    # include       /apps/nginx/conf.d/*.conf;

 49         location / {
 50             proxy_pass http://web/;
 51             index  index.html index.htm;
 52         }
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload

③ 客户端7-3访问代理服务器7-2

当7-1后端服务器宕机,代理服务器轮巡算法是否会出现隔次无法访问? 

停止7-1httpd服务,查看7-3客户机访问情况:

nginx服务较为只能,通过tcp三次握手可以检查服务器健康性,当无法完成连通性,默认将不会访问从而提示报错。当故障服务器恢复正常后,再次轮巡调度。

4.3 加权轮询操作过程

① 修改7-2代理服务器配置

 20     upstream web {
 21     server 192.168.190.100 weight=2;
 22     server 192.168.190.101;
 23     }

② 7-3访问结果

4.4 最大链接数、连续检测和延迟上线

 20     upstream web {
 21     server 192.168.190.100;
 22     server 192.168.190.101 max_conns=10 max_fails=3 fail_timeout=30s;
 23     }
#max_conns=number  #给当前后端server设置最大活动链接数,默认为0表示没有限制
#max_fails=number   后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
#fail_timeout=time 后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒。这样避免服务器刚上线不稳定再次导致业务失败

4.5 备份服务器

当所有后端服务器不可用时,才会启用此备用服务器sorry server,自己不能转自己。

① 修改代理服务器7-2配置

 20     upstream web {
 21     server 192.168.190.100;
 22     server 192.168.190.101 backup;
 23     }
#当192.168.190.100宕机后启动192.168.190.101

② 客户端7-3访问代理服务器7-2

③ 配置7-1备用服务器主页web文件,并关闭7-0后端服务器

7-1:
[root@localhost html]# echo sorry server > index.html

7-0:
[root@localhost html]# systemctl stop httpd

 ④ 客户端7-3再次访问代理服务器7-2

4.6 hash调度操作

根据客户端ip:

① 修改代理服务器配置

 20     upstream web { 
 21     hash $remote_addr;         #hash客户端ip
 22     server 192.168.190.100;
 23     server 192.168.190.101;
 24     }

② 客户端访问

注:hash/总权重得到正确的值,该值会受权重影响,至于访问到那台与谁会话保持存在几率。

根据请求地址: 

① 修改代理服务器7-2配置

 20     upstream web { 
 21     hash $request_uri;         #发送请求的地址,一旦确定不会轻易改变
 22     server 192.168.190.100;
 23     server 192.168.190.101;
 24     }

② 客户端访问

cookie: 

① 修改代理服务器7-2配置

 20     upstream web { 
 21     hash $cookie_hello;         #提取cookie中hello关键字
 22     server 192.168.190.100;
 23     server 192.168.190.101;
 24     }

② 客户端模拟加上cookie访问

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx——安装和反向代理

Nginx安装与应用 1.1 Nginx介绍 Nginx 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强 Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等。但是不支持java。Java程序只能通过与tomcat配合…

Java最新面试宝典 SpringMVC面试题)

Java最新面试宝典 SpringMVC面试题 前言1、什么是SpringMVC?2、SpringMVC 的优点?3、Spring MVC配置步骤?4、SpringMVC工作原理了解吗?5、Spring MVC 核心组件的功能?6、B/S 系统标准的三层架构是什么?7、C…

python 基础绘图函数 实例

简介 在 Python 中,有许多用于绘图的库。以下是一些常用的 Python 绘图库及其基本绘图函数的简要介绍: Matplotlib: matplotlib.pyplot.plot(x, y): 绘制线图。matplotlib.pyplot.scatter(x, y): 绘制散点图。matplotlib.pyplot.bar(x, height): 绘制条…

【kubernetes】关于k8s集群的声明式管理资源

目录 一、声明式管理方法 二、资源配置清单管理 1、导出资源配置清单 2、修改资源配置清单并应用 2.1离线修改 2.2在线修改 三、通过资源配置清单创建资源对象 获取K8S资源配置清单文件模板? 关于配置清单常见的字段 方案一:手写yaml配置文件 …

css常用的选择器介绍

CSS(层叠样式表)选择器是CSS规则的一部分,它用于选择和定位网页上的元素,以便将样式应用到这些元素上。CSS选择器的种类繁多,每种选择器都有其特定的用途、特点和效率。在这篇文章中,我们将讨论一些常用的C…

EMR StarRocks实战——Mysql数据实时同步到SR

文章摘抄阿里云EMR上的StarRocks实践:《基于实时计算Flink使用CTAS&CDAS功能同步MySQL数据至StarRocks》 前言 CTAS可以实现单表的结构和数据同步,CDAS可以实现整库同步或者同一库中的多表结构和数据同步。下文主要介绍如何使用Flink平台和E-MapRed…

免费的Git图形界面工具sourceTree介绍

阅读本文同时请参阅-----代码库管理工具Git介绍 sourceTree是一款免费的Git图形界面工具,它简化了Git的使用过程,使得开发者可以更加方便地下载代码、更新代码、提交代码和处理冲突。下面我将详细介绍如何使用sourceTree进行这些操作。 1.下载和…

GEE数据集——数字地球澳大利亚海岸线(更新)

数字地球澳大利亚海岸线 澳大利亚数字地球海岸线是一个大陆数据集,包括从 1988 年至今整个澳大利亚海岸线的年度海岸线和海岸变化率。该产品将澳大利亚地球科学组织的 "澳大利亚数字地球 "计划提供的卫星数据与潮汐模型相结合,绘制出每年平均海…

Vue自定义指令directives

1. 使用<script setup> <template><input v-focus"11111" /><input v-obj"{ id: 1, name: 这里是name }" /> </template> <script setup> //定义一个变量vFocus //命名方法使得DOM元素中可以用v-focus来显示 let vFo…

GPT 的基础 - T(Transformer)

我们知道GPT的含义是&#xff1a; Generative - 生成下一个词 Pre-trained - 文本预训练 Transformer - 基于Transformer架构 我们看到Transformer模型是GPT的基础&#xff0c;这篇博客梳理了一下Transformer的知识点。 BERT:通过自监督的方式,在大规模语料上预训练得到的Tran…

05 动力云客之分页查询用户 + 查询用户详情 + 新增用户

1. 用户列表分页查询实现 核心 使用pageHelper实现分页 GetMapping(value "api/users")//分页的参数可以不传, 不传就默认设置为1public R userPage(RequestParam(value "current", required false) Integer current) {if (current null) {current …

数据服务安全的重要性

数据服务安全在当今信息化社会显得尤为重要。随着大数据、云计算、人工智能等技术的飞速发展&#xff0c;数据已经成为企业和组织的核心资产&#xff0c;数据服务安全也面临着前所未有的挑战。本文将从数据服务安全的重要性、常见威胁、防护策略以及未来发展趋势等方面进行探讨…

chatgpt帮忙看代码瞬间不难受了

目标&#xff1a;初步熟悉下mysql启动流程逻辑、熟悉下mysql增删改查逻辑 材料&#xff1a; 下载个源码包&#xff1a;MySQL :: Download MySQL Community Server安装个visual studio code 软件用来看代码chatgpt 开始&#xff1a; ##怎么容易怎么来&#xff1a;先查查网上别…

Qt篇——QTableWidget保存表格数据到Excel文件中,读Excel内容到QTableWidget

表格和excel例子如下图所示&#xff1a; 一、QTableWidget保存表格数据到Excel文件中 代码如下&#xff1a; &#xff08;pro文件中添加QT axcontainer&#xff09; #include <QAxObject>void MainWindow::saveTableToExcel() {QDateTime current_date_time QDateTi…

SpringBoot:Invalid bound statement (not found)的原因和解决方案

&#x1f413; 报错信息&#xff1a; &#xff08;无效绑定声明&#xff09;找不到 解析&#xff1a; 你的mapper实例对象和对应的mapper.xml对象未找到 &#x1f413; 排查&#xff1a; 情况一&#xff1a; 1.排除相对应的mapper实例对象路径是否正确 查看相对应的mapper中…

MIND解读

这篇paper的核心是胶囊网络&#xff0c;该网络采用了动态路由算法自动对用户历史行为序列进行聚类&#xff0c;提取出多个兴趣向量&#xff0c;代表用户的不同兴趣。当用户再有新的交互时&#xff0c;通过胶囊网络&#xff0c;还能实时的改变用户的兴趣表示向量&#xff0c;做到…

前后端项目-part02

文章目录 4 课程分类树4.1 需求展示4.2 后端开发4.2.1 添加工具类4.2.2 添加依赖4.2.3 创建实体类4.2.4 创建Mapper4.2.5 创建Service4.2.6 创建Controller4.2.7创建启动类4.2.8创建yml文件4.2.9测试4.3 前端开发4.3.1 树形控件测试4.3.2 替换测试数据4.4 利用ThreadLocal实现共…

腾讯云服务器4核8G性能,和阿里云比怎么样?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

实现unity场景切换

本文实现两个按键实现场景1和场景2之间的切换 ①首先在unity 3D中创建两个场景&#xff0c;分别为Scene1和Scene2 ②在Scene1中创建一个Button&#xff0c;修改txt内容为“To Scene2”&#xff0c;并在Buttons下创建一个空物体&#xff0c;用于挂载脚本。 脚本Trans Scene.…

ElasticSearch之找到乔丹的空中大灌篮电影

写在前面 本文看一个搜索的实际例子&#xff0c;找到篮球之神乔丹的电影Space Jam&#xff0c;即空中大灌篮。 正式开始之前先来看下要查询的目标文档&#xff0c;以及查询的text&#xff1a; 要查询的目标文档 {..."title": "Space Jam",..."ove…