编程日志 | nohup.net

实践是检验真理的唯一标准

nginx变量set反向代理proxy_bypass后端404找不到的坑

众所周知,如果配置nginx如下:

location /api/ {

     proxy_pass http://127.0.0.1:18080;

}

访问:

http://host:port/api/abc

那么:

反向代理背后的应用服务拿到的请求地址为:

http://127.0.0.1:18080/api/abc


如果配置nginx如下,即proxy_pass 末尾多个/:

location /api/ {

     proxy_pass http://127.0.0.1:18080/;

}

则访问:

http://host:port/api/abc

那么:

反向代理背后的应用服务的请求地址为:

http://127.0.0.1:18080/abc


于是乎,假如配置:

set $running "127.0.0.1:18080";

location /api/ {

     proxy_pass http://$running/;

}

期望背后服务器能拿到http://127.0.0.1:18080/abc

然而,并不行!!拿到的是http://127.0.0.1:18080/

直接到主页了,并没有把匹配的路径“拼接”过来,巨坑!

就因为用了个变量,跟传统认知竟然差这么多,调试半天才找到原因。

折腾来折腾去,最后发现可以这样玩:

location ~ /api/(.*) {

    proxy_pass http://$running/$1;

}

于是就达到目的了。

补充:

如果后端应用的接口本身就是带着/api/的,那么可以简化为:

location /api/ {

    proxy_pass http://$running/$request_uri;

}

即看起来更优雅一点。


这样折腾的配置有啥用?

这样就可以根据某些条件(比如客户端IP),动态设置$running的值,来做到灰度发布,平缓上线。


当然,也有其它方式,比如在http段里,即跟server平行的段里加入配置:

upstream running{

    反向代理配置,略

}

然后类似实现。

但是这种写法,一定要避免诸如running之类的变量名冲突!!

因为变量作用域提升了一级,其实最好是越低越好,这样不至于自己server内的问题,波及到server外部,造成“驴唇对着马嘴”的致命错误,尤其是多server配置分布在不同的文件中。

发表评论:

Powered By Z-BlogPHP 1.7.2

© 2013-2022 nohup.net , All Rights Reserved. 豫ICP备20020372号-1