一、展示真实的代理ip
一般情况下浏览器访问时是只显示客户端的访问地址,而服务器nginx转发到哪个地址我们是看不到的,这样就很难判断nginx代理是否生效。我们可以在nginx的配置文件上加上以下配置:
add_header backendIP $upstream_addr;
如下所示:
location /api {
add_header backendIP $upstream_addr;
proxy_pass http://localhost:8099;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
send_timeout 900;
}
在nginx安装目录下的sbin文件夹下执行以下命令,重新加载nginx配置文件
./nginx -s reload
这样在浏览器访问后,就可以在响应头里面看到转发的iP
下面这个配置可以显示nginx转发请求的状态码:
add_header backendCode $upstream_status;
二、nginx代理后的请求路径规律
目前Nginx主要是用作反向代理,但是最近在配置proxy_pass
的时候遇到过一些问题,实验后发现多种复杂的规则背后其实本质只有一条规则
重要规律
看了一些文章后,总结的规则
如果proxy_pass
后面没有任何URL路径信息(比如/
,/xxx
等),则反向代理的地址会包含location
中的匹配部分,否则只会拼接匹配后的剩余路径
PS: 上面是最重要且唯一的一条规则,请记住
多种情况验证
假设请求:http://localhost/online/wxapi/test/loginSwitch
第一种情况
proxy_pass
结尾有/
location /online/wxapi/ {
proxy_pass http://localhost:8080/;
proxy_set_header X-Real-IP $remote_addr;
}
代理后的实际地址:http://localhost:8080/test/loginSwitch
第二种情况
proxy_pass
最后没有/
location /online/wxapi/ {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
}
代理后的实际地址:http://localhost:8080/online/wxapi/test/loginSwitch
第三种情况
proxy_pass
最后有/web
location /online/wxapi/ {
proxy_pass http://localhost:8080/web;
proxy_set_header X-Real-IP $remote_addr;
}
代理后的实际地址:http://localhost:8080/webtest/loginSwitch
注意:因为是拼接剩余部分,所以路径中可能有单个词的拼接,比如
webtest
第四种情况
proxy_pass
最后有/web/
location /online/wxapi/ {
proxy_pass http://localhost:8080/web/;
proxy_set_header X-Real-IP $remote_addr;
}
代理后的实际地址:http://localhost:8080/web/test/loginSwitch
总结:ip+端口或者域名后面有/ ,location中匹配的路径肯定是不要的。然后location路径中最后的/要不要保留。根据实际情况。建议最后加上/,因为如果不加上/,匹配后的路径可能开头会存在/,最终导致可能会存在http://server//匹配
三、root和alias的区别
location ^~ /t/ {
root /www/root/html/;
}
如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。
location ^~ /t/ {
alias /www/root/html/new_t/;
}
如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件。注意这里是new_t,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
. alias只能位于location块中。(root可以不放在location中)