作者回复: 1、会互相影响,但不是覆盖。这个比较复杂,我解释下最复杂的场景:
a. 客户端是127.0.0.1
b. 请求携带X-Forwarded-For: 2.2.2.2头部
c. 请求携带X-Real-IP: 3.3.3.3头部
d. Nginx配置了realip模块,设置set_real_ip_from 127.0.0.1;,使用默认的X-Real-IP头部。
e. geo中配置的proxy 3.3.3.3;
那么,此时geo中产生的变量依据的IP地址是2.2.2.2。
原因是,realip模块修改了remote_addr变量,而proxy后使用的地址,也要使用修改后的remoete_addr变量。
2、找到进程id,然后用ls -l /proc/进程id/cwd找到启动路径,再判断
作者回复: 对的。可以指定多台服务器,可以使用子网掩码的方式指定一段IP地址,不能使用正则匹配。
作者回复: 在生产环境下,proxy不能随便写,通常必须是nginx的直接下游服务器的地址(如果有的话)。
作者回复: geo是你在使用geo变量的时候才有用。你在geo里配置了proxy 3.3.3.3,那么此时如果remote_addr已经被realip模块改成了3.3.3.3,那么geo此时认为匹配上了,它会自动的去取X-Forwarded-For里的IP作为geo键值对匹配中的键。
给你一段示例代码,你访问curl localhost:8060 -H 'X-Real-IP: 3.3.3.3' -H 'X-Forwarded-For: 2.2.2.2',返回的是remote_addr: 3.3.3.3,geo: 2。
geo $geo {
2.2.2.2 2;
3.3.3.3 3;
proxy 3.3.3.3;
}
server {
listen 8060;
set_real_ip_from 127.0.0.1;
real_ip_header X-Real-IP;
location /{
return 200 "remote_addr: $remote_addr,geo: $geo\n";
}
}
作者回复: 1、这个$address,其实是代指表示地址的变量,而不是明确指 address。所谓不输入$address,是指省略这个位置的参数。
2、关于如何修改remote_addr变量的值,参见第50课,在post_read阶段会改remote_addr变量指向的内存值,后续再使用到这块内存值时才会获得改变后的地址
作者回复: 因为geo里的key大都是网段,而网段非常有可能重合,这样delete可以其中一部分子网的映射规则去掉,改用其他匹配上的值。比如:
geo $geo_delete {
127.0.0.0/8 loopback;
0.0.0.0/0 world;
delete 127.0.0.0/8;
}
如果不加delete,那么本地访问是值为loopback,而加入delete后,就会匹配上0.0.0.0即default
作者回复: 是的