Nginx有多级代理时,获取用户的真实IP地址

在web服务器前面设置代理服务器时,从nginx模块中取$remote_addr值为上一级代理的IP地址,而非真实客户端的IP地址。为了获取真实客户端IP地址,可以使用nginx自带的realip模块。此模块可将真实客户端IP地址设置进HTTP请求头中,以便后端的web服务器获取。

下面是一级代理 nginx + nginx 时的设置步骤示例:

第一步:安装realip模块

在nginx的安装阶段中的./configure时,需要带上--with-http_realip_module,以将realip模块编译进nginx

第二步:配置nginx.conf

在代理服务器设置中添加proxy_set_header X-Real-IP $remote_addr; 如下:

location /.well-known/est/serverkeygen {
           proxy_pass http://127.0.0.1:61084;
           proxy_set_header   X-Real-IP   $remote_addr;
        }

在web服务器设置中添加 set_real_ip_from 127.0.0.1; 其中127.0.0.1是代理服务器地址,这里是本机地址。

        location /.well-known/est {
            set_real_ip_from  127.0.0.1;
            est;
        }
第三步 在nginx模块中获取IP地址
    ngx_int_t   key;
    ngx_http_variable_value_t *remoteAddress = NULL;
    ngx_str_set(&var_name, "remote_addr");
    key = ngx_hash_key(var_name.data, var_name.len);
    remoteAddress = ngx_http_get_variable(r, &var_name, key);
    if (remoteAddress == NULL || remoteAddress->not_found == 1) {
        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
        return;
    }
    ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, "remote Addr(len:%d): %s", remoteAddress->len, remoteAddress->data);

// 怕什么真理无穷,进一步有进一步的欢喜.

你可能感兴趣的:(nginx)