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

nginx可不可以做端口跳转?

  •  
  •   dhq314 ·
    dhq314 · 2013-01-15 22:09:00 +08:00 · 12826 次点击
    这是一个创建于 4111 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如访问 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的重定向,就是把地址上的端口名隐藏掉
    goxofy
        6
    goxofy  
       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判断。
    dallaslu
        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   ·   我们的愿景   ·   实用小工具   ·   1051 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:15 · PVG 03:15 · LAX 12:15 · JFK 15:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.