1. 程式人生 > >【Nginx】Nginx多級代理,獲取客戶端真實請求IP以及每級代理IP

【Nginx】Nginx多級代理,獲取客戶端真實請求IP以及每級代理IP

Nginx多級代理,獲取客戶端真實請求IP以及每級代理IP

如圖所示,每一級nginx裡的location配置裡需要加上對應的配置,最後一級nginx是直接到應用,測試時為了方便,直接用echo模組去測試,列印IP地址。

原理分析:

只有客戶端直接請求到的那個nginx能夠拿到客戶端的真實IP,所以第一級nginx配置了

proxy_set_header X-Real-IP $remote_addr;

這個配置就會將客戶端IP放到http的header裡,這樣到最後的應用裡可以通過request.getHeader去拿到客戶端真實IP了

public String getRemoteIp() {
        String ip = request.getHeader("X-Forwarded-For");
        if (isEffective(ip) && ip.indexOf(",") > -1) {
            String[] array = ip.split(",");
            for (String str : array) {
                if (isEffective(str)) {
                    ip = str;
                    break;
                }
            }
        }
        if (!isEffective(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (!isEffective(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (!isEffective(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (!isEffective(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (!isEffective(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
 
    private boolean isEffective(String remoteAddr) {
        if ((null != remoteAddr) && (!"".equals(remoteAddr.trim()))
                && (!"unknown".equalsIgnoreCase(remoteAddr.trim()))) {
            return true;
        }
        return false;
    }
如何拿到使用者從請求源頭到應用所經過的各個代理IP呢?
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
通過如上配置,將每級代理IP與$remote_addr用逗號分隔開

所以從上述情況來看,整體的流程很清晰了:

客戶端請求(172.23.11.251) -->172.23.26.130-->172.23.26.132-->172.23.26.133-->172.23.30.100(具體應用)

但是我們發現上面IP貌似列印少了一個133的地址,我們在100上修改下echo測試

這裡打印出了133的地址

nginx的安裝包裡有一個http_realip_module模組,在編譯的時候可以編譯此模組

./configure --prefix=/home/nginx/install --with-pcre=../pcre-8.36 --with-zlib=../zlib-1.2.8 --with-openssl=../openssl-1.0.2 --add-module=/root/nginx/echo-nginx-module-0.60 --with-http_realip_module && make && make install

新的配置如下:

set_real_ip_from   172.23.0.0/16;     IP段,指定接收來自哪個前端傳送的 IP head 可以是單個IP或者IP段
set_real_ip_from   192.168.1.1;     單個IP
real_ip_header     X-Real-IP;         IP head  的對應引數,預設即可,含義是客戶端真實IP從哪個頭取?

real_ip_recursive on;  是否遞迴解析real