V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
axisray
V2EX  ›  NGINX

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

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

    比如我访问 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   ·   实用小工具   ·   1251 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:18 · PVG 02:18 · LAX 10:18 · JFK 13:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.