$remote_addr

代表客户端IP。注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端。假设用户请求过程如下:

用户客户端--发送请求->Nginx1 --转发请求-->Nginx2->后端服务器

那么,默认情况下,针对Nginx1而言,$remote_addr为用户客户端IP,对Nginx2而言,$remote_addr则为Nginx1的IP。此时如果希望Nginx2也可以获取用户客户端IP,那要怎么处理呢?答案如下:

在Nginx1配置文件中使用proxy_set_header为转发请求设置请求头

proxy_set_header X-Real-IP $remote_addr; // X-Real-IP 为请求头名称,可自定义

然后,在Nginx2 配置文件中通过$http_x_real_ip来获取X-Real-IP请求头的值来获取真实客户端IP.

此时,如果要求“后端服务器”也要获取用户客户端IP,咋处理呢?做法和上述类似,在Nginx2配置文件中,使用proxy_set_header做同样的配置,即:

proxy_set_header X-Real-IP $remote_addr;

然后,“后端服务器”获取请求头“X-Real-IP”的值即为用户客户端IP。

很多HTTP代理会在HTTP协议头中添加X-Forwarded-For头,用来追踪请求的来源。X-Forwarded-For的格式如下:

X-Forwarded-For包含多个IP地址,每个值通过逗号+空格分开,最左边(client1)是最原始客户端的IP地址,中间如果有多层代理,每一层代理会将连接它的客户端IP追加在X-Forwarded-For右边。

$proxy_add_x_forwarded_for

代表附加$remote_addr变量的客户端请求头X-Forwarded-For ,其值如果包含多个地址,用逗号+空格分隔,标准格式如下:

X-Forwarded-For: clientIP, proxyIP1, proxyIP2 # 最左边的clientIp即为客户端真实IP

如果X-Forwarded-For字段没出现在客户端请求头,$proxy_add_x_forwarded_for 等同于$remote_addr 变量。

这里,假设用户请求过程和上文所述一样,如下:

用户客户端--发送请求->Nginx1 --转发请求-->Nginx2->后端服务器

假设,仅在Nginx1配置文件中进行了以下配置

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

那么,Nginx2配置的X-Forwarded-For请求头的值即为clientIP当然,这个结论的前提是,客户端IP没有配置X-Forwarded-For请求头,因为如上所述,客户端没有出现这个请求头时,$proxy_add_x_forwarded_for 的值即为$remote_addr 变量的值,否则,则是客户端为X-forwarded-for请求头的实际值

接着,假设Nginx2配置文件也进行以下配置

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

那么,“后端服务器”获取的X-Forwarded-For请求头的值将为clientIP, Nginx1IP。也就是说以上命令的执行是个叠加的过程(类似Python的列表的append方法的处理过程),可以简单理解为如果存在上级代理,执行以上命令时,会把上级代理IP追加到X-Forwarded-For请求头总,否则把客户端IP $remote_addr、或者客户端X-Forwarded-For请求头的值(如果有的话)追加到X-Forwarded-For请求头中。

参考连接:

https://nginx.org/en/docs/http/ngx_http_core_module.html#var_remote_addr

https://nginx.org/en/docs/http/ngx_http_proxy_module.html#var_proxy_add_x_forwarded_for

Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解的更多相关文章

  1. Nginx基础篇(2)- Nginx基本配置文件和变量详解

    Nginx基本配置文件和变量详解 1. 基本配置文件 /etc/nginx/nginx.conf # nginx运行的用户 user nginx; # nginx进程数,建议设置为等于CPU总核心数. ...

  2. mysql show variables系统变量详解

    mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...

  3. net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解

    asp.net core环境变量详解   环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...

  4. Maya 常用环境变量详解

    Maya 常用环境变量详解 前言: Maya 的环境变量让用户可以很方便的自定义 Maya 的功能. 在 Maya 的 Help 帮助文档中有专门的一个章节< Environment Varia ...

  5. Shell学习之Bash变量详解(二)

    Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...

  6. asp.net core环境变量详解

    环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境变量在其它文件里面,不多说了,有兴趣的 ...

  7. 4、Ubuntu系统环境变量详解

    参考:Linux公社Ubuntu系统环境变量详解 UNIX/Linux系统中的环境变量和库文件的使用方法 由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,因此我们需要了解 ...

  8. 如何查找YUM安装的JAVA_HOME环境变量详解

    如何查找YUM安装的JAVA_HOME环境变量详解  更新时间:2017年10月27日 09:44:56   作者:铁锚   我要评论 这篇文章主要给大家介绍了关于如何查找YUM安装的JAVA_HOM ...

  9. Python变量详解

    Python变量详解 目录 Python变量详解 一.变量的定义 二.变量组成的三部分 2.1 变量名 2.1.1 变量名的命名规范 2.1.2 变量名的命名风格 2.2 赋值符号 2.3 变量值 三 ...

  10. Ansible Facts 变量详解

    Ansible Facts 变量详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. ...

随机推荐

  1. Android 12(S) Binder(三)

    学以致用,这一节来native binder实战! android 12中的service用到的Bp.Bn文件多由aidl生成,所以实战中也用aidl来生成. 1.文件目录结构 文件目录结构如上,偷懒 ...

  2. nginx学习记录【一】在windows上的安装nginx的教程

    1.下载地址 http://nginx.org/en/download.html 2.选择windows版本 如下图: 3.解压并运行 解压到指定目录,如下图 打开cmd,然后cd到那个目录,如下图: ...

  3. Flutter TextField开始输入中文的时候,被打断导致错误输入字母问题

    一.Bug样例 建立一个web demo flutter run -d chrome --web-renderer html 出现问题: 输入中文的时候,比如打字 hao, 第一个字母h会先输入,变成 ...

  4. Python实现字符串模糊匹配

      在一个字符串中,有时需对其中某些内容进行模糊匹配以实现条件的判定,如在"你好,hello,world"中判断是否含有"llo".Python中通过re.se ...

  5. MySQL创建表的时候建立联合索引的方法

    1.MySQL创建表建立联合索引的步骤 在MySQL中,联合索引(也称为复合索引或多列索引)是基于表中的多个列创建的索引.这种索引可以提高多列查询的性能,特别是当查询条件涉及这些列时.下面是一个详细的 ...

  6. bpmnjs

    在 bpmn.js 中,`bpmnModeler.get()` 方法用于获取不同的模块,你可以通过这些模块来访问和操作 BPMN 模型的不同部分.以下是一些常用的模块和对应的用途: 1. **Canv ...

  7. 利用夜莺开源版对H3C无线设备监控

    编者荐语:真正搞监控的人肯定知道 SNMP 水有多深,有时我甚至腹黑猜测,这些厂商是故意的吧,,,指标不标准,格式各异,只能靠一款灵活的采集器了,本文是夜莺社区用户写的文章,转给大家参考. autho ...

  8. Json输出List集合对象和map对象 JSON格式

    Json输出List集合对象和map对象 JSON格式 //Json输出List集合对象 [{"属性1":["值1"],"属性2":&quo ...

  9. OpenCV + sklearnSVM 实现手写数字分割和识别

    这学期机器学习考核方式以大作业的形式进行考核,而且只能使用一些传统的机器学习算法. 综合再三,选择了自己比较熟悉的MNIST数据集以及OpenCV来完成手写数字的分割和识别作为大作业. 1. 数据集准 ...

  10. CUDA程序优化-1.基础介绍

    简介 本合集主要介绍我在开发分布式异构训练框架时的CUDA编程实践和性能优化的相关内容.主要包含以下几个部分: 介绍CUDA的基本概念和架构,帮助读者建立对CUDA的初步认识,包括硬件架构/CUDA基 ...