Nginx 核心知识 150 讲
陶辉
智链达 CTO,前阿里云 P8 高级技术专家
61678 人已学习
新⼈⾸单¥98
课程目录
已完结/共 155 讲
第三章:详解HTTP模块 (40讲)
第四章:反向代理与负载均衡 (38讲)
Nginx 核心知识 150 讲
登录|注册
留言
31
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 50 | postread阶段:获取真实客户端地址的realip模块
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程综述
02 | Nginx适用于哪些场景?
03 | Nginx出现的历史背景
04 | 为什么用Nginx:它的 5 个主要优点
05 | Nginx的四个主要组成部分
06 | Nginx的版本发布历史
07 | 选择哪一个Nginx发行版本?
08 | 编译出适合自己的Nginx
09 | Nginx配置文件的通用语法介绍
10 | Nginx命令行及演示:重载、热部署、日志切割
11 | 用Nginx搭建一个可用的静态资源Web服务器
12 | 用Nginx搭建一个具备缓存功能的反向代理服务
13 | 用GoAccess实现可视化并实时监控access日志
14 | 从网络原理来看SSL安全协议
15 | 对称加密与非对称加密各自的应用场景
16 | SSL证书的公信力是如何保证的?
17 | SSL协议握手时Nginx的性能瓶颈在哪里?
18 | 用免费SSL证书实现一个HTTPS站点
19 | 基于OpenResty用Lua语言实现简单服务
20 | Nginx的请求处理流程
21 | Nginx的进程结构
22 | Nginx的进程结构实例演示
23 | 使用信号管理Nginx的父子进程
24 | reload重载配置文件的真相
25 | 热升级的完整流程
26 | 优雅地关闭worker进程
27 | 网络收发与Nginx事件间的对应关系
28 | Nginx网络事件实例演示
29 | Nginx的事件驱动模型
30 | epoll的优劣及原理
31 | Nginx的请求切换
32 | 同步&异步、阻塞&非阻塞之间的区别
33 | Nginx的模块究竟是什么?
34 | Nginx模块的分类
35 | Nginx如何通过连接池处理网络请求
36 | 内存池对性能的影响
37 | 所有worker进程协同工作的关键:共享内存
38 | 用好共享内存的工具:Slab管理器
39 | 哈希表的max_size与bucket_size如何配置
40 | Nginx中最常用的容器:红黑树
41 | 使用动态模块来提升运维效率
42 | 第三章内容介绍
43 | 冲突的配置指令以谁为准?
44 | Listen指令的用法
45 | 处理HTTP请求头部的流程
46 | Nginx中的正则表达式
47 | 如何找到处理请求的server指令块
48 | 详解HTTP请求的11个阶段
49 | 11个阶段的顺序处理
50 | postread阶段:获取真实客户端地址的realip模块
51 | rewrite阶段的rewrite模块:return指令
52 | rewrite阶段的rewrite模块:重写URL
53 | rewrite阶段的rewrite模块:条件判断
54 | find_config阶段:找到处理请求的location指令块
55 | preaccess阶段:对连接做限制的limit_conn模块
56 | preaccess阶段:对请求做限制的limit_req模块
57 | access阶段:对ip做限制的access模块
58 | access阶段:对用户名密码做限制的auth_basic模块
59 | access阶段:使用第三方做权限控制的auth_request模块
60 | access阶段的satisfy指令
61 | precontent阶段:按序访问资源的try_files模块
62 | 实时拷贝流量:precontent阶段的mirror模块
63 | content阶段:详解root和alias指令
64 | static模块提供的3个变量
65 | static模块对url不以斜杠结尾却访问目录的做法
66 | index和autoindex模块的用法
67 | 提升多个小文件性能的concat模块
68 | access日志的详细用法
69 | HTTP过滤模块的调用流程
70 | 用过滤模块更改响应中的字符串:sub模块
71 | 用过滤模块在http响应的前后添加内容:addition模块
72 | Nginx变量的运行原理
73 | HTTP框架提供的请求相关的变量
74 | HTTP框架提供的其他变量
75 | 使用变量防盗链的referer模块
76 | 使用变量实现防盗链功能实践:secure_link模块
77 | 为复杂的业务生成新的变量:map模块
78 | 通过变量指定少量用户实现AB测试:split_client模块
79 | 根据IP地址范围的匹配生成新变量:geo模块
80 | 使用变量获得用户的地理位置:geoip模块
81 | 对客户端使用keepalive提升连接效率
82 | 反向代理与负载均衡原理
83 | 负载均衡策略:round-robin
84 | 负载均衡哈希算法:ip_hash与hash模块
85 | 一致性哈希算法:hash模块
86 | 最少连接算法以及如何跨worker进程生效
87 | upstream模块提供的变量
88 | proxy模块处理请求的流程
89 | proxy模块中的proxy_pass指令
90 | 根据指令修改发往上游的请求
91 | 接收用户请求包体的方式
92 | 与上游服务建立连接
93 | 接收上游的响应
94 | 处理上游的响应头部
95 | 上游出现失败时的容错方案
96 | 对上游使用SSL连接
97 | 用好浏览器的缓存
98 | Nginx决策浏览器过期缓存是否有效
99 | 缓存的基本用法
100 | 对客户端请求的缓存处理流程
101 | 接收上游响应的缓存处理流程
102 | 如何减轻缓存失效时上游服务的压力
103 | 及时清除缓存
104 | uwsgi、fastcgi、scgi指令的对照表
105 | memcached反向代理的用法
106 | 搭建websocket反向代理
107 | 用分片提升缓存效率
108 | open file cache提升系统性能
109 | HTTP/2协议介绍
110 | 搭建HTTP/2服务并推送资源
111 | gRPC反向代理
112 | stream四层反向代理的7个阶段及常用变量
113 | proxy protocol协议与realip模块
114 | 限并发连接、限IP、记日志
115 | stream四层反向代理处理SSL下游流量
116 | stream_preread模块取出SSL关键信息
117 | stream proxy四层反向代理的用法
118 | UDP反向代理
119 | 透传IP地址的3个方案
120 | 性能优化方法论
121 | 如何高效使用CPU
122 | 多核间的负载均衡
123 | 控制TCP三次握手参数
124 | 建立TCP连接的优化
125 | 滑动窗口与缓冲区
126 | 优化缓冲区与传输效率
127 | 慢启动与拥塞窗口
128 | TCP协议的keepalive功能
129 | 减少关闭连接时的time_wait端口数量
130 | lingering_close延迟关闭TCP连接
131 | 应用层协议的优化
132 | 磁盘IO的优化
133 | 减少磁盘读写次数
134 | 零拷贝与gzip_static模块
135 | 用tcmalloc优化内存分配
136 | 使用Google PerfTools分析Nginx
137 | 使用stub_status模块监控Nginx的状态
138 | 第三方模块源码的阅读
139 | Nginx的启动流程
140 | HTTP第三方模块的初始化
141 | if指令是邪恶的吗?
142 | 解读Nginx的核心转储文件
143 | 通过debug日志定位问题
144 | OpenResty概述
145 | OpenResty中的Nginx模块与Lua模块
146 | 如何在Nginx中嵌入Lua代码
147 | OpenResty中Lua与C代码交互的原理
148 | 获取、修改请求与响应的SDK
149 | 工具类型的SDK
150 | 同步且非阻塞的底层SDK:cosocket
151 | 基于协程的并发编程SDK
152 | 定时器及时间相关的SDK
153 | share.DICT基于共享内存的字典
154 | 子请求的使用方法
155 | 基于OpenResty的WAF防火墙&结课测试
本节摘要
登录 后留言

全部留言(31)

  • 最新
  • 精选
无菇朋友
老师您好,我执行curl http://gx.com:666/ -H "X-Forwarded-For: 167.156.88.199,127.0.0.1,1.1.1.1" 为什么$remote_addr变量是1.1.1.1,按照X-Forwarded-For: client_ip,proxy_ip1,proxy_ip2...的格式,期望的输出应该是167.156.88.199才对。 这是我的配置: 1 server { 2 listen 127.0.0.1:666; 3 server_name gx.com; 4 set_real_ip_from 127.0.0.1; 5 real_ip_header X-Forwarded-For; 6 real_ip_recursive off; 7 8 location / { 9 return 200 "Your Client Ip: $remote_addr, $realip_remote_addr\n"; 10 } 11 } 望老师解答,感谢。

作者回复: 你要这么配置: real_ip_recursive on; set_real_ip_from 1.1.1.1; set_real_ip_from 127.0.0.1; Nginx的设计思想就是这样,参见http://nginx.org/en/docs/http/ngx_http_realip_module.html,明确写着last address。Nginx做这种设定更多是从trust ip角度出发的。

2019-04-13
7
Rainman
陶老师好。用X-Real-IP来获取客户端IP不是最简单吗? 例子里用X-Forwarded-For 来获取有什么优点吗?

作者回复: X-Real-IP是Nginx独有的,不是RFC规范,所以与client间如何还有其他非Nginx软件实现的代理,将取不到X-Real-IP头部

2019-08-25
4
明明懂
通过以上的回答,在 X-Forward-For 的最左边才是真实用户的地址,右边都是代理地址,当我们把 real_ip_header 设置为 X-Forward-For 时,如果没有启用 环回地址 real_ip_recursive,我们取到的 $remote_addr 是 X-Forward-For 中最右边的 ip,无论是否设置了 set_real_ip_from;如果启用了环回地址 real_ip_recursive on,那么就获取最左边的 ip,也就是排除设置了 set_real_ip_from(可信地址外的)。老师,我的理解对吗

作者回复: 完全正确! 如果启用了环回地址,不一定是最左边的IP,而是从右边开始数,第一个非可信地址的IP

2019-11-07
3
初音未来
老师你好,还有一个问题,我们公司目前打算上kong,kong有个限流插件,是根据X-Forwarded-For判断IP,我们公司架构是CDN-->KONG-->后端真实服务,这显然是获取不到用户真实IP的,所以我使用real_ip_header X-Forwarded-For; real_ip_recursive on; set_real_ip_from 一堆CDN IP; 获取到了用户真实IP,但是如果再有一层代理(不知道代理IP),或者,边缘CDN没有请求的资源,向上一级CDN请求,该如何获取用户真实IP呢

作者回复: 这样的话,realip模块做不到,因为它基于trust ip address设计的,你可以直接用http_X-Forwarded-For变量取到所有的值,再做字符串处理,取第一个IP

2019-05-23
3
风行传说
你好,老师,这一部分我有几个问题一直不是很理解,希望您能给解答一下: 1、例如 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 作用是将$proxy_add_x_forwarded_for的值赋值给前面的变量 X-Forwarded-For 吗? 那变量X-Forwarded-For名称是否可以随意进行定义?该变量的用处是什么,因为nginx的日志定义log_format中并未使用到X-Forwarded-For这个变量 2、如果是多层nginx代理,nginx01+nginx02 nginx02如何获取到客户端的真实ip地址 3、proxy_set_header中的定义,在log_format中并未应用到,各变量的作用在此次视频中也未讲解到

作者回复: 1、proxy_set_header是设置发向上游服务的请求头部的指令,第4部分课程会详细介绍。 X-Forwarded-For是RFC7239定义的头部,所有各大web服务都支持,你改了后就只能自己处理,不能依赖nginx之类的服务自动处理了。这一节课介绍的realip模块,也必须通过这个名称来修改remote_addr变量。 2、通过X-forwarded-for或者x-realip头部。 3、proxy反向代理在第4部分介绍。咱们课程后面内容还很多:-)

2018-12-12
3
猫王者
为什么视频里明明是取X-Forward-For最右边的ip,留言里也有两位同学已经指出这个问题了,老师取仍然坚持说是最左边呢?我测试后也发现取的是最右边的ip作为remote_add 的值。准确的说当real_ip_recursive 为on时,是从XFF最右边的ip开始遍历,找到第一个不等于所有set_real_ip_from的ip,将这个ip作为remote_addr的值;当real_ip_recursive为off时,取的是XFF最右边的那个ip。能给个解释吗

作者回复: 1、你说的对。 2、视频里要表达的意思是,最左边是客户端的真实地址,也是我们真正需要的地址,右边的是代理服务器地址。为了能够取到最左边地址,依赖于set_real_ip_from设置好可信代理地址。你可以参见无菇朋友的例子。

2019-08-13
2
2
thetruchar
6:52 说的是 从X-Forwarded-For最后一个ip取? 怎么前后矛盾的?

作者回复: 从后向前取,没错。你可以看下无菇朋友的留言,这个例子很有代表性

2019-10-06
3
1
初音未来
陶老师 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for 这个指令是什么意思呢?是把$proxy_add_x_forwarded_for的值赋值给X-Forwarded-For这个变量了吗?

作者回复: 不是,是传递X-Forwarded-For头部给上游,但这个头部的值是什么呢?就用proxy_add_x_forwarded_for变量的值吧。proxy_add_x_forwarded_for变量的值是什么呢?参考http://nginx.org/en/docs/http/ngx_http_proxy_module.html#variables

2019-05-09
2
1
Ignacio
real_ip_header到底是取X-Forwarded-For最右边的IP作为client真实IP,还是取XFF最左边的?看视频里面是取得最右边IP。但根据https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For的解释:X-Forwarded-For: <client>, <proxy1>, <proxy2>,最左边的才是真实IP吧?

作者回复: 是最左边,视频里也是最左边啊,第一页PPT里举的例子里,115.204.33.1就是最左边

2019-03-18
2
1
hcyycb
我有一点不明白:在 nginx 配置 realip 模块,为什么能够影响到 CDN 服务器或者代理服务器,将真实 ip 添加到请求头部信息中,并发送到最终的上游服务 nginx ? 我想到的解释就是:其实客户端的真实 ip 本来就已经存在于 它的请求连接中,无论有没有配置 realip 模块。 当配置了 realip 模块,只是让 nginx 能通过 X-Forwarded-For ,remote_addr 这些参数取出来而已。当没有配置 realip ,只是影响到 X-Forwarded-For ,remote_addr 这些参数的作用而已。 可以这样理解吗?

作者回复: nginx与下游间只要有反向代理,那么就无法从IP报文头部取出客户端地址了。通常,符合规范的反向代理会把客户端地方放在X-Forwarded-For头部中。所以,realip模块负责把这些头部中的值,替换掉remote_addr等变量的值

2019-02-03
2
1
收起评论