技术解析

Nginx 配置写法请教,根据路径转发到不同的服务器
0
2021-05-20 20:41:13
idczone

比如我访问 www.abc.com/aaa/,则转发到 http://aaa/

比如我访问 www.abc.com/bbb/,则转发到 http://bbb/

……

除了像这样一条一条写,还有啥别的办法吗?

        location /wechat_qyw/ {
            proxy_pass http://wechat_qyw/;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }

        location /wechat_qyw/ {
            proxy_pass http://wechat_qyw/;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarde国外服务器d-For $proxy_add_x_forwarded_for;

        }

        location /wechat_sd/ {
            proxy_pass http://wechat_sd/;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

写个模版生成呗

正则表达式先试试,不行就上 lua 脚本喽

rewrite /wechat_(.*)$ http://wechat_$1 break;

rewrite 会返回 302 吧,wechat_XX 是内部域名,客户端访问不到的,一定需要 nginx 反代

location ~ \/(wechat_.*)\/ { proxy_pass http://$1/; } 这样?

有定数可以用 map 或 regexp
无定数可以用 regexp

我也有这个疑问,不定数的,怎么写 regexp ?

rewrite 返回 302 是什么鬼啊

rewrite 是重定向吧,这个场景需要的是路由

rewrite 不是重定向,建议自己试一下

我试了,会重定向
rewrite /wechat_(.*)$ http://wechat_$1 break;
浏览器会直接跳转到 http://wechat_xxx,然后就失败了

rewrite 到不同域名会返回 302

关注一下

那我是怎么用 Nginx 反代 Google 的?

subs_filter,请

灰常感谢
按自己需求稍改了下:
location ~ ^\/(wechat_.*)\/ {
proxy_pass http://$1/;
}
测试结果:
2018/01/16 09:37:39 [error] 7637*15 no resolver defined to resolve wechat_fafa, client: 121.35.***.***, server: sz.sangfor.site, request: "GET /wechat_fafa/awefaews HTTP/1.1", host: "*******"
2018/01/16 09:38:01 [error] 7637*15 no resolver defined to resolve wechat_fafa, client: 121.35.***.***, server: sz.sangfor.site, request: "GET /wechat_fafa/awefaews HTTP/1.1", host: "*******"

卧槽,码没打全……


参看这个: https://stackoverflow.com/questions/13706658/variable-capture-in-nginx-location-matching
只要 regex 规则写对了就行,如果有例外,写在这个 location 之前。


试了一下,出现了 15 楼一样的错误信息。

我也出现了你 15 楼的错误。你搞定了吗?


一般用 proxy_pass 要同时定义一个 resolver,如:
resolver 8.8.8.8;
国内酌情考虑境内 DNS 的 IP。

我也想加 resolver,但是我是 docker,其实后端是不同的 docker,所以其实是机器名。而且没有 dns 服务器。我试了用 resolver 127.0.0.1 会提示无法连接 127.0.0.1:53。


你的意思是这个 proxy_pass 都是不同的内部 docker container ?
docker compose 有相关的内部网络配置的

对,我一个个写死没问题的。改正则就不行了。

嗯,我也是 docker 环境,测试没问题,放到生产就炸了

15 楼那个错误对我来说是正常的,因为我环境里没那几个域名,瞎写的,解析不出来就对了


你看看这个:)
https://stackoverflow.com/questions/28028789/nginx-proxy-pass-to-a-linked-docker-container


resolver 127.0.0.11;
看下面的回答,是 11 而不是 1
写死的话能解决,但是可能会有问题
建议还是写个脚本去解析 /etc/resolv.conf
https://stackoverflow.com/questions/35744650/docker-network-nginx-resolver#comment68472082_37656784

多谢,今天再试试看。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服