Nginx 配置写法请教,根据路径转发到不同的服务器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
axisray
V2EX    NGINX

Nginx 配置写法请教,根据路径转发到不同的服务器

  •  
  •   axisray 2018-01-16 00:51:49 +08:00 11092 次点击
    这是一个创建于 2827 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如我访问 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-Forwarded-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; 
    第 1 条附言    2018-01-16 09:42:19 +08:00

    @msg7086 灰常感谢 按自己需求稍改了下:

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

    测试结果:

    2018/01/16 09:37:39 [error] 7637#0: *15 no resolver defined to resolve wechat_fafa, client: 121.35.***.***, server: ******, request: "GET /wechat_fafa/awefaews HTTP/1.1", host: "*******" 2018/01/16 09:38:01 [error] 7637#0: *15 no resolver defined to resolve wechat_fafa, client: 121.35.***.***, server: ******, request: "GET /wechat_fafa/awefaews HTTP/1.1", host: "*******" 
    第 2 条附言    2018-01-20 23:47:42 +08:00

    上生产发现不行,怀疑是版本问题,改成下面这样

     location ~ ^\/(?<domain>wechat_.*)\/ { proxy_pass http://$domain/; } 

    访问 www.abc.com/bbb/,则转发到 http://bbb/,这种没有问题
    但是访问 www.abc.com/bbb/xxx 的时候有问题,报404错误

    第 3 条附言    2018-01-21 13:55:49 +08:00

    结帖,问题解决,感谢各位

     location ~ ^\/(?<domain>wechat_.*) { proxy_pass http://$domain; } 

    测试结果

    nginx_1 | 192.168.19.1 - - [21/Jan/2018:13:47:50 +0800] "GET /wechat_hubei/wxweb/signview HTTP/1.1" 200 56 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "-" wechat_hubei_1 | [Wx][21/01/18 13:48:00.838][INFO][SZWX.Controllers.WxWebController][SignView],Request URL:http://wechat_hubei/wxweb/signview 
    第 4 条附言    2018-01-21 14:44:47 +08:00

    UPDATE

     location ~ ^\/(?<domain>wechat_.*)\/$ { resolver 127.0.0.11; proxy_pass http://$domain; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } 
    27 条回复    2018-01-22 08:24:11 +08:00
    privil
        1
    privil  
       2018-01-16 01:03:55 +08:00 via iPhone
    写个模版生成呗
    h4lbhg1G
        2
    h4lbhg1G  
       2018-01-16 01:30:12 +08:00
    正则表达式先试试,不行就上 lua 脚本喽
    gleymonkey
        3
    gleymonkey  
       2018-01-16 01:35:01 +08:00
    rewrite /wechat_(.*)$ http://wechat_$1 break;
    axisray
        4
    axisray  
    OP
       2018-01-16 01:55:56 +08:00
    @gleymonkey rewrite 会返回 302 吧,wechat_XX 是内部域名,客户端访问不到的,一定需要 nginx 反代
    msg7086
        5
    msg7086  
       2018-01-16 04:42:48 +08:00   1
    location ~ \/(wechat_.*)\/ { proxy_pass http://$1/; } 这样?
    cxbig
        6
    cxbig  
       2018-01-16 05:23:59 +08:00
    有定数可以用 map 或 regexp
    无定数可以用 regexp
    paranoiagu
        7
    paranoiagu  
       2018-01-16 08:05:08 +08:00 via Android
    @cxbig 我也有这个疑问,不定数的,怎么写 regexp ?
    azh7138m
        8
    azh7138m  
       2018-01-16 08:17:18 +08:00 via Android
    @axisray rewrite 返回 302 是什么鬼啊
    axisray
        9
    axisray  
    OP
       2018-01-16 08:34:45 +08:00
    @azh7138m rewrite 是重定向吧,这个场景需要的是路由
    azh7138m
        10
    azh7138m  
       2018-01-16 08:36:00 +08:00 via Android
    @axisray rewrite 不是重定向,建议自己试一下
    axisray
        11
    axisray  
    OP
       2018-01-16 09:18:13 +08:00
    @azh7138m 我试了,会重定向
    rewrite /wechat_(.*)$ http://wechat_$1 break;
    浏览器会直接跳转到 http://wechat_xxx,然后就失败了
    lcdtyph
        12
    lcdtyph  
       2018-01-16 09:18:48 +08:00 via iPhone
    @azh7138m rewrite 到不同域名会返回 302
    v2orz
        13
    v2orz  
       2018-01-16 09:28:14 +08:00
    关注一下
    azh7138m
        14
    azh7138m  
       2018-01-16 09:39:16 +08:00
    @lcdtyph 那我是怎么用 Nginx 反代 Google 的?


    @axisray subs_filter,请
    axisray
        15
    axisray  
    OP
       2018-01-16 09:40:25 +08:00
    @msg7086 灰常感谢
    按自己需求稍改了下:
    location ~ ^\/(wechat_.*)\/ {
    proxy_pass http://$1/;
    }
    测试结果:
    2018/01/16 09:37:39 [error] 7637#0: *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#0: *15 no resolver defined to resolve wechat_fafa, client: 121.35.***.***, server: sz.sangfor.site, request: "GET /wechat_fafa/awefaews HTTP/1.1", host: "*******"
    axisray
        16
    axisray  
    OP
       2018-01-16 09:41:13 +08:00
    卧槽,码没打全……
    cxbig
        17
    cxbig  
       2018-01-16 16:43:25 +08:00   1
    @paranoiagu
    参看这个: https://stackoverflow.com/questions/13706658/variable-capture-in-nginx-location-matching
    只要 regex 规则写对了就行,如果有例外,写在这个 location 之前。
    paranoiagu
        18
    paranoiagu  
       2018-01-16 19:53:10 +08:00
    @cxbig
    试了一下,出现了 15 楼一样的错误信息。

    @axisray
    我也出现了你 15 楼的错误。你搞定了吗?
    cxbig
        19
    cxbig  
       2018-01-17 04:17:10 +08:00
    @paranoiagu
    一般用 proxy_pass 要同时定义一个 resolver,如:
    resolver 8.8.8.8;
    国内酌情考虑境内 DNS 的 IP。
    paranoiagu
        20
    paranoiagu  
       2018-01-17 08:19:42 +08:00 via Android
    @cxbig 我也想加 resolver,但是我是 docker,其实后端是不同的 docker,所以其实是机器名。而且没有 dns 服务器。我试了用 resolver 127.0.0.1 会提示无法连接 127.0.0.1:53。
    cxbig
        21
    cxbig  
       2018-01-18 03:21:18 +08:00
    @paranoiagu
    你的意思是这个 proxy_pass 都是不同的内部 docker container ?
    docker compose 有相关的内部网络配置的
    paranoiagu
        22
    paranoiagu  
       2018-01-18 08:25:03 +08:00 via Android
    @cxbig 对,我一个个写死没问题的。改正则就不行了。
    axisray
        23
    axisray  
    OP
       2018-01-20 23:27:54 +08:00
    @paranoiagu 嗯,我也是 docker 环境,测试没问题,放到生产就炸了
    axisray
        24
    axisray  
    OP
       2018-01-20 23:28:39 +08:00
    @paranoiagu 15 楼那个错误对我来说是正常的,因为我环境里没那几个域名,瞎写的,解析不出来就对了
    axisray
        25
    axisray  
    OP
       2018-01-21 14:10:56 +08:00
    axisray
        26
    axisray  
    OP
       2018-01-21 14:19:08 +08:00
    @paranoiagu
    resolver 127.0.0.11;
    看下面的回答,是 11 而不是 1
    写死的话能解决,但是可能会有问题

    建议还是写个脚本去解析 /etc/resolv.conf
    https://stackoverflow.com/questions/35744650/docker-network-nginx-resolver#comment68472082_37656784
    paranoiagu
        27
    paranoiagu  
       2018-01-22 08:24:11 +08:00 via Android
    @axisray 多谢,今天再试试看。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5889 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 03:20 PVG 11:20 LAX 20:20 JFK 23:20
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86