upstream example {
server 172.0.0.1:3000;
server 172.0.0.2:3000;
}
server {
listen 3000;
server_name _;
location / {
proxy_pass http://example;
proxy_ssl_verify off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
对于上面这个配置,我理解的是,假如客户端请求的是 http://ip:3000/path?a=1&b=2
, nginx 会根据 example 这个 upstream 选择一个后端服务器转发请求,比如 http://172.0.0.1:3000/path?a=1&b=2
但是我在工作中有碰到过如下配置:
location ~ ^/api/(.*) {
proxy_set_header Host $http_host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://172.0.0.3:31081/$1$is_args$args;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
在这个配置中,proxy_pass 指令后面有 $is_args 、$args 这些参数。如果不加参数,客户端请求 url 上的参数就无法转发到 172.0.0.3 服务器上
我想要的是要把客户端请求 url 中的参数转发到后端,我的疑惑是什么时候 proxy_pass 指令后面需要加 $is_args 、$args 这些参数
1
hankai17 2023-08-09 07:31:20 +08:00
可能跟 upstream 模块有关
|
2
GTim 2023-08-09 08:05:46 +08:00
看 172.0.0.3:31081 这台的 nginx 日志
|
3
privil 2023-08-09 08:29:27 +08:00
(.*) 这个参数在上下文里面不匹配 url 上的参数吧,话说用了那么多年 Nginx ,我也是第一次见第二种写法。直接去掉正则也可以吧。
location ~ ^/api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://172.0.0.3:31081/; proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; } |
4
crystom 2023-08-09 09:08:48 +08:00
很可能跟末尾有没有斜杠有关系
|
5
dzdh 2023-08-09 09:10:21 +08:00
proxy_pass 到 127.0.0.1:xx 然后看日志
|
6
xiangyuecn 2023-08-09 09:45:21 +08:00
按道理,第二种才是正常写法。
第一种写多了,只会误导人,来个高级一点的就不会写了。 |
7
wu00 2023-08-09 09:58:44 +08:00
@privil 应该做了一层 path strip 吧? /api/xxx => /xxx , 你这个/api/前缀带到服务层就 404 了
|
8
privil 2023-08-09 13:37:26 +08:00
@wu00 #7 你可以试试我这种写法会不会带过去。我看漏了中间一堆他自己的理解,啥理解,多个 upsteam 是有个默认算法的请求的。脑补严重。
|
9
jifengg 2023-08-09 13:51:32 +08:00
以我有限的 nginx 经验,楼主的第二个配置
location ~ ^/api/(.*) { proxy_pass http://172.0.0.3:31081/$1$is_args$args; } 的目的,是把类似 http://host/api/your/path?key=value 转发到 http://172.0.0.3:31081/your/path?key=value 是把“/api”这层 path 换成“/”,应该是 172.0.0.3:31081 的 api (?)服务不需要加 “/api”前缀。 $1 就是 location 正则里面的 第一个 group ,$is_args 是表示是否有 searchPath ,值是"?"或空,$args 则表示 key=value&a=b 这整个 get 参数。 有个简化的版本可以参考(也是达到“转发时去掉 url 中的/api 的目的”): location /api { proxy_pass http://172.0.0.3:31081/; #注意这里最后的/不能省 } |
10
21231sv OP @xiangyuecn #6 为什么这么说?我看官网上都是第一种写法
|