nginx(三)实现反向代理客户端 IP透传

2024-02-29 10:52

本文主要是介绍nginx(三)实现反向代理客户端 IP透传,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正常情况下,客户端去访问代理服务器,然后代理服务器再取访问真实服务器,在真实服务器上,只能显示代理服务器的ip地址,而不显示客户端的ip地址,如果想让客户端的ip地址也能在真实服务端看见,这一技术叫做IP透传 

$http_x_forwarded_for:这个变量我们要赋值给它,并且会一直保留,每次都会追加

可以在主配置文件里面的日志文件里面看见这一选项

 

   

   #proxy_set_header X-Real-IP $remote_addr;                   #只添加客户端IP到请求报文头部,转发至后端服务器proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反向代理服务器IP到请求报文头部

 如果有一个代理服务器,可以写第一个

如果有多个代理服务器,则下面的

如果既想看见客户端ip又想看见代理服务器 就添加第二行

在真实服务端的日制中查看,是看不见客户端或者代理服务器端的ip的

如果想看见真实访问的ip地址,就是客户端跟代理服务端的ip时 看以下操作

单机IP透传

在代理服务端(7-1) (nginx系统)

在子配置文件里面配置内容  X-Forwarded-For 这是一个变量

 

7-2真实服务器上(httpd系统)

 用set list 可以查看时在196行(set nu可以看到多少行),然后进行添加 (只需要将次变量加入即可)

 X-Forwarded-For 

 

然后重启

然后再用另外一台客户端(7-3)去curl192.168.68.3的代理服务器

此时 再去7-2查看日志

 

 多机IP透传 (把所有机器换成nginx,都是nginx系统)

在每个代理服务器上面都要设置:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反向代理服务器IP到请求报文头部

在nginx中,变量 X-Forwarded-For已经写好了,都写在日志文件中了 只需要在每个代理服务端的配置文件中写入proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for即可

 代理服务器1:192.168.68.3

代理服务器2:192.168.68.4

真实服务器:192.168.68.5

(访问代理服务器1 就跳转到代理服务器2      访问代理服务2  就跳转到真是服务器)

代理服务器1配置:

代理服务器二配置:

 

随后,重载

 

 然后代理服务器1 curl自己会出现 7-3 因为跳转到真是服务器上了

 最后,在真是服务器上面查看日志,会出现代理ip 跟客户端ip

http反向代理负载均衡 upstream

 

upstream 在http模块里面

 代理服务器:192.168.68.3

真实服务器1:192.168.68.4

真是服务器2::192.168.68.5

代理服务器 :

修改主配置文件

加入服务器组

然后将子配置文件注释掉,如果不注释,不能进行下面的location操作

 

随后,在location里面修改

 

随后保存并退出

 

 真是服务器1:

真实服务器2

 

 随后,在代理服务器服务器上curl

一会7-2 一会7-3

以上为轮询算法(nginx默认),一人一次的意思

 nginx有检测机制,如果有一台服务器挂掉,nginx只会去访问正常的那一台 (健康性检查)

 

加权轮询 weight

 weight:5  意思为上面分5次 下面没写,默认一次

实例:

在代理服务器(192.168.68.3)上的主配置文件里面修改

随后,保存重载  然后在curl

可以看出192.168.68.4 出现3次 192.168.68.5出现一次

  

#server支持的parameters如下:
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number  #给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number  #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup  #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器 sorry server   自己不能转自己
down    #标记为down状态
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx

 

max_fails  表示链接次数,当检验计算机是否挂掉,max_fails=3 就表示尝试连接次计算机三次 ,如果不行就认为挂掉

fail_timeout :如果检测到计算机还活着,等个多少秒再上线

这篇关于nginx(三)实现反向代理客户端 IP透传的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/758517

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert