Skip to content

获取真实 IP 地址

nginx
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout 65 65;

    upstream httpds {
	    sticky;
        server 192.168.44.102;
        server 192.168.44.103;
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
            # 用户与 Nginx 建立连接,将用户的 IP 地址记录在 X-Forwarded-For 中
            # 上游服务器通过读取 X-Forwarded-For 获取用户 IP 地址
            # $remote_addr 是无法伪造的
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_pass http://httpds;

        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

如果有两台 Nginx 服务器,第二台直接 proxy_set_header X-Forwarded-For $remote_addr; 会将 $remote_addr 设为第一台服务器的地址,导致上游服务器无法获取用户 IP。

可以让第二台服务器保存第一台服务器的 X-Forwarded-For 的值。 也可以第二台服务器的 X-Forwarded-For 保存两个 IP 地址,上游服务器获取的第一个 IP 地址 就是用户的 IP 地址。