多层代理后真实IP就没了,日志IP都是不对的,需要获取真实IP
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
其含义就是在反代时,在客户端发起的请求报文上添加 X-Real-IP
和 X-Forwarded-For
两个 HTTP 头。X-Real-IP
表示表观客户端地址,X-Forwarded-For
,顾名思义,就是“为谁代理”的意思,这个可以用来嵌套式传输客户端真实地址。
被代理的服务,只要能正确解析这两个头,就能获得客户端真实地址。
在最外层Nginx(即直接对外提供服务的Nginx)使用$remote_addr代替上面的$proxy_add_x_forwarded_for,可以防止伪造X-Forwarded-For。$proxy_add_x_forwarded_for会在原有X-Forwarded-For上追加IP,这就相当于给了伪造X-Forwarded-For的机会。而$remote_addr是获取的是直接TCP连接的客户端IP,这个是无法伪造的,即使客户端伪造也会被覆盖掉,而不是追加。
需要注意的是,如果有多层代理,只在直接对外访问的Nginx上配置X-Forwarded-For为$remote_addr,内层的Nginx还是要配置为$proxy_add_x_forwarded_for,不然内层的Nginx又会覆盖掉客户端的真实IP。