系统相关
首页 > 系统相关> > nginx ngx_http_realip 的功能以及使用

nginx ngx_http_realip 的功能以及使用

作者:互联网

网上关于ngx_http_realip 使用介绍的基本都是一个老生长谈的问题了,对于多级代理配置的这个就是一个常用的解决用户真实ip的方法,以下是使用
的一个简单说明

ngx_http_realip 简单说明

ngx_http_realip 是一个获取用户请求真实ip 的一个模块,可以在多代理链路场景下解决我们获取真实ip 的问题

参考使用

 
set_real_ip_from  192.168.1.0/24;
set_real_ip_from  192.168.2.1;
set_real_ip_from  2001:0db8::/32;
real_ip_header    X-Forwarded-For;
real_ip_recursive on;

set_real_ip_from 定义可信ip,实际上就是会自动从请求头中去掉的,可以配置多个,同时可以支持ipv4,ipv6以及cidr 格式的
real_ip_header 制定我们获取真实ip 的的请求方式,包含了标准玩法的 X-Forwarded-For,X-Real-IP,proxy_protocol,当然也是可以自定义,此参数需要我们也
上级代理进行协商
请求header的,比如适合有特定需求的(cdn 比较多)
real_ip_recursive off 会将请求头的中最后一个ip 作为真实ip

处理的阶段

从上边可以看出来,是在post_read 阶段的,同时也在在pre_access阶段,所以如果我们使用了是access 处理的服务的(包含openresty),而且存在多级代理
配置此模块就比较重要了,而且ngx_http_realip 是优先与access的,所以我们就能处理真确的ip,保证我们基于access 阶段处理的基于ip 的防护策略是可以正常工作的

 
static ngx_int_t
ngx_http_realip_init(ngx_conf_t *cf)
{
    ngx_http_handler_pt        *h;
    ngx_http_core_main_conf_t  *cmcf;
 
    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
   // post_read 阶段
    h = ngx_array_push(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers);
    if (h == NULL) {
        return NGX_ERROR;
    }
 
    *h = ngx_http_realip_handler;
  // pre_access 阶段
    h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);
    if (h == NULL) {
        return NGX_ERROR;
    }
 
    *h = ngx_http_realip_handler;
 
    return NGX_OK;
}

说明

学习东西结合源码,了解内部工作机制会比较重要,对于我们排错以及工作使用会有很大的帮助

参考资料

https://nginx.org/en/docs/http/ngx_http_realip_module.html
https://nginx.org/en/docs/http/ngx_http_access_module.html

标签:real,http,ip,access,nginx,realip,ngx
来源: https://www.cnblogs.com/rongfengliang/p/16280390.html