作者回复: 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的直接下游服务器的地址(如果有的话)。
作者回复: 你说的没错,依次是由外向内的代理服务器依次由前至后在x-forward-for中添加IP,所以你需要指定可信IP,以取得较前的远端IP地址
作者回复: 呃,如果问题描述比较困难,可以发到下面这个论坛上,另外发问题的时候,问题中可以@一下我的帐号:https://www.nginx-cn.net/
作者回复: 正确!
作者回复: 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