1. realip 模块:
realip模块 可以帮助我们获取真实的用户IP地址,这为后面的限速、限流等功能提供了可能性。
2. Nginx如何拿到浏览器客户端的真实IP地址?
其实从TCP连接的四元组中是可以拿到对端的IP地址和端口号的,但是问题在于,真实的网络中存在大量的反向代理和一些网络设备如交换机、路由器,所以与Nginx直接通过TCP进行连接的客户端往往并不是浏览器客户端,而是类似CDN等的设备。
为了将浏览器客户端的IP地址传递给Nginx服务器,HTTP头部中提供了 X-Forwarded-For
和 X-Real_IP
这两个变量用于传递IP,二者的区别在于 X-Real-IP只能存储一个,而 X-Forwarded-For 可以存储多个。
3. 拿到真实用户IP后如何使用?
基于变量!!!!
realip模块 会用 HTTP头部中的 X-Forwarded-For 和 X-Real-IP 的值 去覆盖 变量 binary_remote_addr
和 remote_addr
的值(在被 realip模块 处理之前,这两个变量存储的值是直接与Nginx连接的客户端的地址),
所以这也是为什么 limit_conn
模块一定要在 PREACCESS 阶段,而不能在 POST_READ 阶段 的原因,因为只有对真实的客户端IP 做连接限制 才有意义。
4. 关于 realip 模块:
- realip模块 默认不会编译进Nginx,需要通过
--with-http_realip_module
启用功能;(所以必须通过下载Nginx源代码的方式,yum安装是无法实现的) - realip模块 提供了另外两个变量:
realip_remote_addr
和realip_remote_port
,用以获取直接与Nginx相连接的客户端的IP和端口号;(原本的 remote_addr 和 remote_port 中的值已被真实浏览器客户端的值覆盖) - realip模块提供了三个指令:
set_real_ip_from address | CIDR | unix;
# 用于设置realip模块 对于哪些TCP连接的source ip,才会去做替换remote_addr
# 一般把它设置成与Nginx直接相连的客户端的IP地址,只有通过它转发过来的HTTP请求才会被realip解析出真正的客户端地址
# 指令参数的类型有多种,可以是 address、CIDR、unix 任一种
real_ip_header field | X-Real-IP | X-Forwarded-For | proxy_protocol;
# 用于设置realip模块 要从哪个字段中去取真实客户端的地址,包括 field、X-Real-IP、X-Forwarded-For、proxy_protocol
# 默认为 X-Real-IP
# 如果是从 X-Forwarded-For 中取真实客户端的地址,因为其中有多个IP地址,会取最后一个IP地址
real_ip_recursive on | off;
# 环回地址
# 默认关闭
- realip模块的核心功能:修改客户端地址。