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.conf43         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 07-0:
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# echo welcome to 7-0 > index.html7-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.conf20     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.html7-0:
[root@localhost html]# systemctl stop httpd

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

4.6 hash调度操作

根据客户端ip:

① 修改代理服务器配置

 20     upstream web { 21     hash $remote_addr;         #hash客户端ip22     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访问

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

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

相关文章

使用ffmpeg压缩视频

一、到ffmpeg官网下载文件包: Download FFmpeg 下载后找到 bin 下的3个exe文件,复制到自己本机的某个目录下, 如: 二、使用命令行压缩: ffmpeg -i input.mp4 -c:v libx265 -crf 28 -y output.mp4 这条命令使用 FFmpeg 工具对输…

机器学习——线性代数中矩阵和向量的基本介绍

矩阵和向量的基本概念 矩阵的基本概念(这里不多说,应该都知道) 而向量就是一个特殊的矩阵,即向量只有一列,是个n*1的矩阵 注:一般矩阵用大写字母表示,向量用小写字母表示 矩阵的加减运算 两个…

前端架构: 脚手架命令行交互核心实现之inquirer和readline的应用教程

命令行交互核心实现 核心目标:实现命令行行交互,如List命令行的交互呢比命令行的渲难度要更大,因为它涉及的技术点会会更多它涉及以下技术点 键盘输入的一个监听 (这里通过 readline来实现)计算命令行窗口的尺寸清屏光标的移动输出流的静默 …

关于年化收益率的思考

近期,对于投资的年化收益率有一些思考,想着将这些思考整理一下,顺便也就记录在这里。 1. 计算方式 年化收益率常见的计算有三种:算数平均,几何平均,IRR。 1.1 算术平均 算数平均用于度量产品的回报率&a…

MetaGPT 1 安装与配置踩坑实录

安装 与 配置直接参考这里就行:Hugging Muti Agent(二月学习) - 飞书云文档 (feishu.cn) 这里按照教程安装的是metagpt 0.6.6 ,经过跟0.7.0对比,个人认为0.7对其他llm接入可能更好,文档也更清晰。 0.6.6的…

uniapp android 原生插件开发-测试流程

前言 最近公司要求研究一下 uniapp 的 android 原生插件的开发,为以后的工作做准备。这篇文章记录一下自己的学习过程,也帮助一下有同样需求的同学们 : ) 一、下载安装Hbuilder X , Android studio(相关的安装配置过程网上有很多,…

安全运营中心(SOC)综合指南

什么是安全运营中心(SOC) 安全运营中心,也称为信息安全运营中心 (ISOC),是结构良好的网络安全战略的核心。安全运营中心是一个集中式枢纽,无论是在组织内部还是外包,都致力于对整个…

云计算时代的运维: 职业发展方向与岗位选择

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua,在这里我会分享我的知识和经验。&#x…

Nginx网络服务五-----rewrite和反向代理

1.rewrite 1.1rewrite指令 通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理 官方文档: https://nginx.org/en/docs/http/ngx_http_r…

自动驾驶消息传输机制-LCM

需要用到LCM消息通讯,遂研究下。 这里写目录标题 1 LCM简介2. LCM源码分析3 LCM C教程与实例3.1 安装配置及介绍3.2 创建类型定义3.3 初始化LCM3.4 发布publish一个消息3.5 订阅和接收一个消息3.6 LCM进程间通讯3.7 注意事项?3.7.1 当数据结构定义的是数…

代码随想录算法训练营29期|day64 任务以及具体安排

第十章 单调栈part03 有了之前单调栈的铺垫&#xff0c;这道题目就不难了。 84.柱状图中最大的矩形class Solution {int largestRectangleArea(int[] heights) {Stack<Integer> st new Stack<Integer>();// 数组扩容&#xff0c;在头和尾各加入一个元素int [] ne…

斯元Z-ONE-China Cybersecurity Tech Landscape·中国网络安全全景图-百度网盘下载

面向全球&#xff0c;斯元Z-ONE正式发布首版「China Cybersecurity Tech Landscape中国网络安全全景图」。 为了提升海外市场对中国网络安全行业的全局认识&#xff0c;方便国际客户及合作伙伴了解中国网络安全科技的赛道分布和国内外厂商对标&#xff0c;助力中国网安厂商出海…

uni-app之android原生插件开发

官网 uni小程序SDK 一 插件简介 1.1 当HBuilderX中提供的能力无法满足App功能需求&#xff0c;需要通过使用Andorid/iOS原生开发实现时&#xff0c;可使用App离线SDK开发原生插件来扩展原生能力。 1.2 插件类型有两种&#xff0c;Module模式和Component模式 Module模式&…

【架构笔记1】剃刀思维-如无必要,勿增实体

欢迎来到文思源想的架构空间&#xff0c;前段时间博主做了一个工作经历复盘&#xff0c;10年开发路&#xff0c;走了不少弯路&#xff0c;也算积累了不少软件开发、架构设计的经验和心得&#xff0c;确实有必要好好盘一盘&#xff0c;作为个人的总结&#xff0c;同时也留给有缘…

Flink SQL 中的流式概念:状态算子

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

10W 音频功率放大电路芯片TDA2003,可用于汽车收音机及收录机中作音频功率放大器,内部具有短路保护和过热保护等功能

TDA2003 用于汽车收音机及收录机中作音频功率放大器。 采用 TO220B5 封装形式。 主要特点&#xff1a; ⚫ 内部具有短路保护和过热保护。内部具有地线开路、电源极性接 反和负载泄放电压反冲等保护电路。 ⚫ 输出电流大。 ⚫ 负载电阻可低至 1.6 。 …

LeetCode 刷题 [C++] 第141题.环形链表

题目描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

STC-ISP原厂代码研究之 V3.7d汇编版本

最近在研究STC的ISP程序,用来做一个上位机烧录软件,逆向了上位机软件,有些地方始终没看明白,因此尝试读取它的ISP代码,但是没有读取成功。应该是目前的芯片架构已经将引导代码放入在了单独的存储块中,而这存储块有硬件级的使能线,在面包板社区-宏晶STC单片机的ISP的BIN文…

matlab绘制雷达图和二维FFT变换图

1、内容简介 略 49-可以交流、咨询、答疑 matlab绘制雷达图和二维FFT变换图 NMO组及NORMAL组 RNFL层、GCL层、IPL层、GCC层、ORL层做雷达图&#xff08;共10张&#xff09; 2、内容说明 略 NMO组及NORMAL组 RNFL层、GCL层、IPL层、GCC层、ORL层请分别做雷达图&#xff08…

kotlin与java的相互转换

Kotlin转java 将kotlin代码反编译成java Tools -> Kotlin -> Show Kotlin Bytecode 然后点击 【Decompile】 生成java代码 java转kotlin Code -> Convert Java File To Kotlin File