nginx可不可以做端口跳转? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dhq314
V2EX    NGINX

nginx可不可以做端口跳转?

  •  
  •   dhq314
    dhq314 2013-01-15 22:09:00 +08:00 13567 次点击
    这是一个创建于 4656 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如访问 http://test:1234/ 会自动跳到 http://test/
    35 条回复    1970-01-01 08:00:00 +08:00
    lqs
        1
    lqs  
       2013-01-15 22:17:21 +08:00
    listen 1234,然后 rewrite .* http://test/
    plprapper
        2
    plprapper  
       2013-01-15 22:22:52 +08:00
    反向代理的功能 就是这样的吧

    listen 1234

    location / {
    proxy_pass http://127.0.0.1/;

    搜搜这个东西 应该是你需要的
    CosWind
        3
    CosWind  
       2013-01-15 22:35:09 +08:00 via Android
    @plprapper 人家说的是nodejs,不是ngnix
    plprapper
        4
    plprapper  
       2013-01-15 23:04:18 +08:00
    @CosWind 额。。 题目不是 nginx吗
    dhq314
        5
    dhq314  
    OP
       2013-01-15 23:09:52 +08:00
    @plprapper @lqs
    不能用nginx监听1234端口,不然我另外要作反向代理的那个服务进程启动不来了


    @CosWind
    不是说nodejs,不过也可以说成是一个监听1234端口的nodejs的服务,在浏览器访问http://test:1234/可以打开一个网页,我想问的是nginx能不能这样配置,在浏览器上输入http://test:1234/,浏览器那边会跳到http://test/,类似做个302的重定向,就是把地址上的端口名隐藏掉
    G0dBlessMe
        6
    G0dBlessMe  
       2013-01-15 23:26:06 +08:00 via iPhone
    这个和强制SSL是一样的啊,Google下nginx强制SSL,把80强制转到443
    dhq314
        7
    dhq314  
    OP
       2013-01-16 00:32:06 +08:00
    @goxofy
    不一样,SSL的443端口还是nginx在监听,我这里的1234端口是别的服务程序在监听着...我发现nginx应该是做不了这个端口跳转了?
    xiaop
        8
    xiaop  
       2013-01-16 03:20:35 +08:00 via Android
    谁污染谁治理,谁监听谁跳转
    dhq314
        9
    dhq314  
    OP
       2013-01-16 10:24:14 +08:00
    @xiaop
    就是1234端口跳到80端口,不过nginx不能监听1234端口
    zhangxiao
        10
    zhangxiao  
       2013-01-16 16:57:41 +08:00
    @dhq312 那你总得有个监听1234的东西吧...
    dhq314
        11
    dhq314  
    OP
       2013-01-16 18:26:17 +08:00
    @zhangxia0
    上面说过了有其他服务程序在监听...
    CosWind
        12
    CosWind  
       2013-01-16 19:54:14 +08:00
    @plprapper
    @dhq314
    眼花了...
    BOYPT
        13
    BOYPT  
       2013-01-16 22:51:06 +08:00
    。。不监听又想能跳转,真是奇葩,要么该你原来监听1234的那个程序的代码实现跳转,要么在更层网络,比如iptables把数据包转到用户态,判断需要跳转直接返回掉。反正你不让nginx监听的话没他什么事情。
    wwqgtxx
        14
    wwqgtxx  
       2013-01-16 23:05:05 +08:00 via Android   1
    listen 80

    location / {
    proxy_pass http://127.0.0.1:1234/;

    nginx只能这样配置了,剩下的配置iptables吧
    xiaop
        15
    xiaop  
       2013-01-18 22:53:55 +08:00 via Android
    楼主的需求,是不是开了1234端口又不想让别人访问到?
    dhq314
        16
    dhq314  
    OP
       2013-01-19 16:07:41 +08:00
    @xiaop 可以访问,不过是想1234端口不显示出来
    phuslu
        17
    phuslu  
       2013-01-19 16:12:37 +08:00 via iPhone
    楼主你这需求太奇葩+1
    太固执了。。。
    dhq314
        18
    dhq314  
    OP
       2013-01-19 18:05:42 +08:00   1
    看到有信息提示,我还以为是有什么好的想法...

    其实这个问题我已经不纠结,能实现就最好,不能实现我也知道是什么问题了,至于固不固执由人去说。

    回复能关注在问题上就最好,回复些感叹的也可以,虽然这个问题是不需要这些。

    不过,有好的想法是欢迎回复的。
    xingis
        19
    xingis  
       2013-01-19 18:31:17 +08:00
    你是这样的意思吗,你是想让人家直接打开http://test/的时候,访问你服务器的1234端口!是这样吗!
    keakon
        20
    keakon  
       2013-01-19 22:05:35 +08:00
    确认下需求。

    访问1234端口时,如果是HTTP请求,就让浏览器重定向到80端口;否则让监听1234端口的nodejs进程来处理。

    处理办法:
    1. 让这个nodejs进程自己判断请求。
    2. 让nodejs监听127.0.0.1:1234,自己写个服务x监听外部ip:1234,设置允许socket重用端口,然后交给x判断。
        21
    dallaslu  
       2013-01-27 02:11:31 +08:00
    让nodejs监听127.0.0.1:1234

    Nginx:

    server{
    listen 外部ip:1234;
    rewrite ^(.*) http://域名或IP$1 permanent;
    }
    server{
    listen 80;
    location / {
    proxy_pass http://127.0.0.1:1234/;
    }
    }
    eric_zyh
        22
    eric_zyh  
       2013-01-27 15:54:34 +08:00 via iPhone
    nodejs开1234端口'nginx80端口
    验证是合法html请求就反向代理nginx
    不合法就其他处理
    BigZ
        23
    BigZ  
       2013-01-27 20:18:14 +08:00
    楼主,你是指 浏览器的地址跳转,还是指内容的跳转
    linchanx
        24
    linchanx  
       2013-01-28 15:17:42 +08:00
    这个需要路由器来做,把外网地址的80端口和内网地址的1234做静态映射就可以了,当然如果你没法控制到路由器就不知道了。。
    linchanx
        25
    linchanx  
       2013-01-28 15:32:16 +08:00
    @dhq314 具体到如果你是用cisco的设备
    ip nat inside source static tcp 内网地址 1234 外网地址 80
    这样在外网访问80端口时,路由器就转发到内网服务器的1234端口
    fanwei
        26
    fanwei  
       2013-01-28 15:55:32 +08:00
    楼主是这个意思吧!
    nodejs服务开了多个进程,监听了8001,8002,8003。。。。。。
    然后,nginx监听的80端口,负载到了8001,8002,8003上面

    现在只希望别人访问80端口有回应。如果别人访问8001,8002端口就跳转到80端口
    如果是这样,那就很简单了,只需要给nodejs监听的端口绑定个地址的
    只监听来至127.0.0.1的访问
    然后nginx,负载到127.0.0.1相应的端口
    isy
        27
    isy  
       2013-01-28 16:03:45 +08:00
    大家都把时间花在理解问题上面去了。。。楼主把问题描述清楚点多好。
    dhq314
        28
    dhq314  
    OP
       2013-01-30 15:24:45 +08:00
    @xingis 不是,刚好反过来
    @keakon 嗯,在nodejs进程里判断可以,不过不知道会不会有些复杂的url里也包含关键字1234,判断就写得麻烦了,方法是可行,不过现在我不纠结端口问题就不折腾了
    @dallaslu nginx绑定1234端口,我的nodejs服务就启动不来了
    @fanwei @eric_zyh 现在就是这样做的,nginx已经配置了反向代理
    @BigZ 地址跳转
    @linchanx 没控制路由的权限

    @isy 简单点说就是地址url跳转,url有“1234”字眼的就调到没“1234”字眼的url去,例如在浏览器地址栏上输入 http://test:1234/ ,按回车后浏览器上的地址栏会变成这样 http://test/
    dallaslu
        29
    dallaslu  
       2013-01-30 16:00:37 +08:00
    @dhq314 不。因为 IP 不同,可以监听1234。这样,只有对外提供 http://test:1234/ 的外网 IP 的 1234 端口归 nginx 管理。而你的 node.js 服务可以走其他 IP 的 1234 端口。
    dhq314
        30
    dhq314  
    OP
       2013-01-30 17:25:20 +08:00
    @dallaslu
    我的服务架是在linodes上,官方就分配了一个服务器IP给我,上面说的“外部IP”替换成我的服务器IP,再启动nigxi就报了“nginx: [emerg] bind() to 服务器IP:1234 failed (99: Cannot assign requested address)”的错,我知道这是我的服务监听了“1234”这个端口,所以nginx启动会报这个错。
    这里说的“外部IP”我有点模糊,是指我的服务器IP?不过我能知道的IP就这一个,如果指其他网关服务器之类的IP,这里我是不清楚了。
    dallaslu
        31
    dallaslu  
       2013-01-30 20:23:59 +08:00
    @dhq314 所以,请先让你的服务监听 127.0.0.1:1234
    dallaslu
        32
    dallaslu  
       2013-01-31 18:04:53 +08:00
    @dhq314 Linode 会给你分配一个外网 IP,还会分配给你内网 IP。

    以日本节点为例,106.187.xx.xx 就是我说的外部 IP。而你应该用 nginx 监听外部 IP 的 1234 端口,用 node.js 的相关服务监听 127.0.0.1 的 1234 端口,或 192.168.xx.xx (分配的内部IP)的 1234 端口。
    xiaop
        33
    xiaop  
       2013-01-31 18:10:31 +08:00
    @dallaslu 的思路确实不错,node.js监听内网IP:1234,nginx 监听外网ip:1234
    node.js的服务如果外网需要调用,只能用nginx反向代理来实现了。
    xiaop
        34
    xiaop  
       2013-01-31 18:42:41 +08:00
    @dhq314
    @xiaop 可以访问,不过是想1234端口不显示出来
    -------------------------------------------------

    才发现你写的这个需求,这个要求是不可能实现的。要不怎么叫“监听”呢?
    监听就意味着要开放这个端口。避免端口扫描,可以改个不常用的端口。
    loveminds
        35
    loveminds  
       2013-02-01 05:15:16 +08:00
    我想你的意思不过是设置一个到1234端口的反向代理吧
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1194 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 17:32 PVG 01:32 LAX 10:32 JFK 13:32
    Do have faith in what you're doing.
    ubao msn 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